redis集群节点宕机 fail状态 redis的投票机制实测

 redis集群是有很多个redis一起工作,那么就需要这个集群不是那么容易挂掉,所以呢,理论上就应该给集群中的每个节点至少一个备用的redis服务。这个备用的redis称为从节点(slave)。
.本文测试 redis集群节点宕机 fail状态以上篇博文为基础Redis集群策略及集群实例。

 在Redis集群策略及集群实例中通过单机集群创建多实例(3主3从)的方式搭建了redis集群,以此为基础做实测
 首先查看一下集群状态

[root@localhost redis-4.0.10]# src/redis-cli -c -h 192.168.0.108 -p 8001
192.168.0.108:8001> cluster nodes
3e79b85af9cdc988e126046f22928945285eb161 192.168.0.108:8003@18003 master - 0 1581696889554 3 connected 10923-16383
fbfaa42f64689db65dec42f5675dd37f66251371 192.168.0.108:8006@18006 slave 1cd0ce2458d65b65a5a634ec287f571dbbcbb4b7 0 1581696889553 8 connected
8706fb3d61e7ca1f433fc66534215aea8d91061e 192.168.0.108:8004@18004 slave 3e79b85af9cdc988e126046f22928945285eb161 0 1581696889000 4 connected
1924cebf2e62605d3b28a764add6b6da7e3bcbb1 192.168.0.108:8005@18005 slave 5ffc6c0d316f3352443f1979239c852e6c8e4540 0 1581696889754 5 connected
1cd0ce2458d65b65a5a634ec287f571dbbcbb4b7 192.168.0.108:8002@18002 master - 0 1581696889000 8 connected 5461-10922
76f82463d9088f62a99482818fb8690a139a60a9 192.168.0.108:8008@18008 slave 1cd0ce2458d65b65a5a634ec287f571dbbcbb4b7 0 1581696888545 8 connected
5ffc6c0d316f3352443f1979239c852e6c8e4540 192.168.0.108:8001@18001 myself,master - 0 1581696888000 1 connected 0-5460
192.168.0.108:8001>

 查看控制台我们可以看出有3个主节点,4个从节点

master8001-----------slave=8005
master8002-----------slave=8006 8008
master8003-----------slave=8004


集群是如何判断是否有某个节点挂掉(宕机)

  首先要说的是,每一个节点都存有这个集群所有主节点以及从节点的信息。它们之间通过互相的ping-pong判断是否节点可以连接上。如果有一半以上的节点去ping一个节点的时候没有回应,集群就认为这个节点宕机了,然后去连接它的备用节点。
由于没有更多环境测试,本文测试手动停掉主节点作为宕机测试验证

redis的投票机制

 我将其中一个主节点实例服务停掉看一下他的状态
 停掉8002这个主节点,它有两个从节点

192.168.0.108:8001>
[root@localhost redis-4.0.10]# ps -ef|grep redis
root      54357      1  0 Feb14 ?        00:01:21 /usr/local/redis-4.0.10/src/redis-server 192.168.0.108:8001 [cluster]
root      54362      1  0 Feb14 ?        00:01:24 /usr/local/redis-4.0.10/src/redis-server 192.168.0.108:8002 [cluster]
root      54367      1  0 Feb14 ?        00:01:20 /usr/local/redis-4.0.10/src/redis-server 192.168.0.108:8003 [cluster]
root      54372      1  0 Feb14 ?        00:01:22 /usr/local/redis-4.0.10/src/redis-server 192.168.0.108:8004 [cluster]
root      54377      1  0 Feb14 ?        00:01:21 /usr/local/redis-4.0.10/src/redis-server 192.168.0.108:8005 [cluster]
root      54382      1  0 Feb14 ?        00:01:21 /usr/local/redis-4.0.10/src/redis-server 192.168.0.108:8006 [cluster]
root      54649      1  0 Feb14 ?        00:01:03 /usr/local/redis-4.0.10/src/redis-server 192.168.0.108:8008 [cluster]
root      56002  55813  0 00:21 pts/7    00:00:00 grep --color=auto redis
[root@localhost redis-4.0.10]# kill -9 54362

 查看一下集群状态

