Home  >  Article  >  Database  >  JBossDataGrid的集群部署与访问

JBossDataGrid的集群部署与访问

PHP中文网
PHP中文网Original
2017-04-01 15:02:331561browse

集群部署 JDG的缓存模式包括本地(Local)模式和集群(Clustered)模式。本项目采用多节点的Clustered模式部署,数据在多个节点的子集间进行复制,而不是同步复制到所有的节点。使用子集复制可以提升容错的效率但对可伸缩性不会造成太大影响。在使用Clustere

集群部署

JDG的缓存模式包括本地(Local)模式和集群(Clustered)模式。本项目采用多节点的Clustered模式部署,数据在多个节点的子集间进行复制,而不是同步复制到所有的节点。使用子集复制可以提升容错的效率但对可伸缩性不会造成太大影响。在使用Clustered模式部署之前,应该配置JGroup。

1. 使用UDP方式广播。

l 适用于大的集群(超过100节点);

l 适用于Invalidation和Replication模式;

l 提高socket通信的效率。

2. 使用TCP方式广播。

更适合于distribution模式的小规模(少于100节点)的集群,这时因为TCP协议在点对点通信中更加高效。

Clustered模式又分为Invalidation、Replication和Distribution模式。

Distribution模式

JDG的Distribution模式可以存储缓存数据在集群的子集节点,而不是存储数据到每一个节点中。通常存储到多于1个节点来提供数据冗余和容错。

Distribution模式使用一致性Hash算法从集群中选择存储数据的节点,一致性Hash算法配置为一个缓存数据存储到多个副本。副本数的设置需要平衡性能和容错,过多的副本会影响性能而过少的副本会造成节点失效时丢失数据。

在Distribution模式中,一个put操作会执行num_copies次远程调用,同样在任意节点的get操作会执行至少一次的远程调用。实际上,get操作甚至也会执行num_copies次远程调用,但它们是并行的,只要有一个返回,结果就会被返回给调用者。

读一致性

由于get操作是并行从多个节点取数并使用第一个返回的结果,在使用异步方式时可能会导致数据的不一致。注意这种情况只会出现在异步调用方式,如果是同步方式,则不会出现读不一致。

配置缓存容器和缓存

JDG的Cache在使用时,必须在standalone/configuration/clustered.xml配置文件中设置要使用的Cache配置。如果客户端访问了未配置命名的Cache,将视为非法操作。

在cd9436c060c15c8f48d4fbcf8cd69ade …… 85a95edf6f4640562c01b2444c73bff3中配置cache-container和distributed-cache,本项目使用分布式缓存模式。

节点8c9ccfb56a3a600eeec16861a040c50b中增加对Cache的配置节点,如下面的名称为default的cache(默认缓存配置):

在<subsystemxmlns="urn:infinispan:server:core:5.2"default-cache-container="clustered"> 
…… </subsystem>中配置cache-container和distributed-cache,本项目使用分布式缓存模式。
节点<cache-containername="clustered" 
default-cache="default">中增加对Cache的配置节点,如下面的名称为default的cache(默认缓存配置):


#定义缓存默认的过期策略以上的配置项目并非所有的都是必须,各节点说明见下:

#lifespan: 缓存条目最大的生存时间,单位毫秒,-1表示从不过期。

# max-idle: 缓存条目的最大空闲时间,单位毫秒,-1表示从不过期。如果空闲时间超过该值,条目将被视为过期。

#interval: 从缓存中清除过期条目的执行间隔时间(毫秒)。如果要完全禁用定期回收任务,设置为-1。

#定义缓存默认的回收策略

#eviction: 指定回收策略。可用的回收策略包括UNORDERED,FIFO,LIRS和NONE(禁用回收策略)。

#max-entries: 指定Cache实例中的最大条目数量,-1表示不限制。实际取值为>=选定值的2的幂的最小值

#定义缓存锁

#isolation: 定义隔离级别。可用的隔离级别包括NONE,READ_UNCOMMITED,READ_COMMITED,REPEATABLE_READ,SERIALIZABLE,默认REPEATABLE_READ

#striping: 锁条带化。如果为true,使用共享锁池来维护所有需要锁定的条目。否则,为每个条目创建一个锁。锁条带化有助于控制内存占用,但可能会降低系统的并发能力。

#acquire-timeout: 尝试获取一个特定锁的最大超时时间。

#concurrency-level: 锁容器的并发级别。根据和infinispan并发交互的线程数量来调整这个值。

#concurrent-updates: 仅用于非事务缓存。如果设置为true(默认值),则缓存在并发更新时保持数据的一致性。对于集群模式将带来额外的RPC成本,如果你的应用不会并发写数据,禁用该标志以提升性能。

#定义缓存事务

#虽然可以定义服务器缓存支持事务,但目前没有可用的协议来支持事务能力。

启动JDG集群

可以把JDG部署在多个节点构成一个集群,目前我们的项目使用的是数据缓存服务使用默认3个节点的分布式集群。在启动时各个节点的nodeName必须予以区分,例如分别命名为nodeA、nodeB和nodeC。

JDG是运行在JBoss容器中的,在启动时即启动了JBoss,如果服务器已经运行了JBOSS,请在启动时设置端口offset,以避免冲突。

同时为了避免和JBoss服务器的JBOSS_HOME冲突,定义环境变量JDG_HOME(例如exportJDG_HOME=/usr/local/jboss-datagrid-server-6.1.0),并修改bin/clustered.sh中的所有JBOSS_HOME替换为JDG_HOME。

