2.4. 集群模式

集群模式除了适用于Redis集群环境,也适用于任何云计算服务商提供的集群模式,例如AWS ElastiCache集群版Azure Redis Cache阿里云(Aliyun)的云数据库Redis版

程序化配置集群的用法:

  1. Config config = new Config();
  2. config.useClusterServers()
  3. .setScanInterval(2000) // 集群状态扫描间隔时间,单位是毫秒
  4. //可以用"rediss://"来启用SSL连接
  5. .addNodeAddress("redis://127.0.0.1:7000", "redis://127.0.0.1:7001")
  6. .addNodeAddress("redis://127.0.0.1:7002");
  7. RedissonClient redisson = Redisson.create(config);

2.4.1. 集群设置

介绍配置Redis集群组态的文档在这里。 Redis集群组态的最低要求是必须有三个主节点。Redisson的集群模式的使用方法如下:

ClusterServersConfig clusterConfig = config.useClusterServers();

ClusterServersConfig 类的设置参数如下:

nodeAddresses(添加节点地址)

可以通过host:port的格式来添加Redis集群节点的地址。多个节点可以一次性批量添加。

scanInterval(集群扫描间隔时间)

默认值: 1000

对Redis集群节点状态扫描的时间间隔。单位是毫秒。

slots(分片数量)

默认值: 231用于指定数据分片过程中的分片数量。支持数据分片/框架结构有:集(Set)映射(Map)BitSetBloom filter, Spring CacheHibernate Cache等.

readMode(读取操作的负载均衡模式)

默认值: SLAVE(只在从服务节点里读取)

注:在从服务节点里读取的数据说明已经至少有两个节点保存了该数据,确保了数据的高可用性。

设置读取操作选择节点的模式。可用值为:SLAVE - 只在从服务节点里读取。MASTER - 只在主服务节点里读取。MASTER_SLAVE - 在主从服务节点里都可以读取。

subscriptionMode(订阅操作的负载均衡模式)

默认值:SLAVE(只在从服务节点里订阅)

设置订阅操作选择节点的模式。可用值为:SLAVE - 只在从服务节点里订阅。MASTER - 只在主服务节点里订阅。

loadBalancer(负载均衡算法类的选择)

默认值: org.redisson.connection.balancer.RoundRobinLoadBalancer

在多Redis服务节点的环境里,可以选用以下几种负载均衡方式选择一个节点:org.redisson.connection.balancer.WeightedRoundRobinBalancer - 权重轮询调度算法org.redisson.connection.balancer.RoundRobinLoadBalancer - 轮询调度算法org.redisson.connection.balancer.RandomLoadBalancer - 随机调度算法

subscriptionConnectionMinimumIdleSize(从节点发布和订阅连接的最小空闲连接数)

默认值:1

多从节点的环境里,每个 从服务节点里用于发布和订阅连接的最小保持连接数(长连接)。Redisson内部经常通过发布和订阅来实现许多功能。长期保持一定数量的发布订阅连接是必须的。

subscriptionConnectionPoolSize(从节点发布和订阅连接池大小)

默认值:50

多从节点的环境里,每个 从服务节点里用于发布和订阅连接的连接池最大容量。连接池的连接数量自动弹性伸缩。

slaveConnectionMinimumIdleSize(从节点最小空闲连接数)

默认值:32

多从节点的环境里,每个 从服务节点里用于普通操作( 发布和订阅)的最小保持连接数(长连接)。长期保持一定数量的连接有利于提高瞬时读取反映速度。

slaveConnectionPoolSize(从节点连接池大小)

默认值:64

多从节点的环境里,每个 从服务节点里用于普通操作( 发布和订阅)连接的连接池最大容量。连接池的连接数量自动弹性伸缩。

masterConnectionMinimumIdleSize(主节点最小空闲连接数)

默认值:32

多节点的环境里,每个 主节点的最小保持连接数(长连接)。长期保持一定数量的连接有利于提高瞬时写入反应速度。

masterConnectionPoolSize(主节点连接池大小)

默认值:64

多主节点的环境里,每个 主节点的连接池最大容量。连接池的连接数量自动弹性伸缩。