192.168.0.108:8001> cluster nodes
3e79b85af9cdc988e126046f22928945285eb161 192.168.0.108:8003@18003 master - 0 1581697369000 3 connected 10923-16383
fbfaa42f64689db65dec42f5675dd37f66251371 192.168.0.108:8006@18006 master - 0 1581697368570 9 connected 5461-10922
8706fb3d61e7ca1f433fc66534215aea8d91061e 192.168.0.108:8004@18004 slave 3e79b85af9cdc988e126046f22928945285eb161 0 1581697370392 4 connected
1924cebf2e62605d3b28a764add6b6da7e3bcbb1 192.168.0.108:8005@18005 slave 5ffc6c0d316f3352443f1979239c852e6c8e4540 0 1581697369000 5 connected
1cd0ce2458d65b65a5a634ec287f571dbbcbb4b7 192.168.0.108:8002@18002 master,fail - 1581697316611 1581697314597 8 disconnected
76f82463d9088f62a99482818fb8690a139a60a9 192.168.0.108:8008@18008 slave fbfaa42f64689db65dec42f5675dd37f66251371 0 1581697369379 9 connected
5ffc6c0d316f3352443f1979239c852e6c8e4540 192.168.0.108:8001@18001 myself,master - 0 1581697369000 1 connected 0-5460
192.168.0.108:8001>

 我们可以看到1cd0ce2458d65b65a5a634ec287f571dbbcbb4b7 192.168.0.108:8002@18002 master,fail - 1581697316611 1581697314597 8 disconnected 8002节点实例fail,那他的从节点8006,8008呢,
 接着看控制到fbfaa42f64689db65dec42f5675dd37f66251371 192.168.0.108:8006@18006 master - 0 1581697368570 9 connected 5461-10922 8006从一个从节点变为新的主节点继续工作,再看800876f82463d9088f62a99482818fb8690a139a60a9 192.168.0.108:8008@18008 slave fbfaa42f64689db65dec42f5675dd37f66251371 0 1581697369379 9 connected 8008成为新的主节点8006的从节点了,
  tip:集群中的每个节点都有1个至N个复制品,其中一个为主节点,其余的为从节点,如果主节点下线了,集群就会把这个主节点的一个从节点设置为新的主节点继续工作,这样集群就不会因为一个主节点的下线而无法正常工作。
三 我将8002节点服务器重新启动,来看一下会有什么反应

[root@localhost redis-4.0.10]# src/redis-server /usr/local/redis-cluster/8002/redis.conf
56009:C 15 Feb 00:37:57.883 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
56009:C 15 Feb 00:37:57.883 # Redis version=4.0.10, bits=64, commit=00000000, modified=0, pid=56009, just started
56009:C 15 Feb 00:37:57.883 # Configuration loaded
[root@localhost redis-4.0.10]#

 查看集群状态

[root@localhost redis-4.0.10]# src/redis-cli -c -h 192.168.0.108 -p 8001
192.168.0.108:8001> cluster nodes
3e79b85af9cdc988e126046f22928945285eb161 192.168.0.108:8003@18003 master - 0 1581698340487 3 connected 10923-16383
fbfaa42f64689db65dec42f5675dd37f66251371 192.168.0.108:8006@18006 master - 0 1581698339000 9 connected 5461-10922
8706fb3d61e7ca1f433fc66534215aea8d91061e 192.168.0.108:8004@18004 slave 3e79b85af9cdc988e126046f22928945285eb161 0 1581698339479 4 connected
1924cebf2e62605d3b28a764add6b6da7e3bcbb1 192.168.0.108:8005@18005 slave 5ffc6c0d316f3352443f1979239c852e6c8e4540 0 1581698338471 5 connected
1cd0ce2458d65b65a5a634ec287f571dbbcbb4b7 192.168.0.108:8002@18002 slave fbfaa42f64689db65dec42f5675dd37f66251371 0 1581698339479 9 connected
76f82463d9088f62a99482818fb8690a139a60a9 192.168.0.108:8008@18008 slave fbfaa42f64689db65dec42f5675dd37f66251371 0 1581698338974 9 connected
5ffc6c0d316f3352443f1979239c852e6c8e4540 192.168.0.108:8001@18001 myself,master - 0 1581698338000 1 connected 0-5460
192.168.0.108:8001>

  查看控制台1cd0ce2458d65b65a5a634ec287f571dbbcbb4b7 192.168.0.108:8002@18002 slave fbfaa42f64689db65dec42f5675dd37f66251371 0 1581698339479 9 connected 原来的8002主节点成为了fbfaa42f64689db65dec42f5675dd37f66251371 192.168.0.108:8006@18006 master - 0 1581698339000 9 connected 5461-10922 新主节点8006的从节点。
tip:旧主重新连接后将其变为新主的从服务器

总结:redis的投票机制
   投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超时(cluster-node-timeout),认为当前master节点挂掉。
   选举的依据依次是:网络连接正常->5秒内回复过INFO命令->10*down-after-milliseconds内与主连接过的->从服务器优先级->复制偏移量->运行id较小的。选出之后通过slaveif no ont将该从服务器升为新主服务器。
   通过slaveof ip port命令让其他从服务器复制该信主服务器。
   最后当旧主重新连接后将其变为新主的从服务器

集群进入fail状态的必要条件

 1、某个主节点和所有从节点全部挂掉,我们集群就进入faill状态。
 2、如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态.
 3、如果集群任意master挂掉,且当前master没有slave.集群进入fail状态
 测试,我将主节点8001和它的从节点8005手动停掉,看看什么状态