以nodeA节点为例(JDG对外访问的端口为11222,下面offset后为11322),服务器ip是192.168.1.100,执行启动命令为:

./clustered.sh-Djboss.socket.binding.port-offset=100 -Djboss.bind.address=192.168.1.100 -Djboss.node.name=nodeA

客户端访问

远程客户端可以使用REST, memcached或HotRod协议,我们这里使用HotRod协议,它是一种二进制协议,性能较好,同时它提供了自动的负载均衡和failover。

配置文件

客户端访问缓存服务端的配置文件默认命名为hotrod-client.properties。定义解释见下。

############JDG 服务器配置############
##请求均衡策略,default =org.infinispan.client.hotrod.impl.transport.tcp.RoundRobinBalancingStrategy
#infinispan.client.hotrod.request_balancing_strategy=
##服务器列表,default = 127.0.0.1:11222
infinispan.client.hotrod.server_list=192.168.1.100:11322;192.168.1.101:11322;192.168.1.102:11322
##是否强迫返回值, default = false
#infinispan.client.hotrod.force_return_values=
##TCP_NO_DELAY, default = true
#infinispan.client.hotrod.tcp_no_delay=
##启动时是否发送PING请求来获取CLUSTER拓扑, default = true
#infinispan.client.hotrod.ping_on_startup=
##控制使用的传输机制,目前只支持TCP, 
default =org.infinispan.client.hotrod.impl.transport.tcp.TcpTransportFactory
#infinispan.client.hotrod.transport_factory=
##序列化使用的Marshaller, default =org.infinispan.marshall.jboss.GenericJBossMarshaller
##如果要降低传输负载,可以配置为ApacheAvroMarshaller
#infinispan.client.hotrod.marshaller=
##指定自定义的AsyncExecutorFactory, 
default =org.infinispan.client.hotrod.impl.async.DefaultAsyncExecutorFactory
#infinispan.client.hotrod.async_executor_factory=
##指定并发线程池大小, default = 10
#infinispan.client.hotrod.default_executor_factory.pool_size=
##指定并发队列大小, default = 100000
#infinispan.client.hotrod.default_executor_factory.queue_size=
##Hash函数实现的版本及一致性Hash算法,和HotRod的服务器版本相关
#infinispan.client.hotrod.hash_function_impl.1=
##序列化和反序列化键的缓存允许字节数,目的是避免数组大小调整, default =64
#infinispan.client.hotrod.key_size_estimate=
##序列化和反序列化值的缓存允许字节数,目的是避免数组大小调整, default =512
#infinispan.client.hotrod.value_size_estimate=
##socket读超时, default = 60000 (60 seconds)
infinispan.client.hotrod.socket_timeout=50000
##socket连接超时, default = 60000 (60 seconds)
infinispan.client.hotrod.connect_timeout=10000
##指定客户端使用的协议版本, default = 1.1,其他值还有1.0
#infinispan.client.hotrod.protocol_version=
##指定错误时的重试次数, default = 10
#infinispan.client.hotrod.max_retries=
############连接池配置############
##指定每个服务器的最大连接数,负值表示没有限制,默认-1
maxActive=100
##指定服务器组内允许的全局持久连接的数量,负值表示没有限制,默认-1
maxTotal=100
##指定每个服务器空闲持久连接的最大数,负值表示没有限制,默认-1
maxIdle=20
##指定当连接池耗尽时,服务器如何响应:
##0-抛出异常给调用者
##1-阻塞调用者,直到有空闲的连接
##2-创建一个新的连接(不受maxActive的限制)
##默认值是1
#whenExhaustedAction=1
##检查空闲连接的Eviction线程每次运行间隔的时间,默认是2分钟
#timeBetweenEvictionRunsMillis=120000
##在空闲池中的连接存在多长时间需要被销毁,负值表示没有空闲连接被销毁,默认值为30分钟
#minEvictableIdleTimeMillis=1800000
##指定在Eviction线程执行时,空闲的连接是否通过发送一个TCP数据包到服务器来验证,
##即无法验证的连接将从池中被清除
##默认值为true
#testWhileIdle=true
##指定每个服务器最小的可用连接的空闲线程数。默认值为1
#minIdle=1

客户端访问代码

import java.net.URL;

import java.util.Map;

 

import org.infinispan.client.hotrod.RemoteCache;

import org.infinispan.client.hotrod.RemoteCacheManager;

import org.infinispan.client.hotrod.ServerStatistics;

 

 

public class Quickstart {

 

 public static void main(String[] args) {

 

  URL resource = Thread.currentThread().getContextClassLoader()

                                     
  .getResource("hotrod-client.properties");

  RemoteCacheManager cacheContainer = new RemoteCacheManager(resource, true);

 

  //获得一个远程的Cache

  RemoteCache cache = cacheContainer.getCache("myCache");

 

  //put数据到缓存中,然后确认是否存在

  cache.put("name", "paul");

  if(cache.get("name").equals("paul")){

   System.out.println("Cache Hit!");

  } else {

   System.out.println("Cache Miss!");

  }

 

  //删除缓存数据

  cache.remove("name");

 

  cacheContainer.stop();

 }

}

 以上就是JBossDataGrid的集群部署与访问的内容,更多相关内容请关注PHP中文网(www.php.cn)!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn