设为首页 收藏本站
查看: 1058|回复: 0

[经验分享] Redis集群的高可用测试(含Jedis客户端的使用)

[复制链接]

尚未签到

发表于 2018-11-4 11:32:00 | 显示全部楼层 |阅读模式
  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、查看当前集群各节点的状态
  [root@edu-redis-01 7111]# /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集群当前状态(用于接下来做节点状态变化对比)
DSC0000.png

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

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

  由上可见,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)查看集群状态
DSC0003.png

  其中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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-630604-1-1.html 上篇帖子: redis主从同步原理 下篇帖子: redis的数据持久化
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表