idleConnectionTimeout(连接空闲超时,单位:毫秒)

默认值:10000

如果当前连接池里的连接数量超过了最小空闲连接数,而同时有连接空闲时间超过了该数值,那么这些连接将会自动被关闭,并从连接池里去掉。时间单位是毫秒。

connectTimeout(连接超时,单位:毫秒)

默认值:10000

同任何节点建立连接时的等待超时。时间单位是毫秒。

timeout(命令等待超时,单位:毫秒)

默认值:3000

等待节点回复命令的时间。该时间从命令发送成功时开始计时。

retryAttempts(命令失败重试次数)

默认值:3

如果尝试达到 retryAttempts(命令失败重试次数) 仍然不能将命令发送至某个指定的节点时,将抛出错误。如果尝试在此限制之内发送成功,则开始启用 timeout(命令等待超时) 计时。

retryInterval(命令重试发送时间间隔,单位:毫秒)

默认值:1500

在一条命令发送失败以后,等待重试发送的时间间隔。时间单位是毫秒。

reconnectionTimeout(重新连接时间间隔,单位:毫秒)

默认值:3000

当与某个节点的连接断开时,等待与其重新建立连接的时间间隔。时间单位是毫秒。

failedAttempts(执行失败最大次数)

默认值:3

在某个节点执行相同或不同命令时,连续 失败 failedAttempts(执行失败最大次数) 时,该节点将被从可用节点列表里清除,直到 reconnectionTimeout(重新连接时间间隔) 超时以后再次尝试。

password(密码)

默认值:null

用于节点身份验证的密码。

subscriptionsPerConnection(单个连接最大订阅数量)

默认值:5

每个连接的最大订阅数量。

clientName(客户端名称)

默认值:null

在Redis节点里显示的客户端名称。

sslEnableEndpointIdentification(启用SSL终端识别)

默认值:true

开启SSL终端识别能力。

sslProvider(SSL实现方式)

默认值:JDK

确定采用哪种方式(JDK或OPENSSL)来实现SSL连接。

sslTruststore(SSL信任证书库路径)

默认值:null

指定SSL信任证书库的路径。

sslTruststorePassword(SSL信任证书库密码)

默认值:null

指定SSL信任证书库的密码。

sslKeystore(SSL钥匙库路径)

默认值:null

指定SSL钥匙库的路径。

sslKeystorePassword(SSL钥匙库密码)

默认值:null

指定SSL钥匙库的密码。

2.4.2. 通过JSON、YAML和Spring XML文件配置集群模式

配置集群模式可以通过指定一个JSON格式的文件来实现。以下是JSON格式的配置文件样本。文件中的字段名称必须与ClusterServersConfigConfig对象里的字段名称相符。

  1. {
  2. "clusterServersConfig":{
  3. "idleConnectionTimeout":10000,
  4. "pingTimeout":1000,
  5. "connectTimeout":10000,
  6. "timeout":3000,
  7. "retryAttempts":3,
  8. "retryInterval":1500,
  9. "reconnectionTimeout":3000,
  10. "failedAttempts":3,
  11. "password":null,
  12. "subscriptionsPerConnection":5,
  13. "clientName":null,
  14. "loadBalancer":{
  15. "class":"org.redisson.connection.balancer.RoundRobinLoadBalancer"
  16. },
  17. "slaveSubscriptionConnectionMinimumIdleSize":1,
  18. "slaveSubscriptionConnectionPoolSize":50,
  19. "slaveConnectionMinimumIdleSize":32,
  20. "slaveConnectionPoolSize":64,
  21. "masterConnectionMinimumIdleSize":32,
  22. "masterConnectionPoolSize":64,
  23. "readMode":"SLAVE",
  24. "nodeAddresses":[
  25. "redis://127.0.0.1:7004",
  26. "redis://127.0.0.1:7001",
  27. "redis://127.0.0.1:7000"
  28. ],
  29. "scanInterval":1000
  30. },
  31. "threads":0,
  32. "nettyThreads": 0,
  33. "codec":{
  34. "class":"org.redisson.codec.JsonJacksonCodec"
  35. },
  36. "transportMode":"NIO"
  37. }

