得过且过 发表于 2018-11-4 11:32:00

Redis集群的高可用测试(含Jedis客户端的使用)

  Redis集群的使用测试(Jedis客户端的使用)
  1、Jedis客户端建议升级到最新版(当前为2.7.3),这样对3.0.x集群有比较好的支持。
  https://github.com/xetorthio/jedis
  http://mvnrepository.com/artifact/redis.clients/jedis
  2、直接在Java代码中链接Redis集群:
  // 数据库链接池配置
  JedisPoolConfig config = new JedisPoolConfig();
  config.setMaxTotal(100);
  config.setMaxIdle(50);
  config.setMinIdle(20);
  config.setMaxWaitMillis(6 * 1000);
  config.setTestOnBorrow(true);
  // Redis集群的节点集合
  Set jedisClusterNodes = new HashSet();
  jedisClusterNodes.add(new HostAndPort("192.168.1.111", 7111));
  jedisClusterNodes.add(new HostAndPort("192.168.1.112", 7112));
  jedisClusterNodes.add(new HostAndPort("192.168.1.113", 7113));
  jedisClusterNodes.add(new HostAndPort("192.168.1.114", 7114));
  jedisClusterNodes.add(new HostAndPort("192.168.1.115", 7115));
  jedisClusterNodes.add(new HostAndPort("192.168.1.116", 7116));
  // 根据节点集创集群链接对象
  //JedisCluster jedisCluster = newJedisCluster(jedisClusterNodes);
  // 节点,超时时间,最多重定向次数,链接池
  JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes, 2000, 100,config);
  int num = 1000;
  String key = "wusc";
  String value = "";
  for (int i=1; i
  "jedisCluster">"redis.clients.jedis.JedisCluster">
  
  
  "redis.clients.jedis.HostAndPort">
  
  
  
  "redis.clients.jedis.HostAndPort">
  
  
  
  "redis.clients.jedis.HostAndPort">
  
  
  
  "redis.clients.jedis.HostAndPort">
  
  
  
  "redis.clients.jedis.HostAndPort">
  
  
  
  "redis.clients.jedis.HostAndPort">
  
  
  
  
  
  
  
  
  
  对应的Java调用代码样例
  JedisCluster jedisCluster = (JedisCluster)context.getBean("jedisCluster");
  int num = 1000;
  String key = "wusc";
  String value = "";
  for (int i=1; i ,然后再进行指派。
  cluster setslot migrating :将本节点的槽 slot 迁移到node_id 指定的节点中。
  cluster setslot importing :从 node_id 指定的节点中导入槽slot 到本节点。
  cluster setslot stable:取消对槽 slot 的导入(import)或者迁移(migrate)。
  键
  cluster keyslot:计算键 key 应该被放置在哪个槽上。
  clustercountkeysinslot :返回槽 slot 目前包含的键值对数量。
  clustergetkeysinslot:返回 count 个 slot 槽中的键。
  三、集群高可用测试
  1、重建集群,步骤:
  (1)关闭集群的各节点;
  (2)删除各节点数据目录下的 nodes.conf、appendonly.aof、dump.rdb;
  # rm -rf appendonly.aof| rm -rf dump.rdb | rm -rf nodes.conf
  (3)重新启用所有的节点
  192.168.1.111
  # /usr/local/redis3/bin/redis-server/usr/local/redis3/cluster/7111/redis-7111.conf
  192.168.1.112
  # /usr/local/redis3/bin/redis-server/usr/local/redis3/cluster/7112/redis-7112.conf
  192.168.1.113
  # /usr/local/redis3/bin/redis-server/usr/local/redis3/cluster/7113/redis-7113.conf
  192.168.1.114
  # /usr/local/redis3/bin/redis-server/usr/local/redis3/cluster/7114/redis-7114.conf
  192.168.1.115
  # /usr/local/redis3/bin/redis-server/usr/local/redis3/cluster/7115/redis-7115.conf
  192.168.1.116
  # /usr/local/redis3/bin/redis-server/usr/local/redis3/cluster/7116/redis-7116.conf
  (4)执行集群创建命令(只需要在其中一个节点上执行一次则可)
  # cd/usr/local/src/redis-3.0.3/src/
  # cpredis-trib.rb /usr/local/bin/redis-trib
  # redis-tribcreate --replicas 1192.168.1.114:7114 192.168.1.115:7115 192.168.1.116:7116 192.168.1.111:7111 192.168.1.112:7112 192.168.1.113:7113
  2、查看当前集群各节点的状态
  # /usr/local/redis3/bin/redis-cli -c -p 7111
  127.0.0.1:7111> cluster nodes
  3、使用demo应用向集群写入1000个键值数据
  使用 /usr/local/redis3/bin/redis-cli-c -p 711X命令登录各节点,使用 keys *查看各节点的所有key
  4、运行demo应用,获取所有的键值数据
  如果有空值则停止
  5、模拟集群节点宕机(实现故障转移)
  (1)Jedis客户端循环操作集群数据(模拟用户持续使用系统)
  (2)查看Redis集群当前状态(用于接下来做节点状态变化对比)

  (3)关闭其中一个master节点(7111)
  (4)观察该master节点和对应的slave节点的状态变化

  节点状态 fail? 表示正在判断是否失败
  节点状态 fail 表示节点失败,对应的slave节点提升为master
  (5)再查看集群状态变化# /usr/local/src/redis-3.0.3/src/redis-trib.rbcheck 192.168.1.116:7116

  由上可见,7114节点替换7111,由slave变成了master
  此时再执行demo应用获取所有的键值数据,依然正常,说明slave替换master成功,集群正常。
  6、恢复fail节点
  (1)启动7111
  # /usr/local/redis3/bin/redis-server/usr/local/redis3/cluster/7111/redis-7111.conf
  (2)查看集群状态

  其中7111变成 7114的slave
  7、观察集群节点切换过程中,对客户端的影响
  JedisCluster链接Redis集群操作时遇到的几个常见异常:
  (1)重定向次数过多
  redis.clients.jedis.exceptions.JedisClusterMaxRedirectionsException:Too many Cluster redirections?
  解决方法: 初始化JedisCluster时,设定JedisCluster的maxRedirections
  //集群各节点集合,超时时间(默认2秒),最多重定向次数(默认5),链接池
  newJedisCluster(jedisClusterNodes, 2000, 100,config);
  (2)集群不可以用
  redis.clients.jedis.exceptions.JedisClusterException: CLUSTERDOWN The cluster is down
  原因:集群节点状态切换过程中会出现临时闪断,客户端重试操作则可。
  (3)链接超时
  redis.clients.jedis.exceptions.JedisConnectionException:java.net.SocketTimeoutException: Read timed out
  解决方法: 初始化JedisCluster时,设定JedisCluster的timeout(默认为两秒);也可以修改源码中的默认时间。
  7、总结:
  优点:
  在master节点下线后,slave节点会自动提升为master节点,保存集群持续提供服务;
  fail节点恢复后,会自动添加到集群中,变成slave节点;
  缺点:
  由于redis的复制使用异步机制,在自动故障转移的过程中,集群可能会丢失写命令。然而 redis 几乎是同时执行(将命令恢复发送给客户端,以及将命令复制到slave节点)这两个操作,所以实际中,命令丢失的窗口非常小。
  本文参考:http://www.roncoo.com/course/view/f614343765bc4aac8597c6d8b38f06fd

页: [1]
查看完整版本: Redis集群的高可用测试(含Jedis客户端的使用)