[root@localhost redis-4.0.10]# ps -ef|grep redis
root      54357      1  0 Feb14 ?        00:01:28 /usr/local/redis-4.0.10/src/redis-server 192.168.0.108:8001 [cluster]
root      54367      1  0 Feb14 ?        00:01:27 /usr/local/redis-4.0.10/src/redis-server 192.168.0.108:8003 [cluster]
root      54372      1  0 Feb14 ?        00:01:29 /usr/local/redis-4.0.10/src/redis-server 192.168.0.108:8004 [cluster]
root      54377      1  0 Feb14 ?        00:01:28 /usr/local/redis-4.0.10/src/redis-server 192.168.0.108:8005 [cluster]
root      54382      1  0 Feb14 ?        00:01:28 /usr/local/redis-4.0.10/src/redis-server 192.168.0.108:8006 [cluster]
root      54649      1  0 Feb14 ?        00:01:11 /usr/local/redis-4.0.10/src/redis-server 192.168.0.108:8008 [cluster]
root      56010      1  0 00:37 ?        00:00:02 src/redis-server 192.168.0.108:8002 [cluster]
root      56043  55813  0 00:55 pts/7    00:00:00 grep --color=auto redis
[root@localhost redis-4.0.10]# kill -9 54357  54377
[root@localhost redis-4.0.10]#

 查看服务进程

[root@localhost redis-4.0.10]# ps -ef|grep redis
root      54367      1  0 Feb14 ?        00:01:28 /usr/local/redis-4.0.10/src/redis-server 192.168.0.108:8003 [cluster]
root      54372      1  0 Feb14 ?        00:01:30 /usr/local/redis-4.0.10/src/redis-server 192.168.0.108:8004 [cluster]
root      54382      1  0 Feb14 ?        00:01:29 /usr/local/redis-4.0.10/src/redis-server 192.168.0.108:8006 [cluster]
root      54649      1  0 Feb14 ?        00:01:11 /usr/local/redis-4.0.10/src/redis-server 192.168.0.108:8008 [cluster]
root      56010      1  0 00:37 ?        00:00:03 src/redis-server 192.168.0.108:8002 [cluster]
root      56046  55813  0 00:57 pts/7    00:00:00 grep --color=auto redis
[root@localhost redis-4.0.10]#

 目前8001,8005 已关闭,查看集群状态

[root@localhost redis-4.0.10]# src/redis-cli -c -h 192.168.0.108 -p 8003
192.168.0.108:8003> cluster nodes
3e79b85af9cdc988e126046f22928945285eb161 192.168.0.108:8003@18003 myself,master - 0 1581699578000 3 connected 10923-16383
8706fb3d61e7ca1f433fc66534215aea8d91061e 192.168.0.108:8004@18004 slave 3e79b85af9cdc988e126046f22928945285eb161 0 1581699579164 4 connected
76f82463d9088f62a99482818fb8690a139a60a9 192.168.0.108:8008@18008 slave fbfaa42f64689db65dec42f5675dd37f66251371 0 1581699579000 9 connected
fbfaa42f64689db65dec42f5675dd37f66251371 192.168.0.108:8006@18006 master - 0 1581699578051 9 connected 5461-10922
5ffc6c0d316f3352443f1979239c852e6c8e4540 192.168.0.108:8001@18001 master,fail - 1581699388186 1581699386575 1 disconnected 0-5460
1924cebf2e62605d3b28a764add6b6da7e3bcbb1 192.168.0.108:8005@18005 slave,fail 5ffc6c0d316f3352443f1979239c852e6c8e4540 1581699388186 1581699386000 5 disconnected
1cd0ce2458d65b65a5a634ec287f571dbbcbb4b7 192.168.0.108:8002@18002 slave fbfaa42f64689db65dec42f5675dd37f66251371 0 1581699578000 9 connected
192.168.0.108:8003>

  查看控制台5ffc6c0d316f3352443f1979239c852e6c8e4540 192.168.0.108:8001@18001 master,fail - 1581699388186 1581699386575 1 disconnected 0-5460 1924cebf2e62605d3b28a764add6b6da7e3bcbb1 192.168.0.108:8005@18005 slave,fail 5ffc6c0d316f3352443f1979239c852e6c8e4540 1581699388186 1581699386000 5 disconnected
  主节点8001和从节点8005都已,fail ,8001节点redis集群就会停止工作了。

主存复制数据问题

 1、如果某一个主节点和他所有的从节点都下线的话,redis集群就会停止工作了。redis集群不保证数据的强一致性,在特定的情况下,redis集群会丢失已经被执行过的写命令。
 2、使用异步复制(asynchronous replication)是redis 集群可能会丢失写命令的其中一个原因,有时候由于网络原因,如果网络断开时间太长,redis集群就会启用新的主节点,之前发给主节点的数据就会丢失。