配置集群模式可以通过指定一个YAML格式的文件来实现。以下是YAML格式的配置文件样本。文件中的字段名称必须与ClusterServersConfigConfig对象里的字段名称相符。

  1. ---
  2. clusterServersConfig:
  3. idleConnectionTimeout: 10000
  4. pingTimeout: 1000
  5. connectTimeout: 10000
  6. timeout: 3000
  7. retryAttempts: 3
  8. retryInterval: 1500
  9. reconnectionTimeout: 3000
  10. failedAttempts: 3
  11. password: null
  12. subscriptionsPerConnection: 5
  13. clientName: null
  14. loadBalancer: !<org.redisson.connection.balancer.RoundRobinLoadBalancer> {}
  15. slaveSubscriptionConnectionMinimumIdleSize: 1
  16. slaveSubscriptionConnectionPoolSize: 50
  17. slaveConnectionMinimumIdleSize: 32
  18. slaveConnectionPoolSize: 64
  19. masterConnectionMinimumIdleSize: 32
  20. masterConnectionPoolSize: 64
  21. readMode: "SLAVE"
  22. nodeAddresses:
  23. - "redis://127.0.0.1:7004"
  24. - "redis://127.0.0.1:7001"
  25. - "redis://127.0.0.1:7000"
  26. scanInterval: 1000
  27. threads: 0
  28. nettyThreads: 0
  29. codec: !<org.redisson.codec.JsonJacksonCodec> {}
  30. "transportMode":"NIO"

配置集群模式还可以通过Spring XML的命名空间来实现。以下是Spring XML格式的配置文件样本。文件中的属性名称在采用了Spring框架的命名规范并与ClusterServersConfigConfig对象里的字段名称相符。

  1. <redisson:client
  2. id="redisson"
  3. name="redisson1,redisson2"
  4. threads="0"
  5. netty-threads="0"
  6. codec-ref="myCodec"
  7. transport-mode="NIO"
  8. redisson-reference-enabled="true"
  9. codec-provider-ref="myCodecProvider"
  10. resolver-provider-ref="myResolverProvider"
  11. executor-ref="myExecutor"
  12. event-loop-group-ref="myEventLoopGroup"
  13. >
  14. <!--
  15. 这里的name属性和qualifier子元素不能同时使用。
  16. id和name的属性都可以被用来作为qualifier的备选值。
  17. -->
  18. <!--<qualifier value="redisson3"/>-->
  19. <redisson:cluster-servers
  20. idle-connection-timeout="10000"
  21. ping-timeout="1000"
  22. connect-timeout="10000"
  23. timeout="3000"
  24. retry-attempts="3"
  25. retry-interval="1500"
  26. reconnection-timeout="3000"
  27. failed-attempts="3"
  28. password="do_not_use_if_it_is_not_set"
  29. subscriptions-per-connection="5"
  30. client-name="none"
  31. load-balancer-ref="myLoadBalancer"
  32. subscription-connection-minimum-idle-size="1"
  33. subscription-connection-pool-size="50"
  34. slave-connection-minimum-idle-size="10"
  35. slave-connection-pool-size="64"
  36. master-connection-minimum-idle-size="10"
  37. master-connection-pool-size="64"
  38. read-mode="SLAVE"
  39. subscription-mode="SLAVE"
  40. scan-interval="1000"
  41. >
  42. <redisson:node-address value="redis://127.0.0.1:6379" />
  43. <redisson:node-address value="redis://127.0.0.1:6380" />
  44. <redisson:node-address value="redis://127.0.0.1:6381" />
  45. </redisson:cluster-servers>
  46. </redisson:client>
  47. <!-- 最基本配置 -->
  48. <redisson:client>
  49. <redisson:cluster-servers>
  50. <redisson:node-address value="redis://127.0.0.1:6379" />
  51. <redisson:node-address value="redis://127.0.0.1:6380" />
  52. <redisson:node-address value="redis://127.0.0.1:6381" />
  53. ...
  54. </redisson:cluster-servers>
  55. </redisson:client>