参看文档:https://www.cnblogs.com/dadonggg/p/8628735.html

redis集群节点宕机 fail状态 redis的投票机制实测相关推荐

  1. MySQL集群节点宕机,数据库脑裂!如何排障?

    作者介绍 王晶,中国移动DBA,负责"移动云"业务系统的数据库集成架构设计.运维.优化等工作:擅长技术领域MySQL,获Oracle颁发的"MySQL DBA" ...

  2. springboot整合redis集群master宕机后连接超时

    前提: #        本文是在确保redis集群配置正确的情况下,连接超时的解决方案. 项目登录认证使用的是sa-token(这个不重要,主要说的是springboot和redis集群),最近应甲 ...

  3. Redis集群节点的变更

    Redis集群节点增加 添加的节点以主节点 和从节点 两种不同的节点类型加入集群. 若为主节点 ,需要创建一个空节点,然后将某些哈希槽移动到这个空节点中 若为从节点 ,需要创建一个空节点,然后将新节点 ...

  4. Redis集群搭建(多机集群)

    链接: https://pan.baidu.com/s/1IczvAUFhNz23xvCjlTiI_A?pwd=ruge Redis入门篇 https://blog.csdn.net/tongxin_ ...

  5. redis集群节点连不上的原因之一

    原因:redis集群管理工具配置集群的节点ip不对. 我的虚拟机是直接从别人那里镜像过来的,原本就已经搭建好了redis集群.我直接拷过来使用报连不上其他节点,原因是之前集群管理工具配置指定的是之前虚 ...

  6. 两台服务器安装redis集群_Redis Cluster搭建高可用Redis服务器集群

    一.Redis Cluster集群简介 Redis Cluster是Redis官方提供的分布式解决方案,在3.0版本后推出的,有效地解决了Redis分布式的需求,当一个节点挂了可以快速的切换到另一个节 ...

  7. Redis集群研究和实践(基于redis 3.0.5)

    前言 redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用.现在的2.x的稳定版本是2.8.19,也是我们项目中普遍用到的版本. redis在年初发布了3.0. ...

  8. k8s 手动恢复redis 集群_高工面试之:redis的几种集群方式你都熟悉吗?

    Redis三种集群方式:主从复制.哨兵模式和Cluster模式 一.主从复制模式 Redis配置成主从模式,主库(Master)只负责客户端的写数据,从库(Slave)只负责客户端的读数据. 主从数据 ...

  9. down redis集群_硬核干货!Redis 分布式集群部署实战

    原理: Redis集群采用一致性哈希槽的方式将集群中每个主节点都分配一定的哈希槽,对写入的数据进行哈希后分配到某个主节点进行存储. 集群使用公式(CRC16 key)& 16384计算键key ...

最新文章

  1. django基础(一)
  2. JUC并发编程二 并发架构--线程运行原理
  3. html文件执行顺序,网页的加载和执行顺序?
  4. 遨博机器人执行线程_智造洞察 | 遨博机器人推出国内首条“用机器人生产机器人”产线;服务机器人等助力8月经济回升;浙江企业研发飞机发动机榫槽数控拉床...
  5. 篇二:Eclipse安装配置Maven
  6. 计算机网上作业系统论文,网上作业提交系统的设计与实现
  7. WAP 手机及开发技术调研(转)
  8. python ocr文字识别竖排繁体_小巧免费的图片文字识别OCR软件 支持简体识别和竖排繁体中文...
  9. 前端小项目(四)| 咖啡厅网页页面
  10. html把图片放到文章右边,怎么在文章中把图片放在文字的左边、右边、中 – 手机爱问...
  11. cad断点快捷键_CAD打断(BREAK)命令的使用技巧
  12. 科学防雷接地和雷电防护方案
  13. Excel中反转一列数据的几种方法
  14. python bind绑定失败_Python tkinter之Bind(绑定事件)的使用示例
  15. DBS3900组网方式学习
  16. java 开源 聊天机器人_用Java实现基于Web端的AI机器人聊天
  17. 如何在 Virtual Box 上下载 Docker
  18. 20172323 2017-2018-2 《程序设计与数据结构》第九周学习总结
  19. 服务器tomcat运行一段时间会报org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header
  20. Springboot教师教学质量评价系统

热门文章

  1. number——input新属性,提交时自动检测数字格式,大小
  2. python:统计数字字符个数
  3. 机械硬盘崩溃前的征兆
  4. RVM命令行管理工具安装
  5. HTML——tab标签
  6. 如何用html5和css3制作立体相册呢?
  7. WebSocket实战之六心跳重连机制
  8. Major GC和Full GC的区别是什么?触发条件呢?
  9. OCP 1Z0 052 83
  10. 【C语言】扫雷游戏——控制台版