Linxu磁盘 PaddleHub canal安装 docker容器 swing url unicode neo4j bluetooth insert requirejs jquery获取最后一个子元素 android调试工具 xcode打包 linux全局搜索文件 安装python python的range python分析 python基础代码 java数据库 java在线课程 java运行环境 java安装步骤 java数组转集合 java中文文档 java的多线程 远程登录linux 莫愁脚本 allowoverride phpqrcode 路由器有没有辐射 小工具 电子商城系统 战斗的召唤 高通cpu排行 手机电脑模拟器 游戏python界面编程 js转数字 手工画像 发射爱心的图片
当前位置: 首页 > 学习教程  > 编程语言

redis哨兵的核心底层原理解析(含slave选举)

2020/11/4 14:51:08 文章标签:

1.sdown和odown转换机制 sdown和odown两种失败状态,sdown是主观宕机:一个哨兵如果自己觉得一个master宕机了,那么就是主观宕机;odown是客观宕机,如果quorum数量的哨兵都觉得一个master宕机了,那么就是客观…

1.sdown和odown转换机制

sdown和odown两种失败状态,sdown是主观宕机:一个哨兵如果自己觉得一个master宕机了,那么就是主观宕机;odown是客观宕机,如果quorum数量的哨兵都觉得一个master宕机了,那么就是客观宕机。
sdown达成的条件很简单,如果一个哨兵ping一个master,超过了is-master-down-after-milliseconds指定的毫秒数之后,就主观认为master宕机;sdown到odown转换的条件很简单,如果一个哨兵在指定时间内,收到了quorum指定数量的其他哨兵也认为那个master是sdown了,那么就认为是odown了,客观认为master宕机。

2.哨兵集群的自动发现机制

哨兵互相之间的发现,是通过redis的pub/sub系统实现的,每个哨兵都会往_sentinel_:hello这个channel里发送一个消息,这时候所有其他哨兵都可以消费到这个消息,并感知到其他的哨兵的存在。
每隔两秒每个哨兵都会往自己监控的master+slave对应的_sentinel_:hello里发送一个消息,内容是自己的host、IP和runid还有对这个master的监控配置;每隔哨兵也会去监听自己监控的每个master+salve对应的_sentinel_:hello channel,然后去感知到同样在监听这个master+slave的其他哨兵的存在。
每隔哨兵还会跟其他哨兵交换对master的监控配置,互相进行监控配置的同步。

3、slave配置的自动纠正

哨兵会负责自动纠正slave的一些配置,比如slave如果成为潜在的master候选人,哨兵会确保slave在复制现有的master数据;如果slave连接到了一个错误的master上,比如故障转移之后,那么哨兵会确保它们连接到正确的master上。

4、slave->master选举算法

如果一个master被认为odown了,而且majority哨兵都允许了主备切换,那么某个哨兵就会执行主备切换操作,此时首先要选举一个slave,会考虑slave的一些信息:

  • 跟master断开连接的时长
  • slave优先级
  • 复制offset
  • run id

如果一个slave跟master断开连接已经超过down-after-milliseconds的10倍,外加master宕机的时长,那么slave就被认为不适合选举为master。
接下来会对slave进行排序:
首先按照slave优先级进行排序,slave priority越低,优先级越高;其次如果slave priority相同,那么看replica offset,哪个slave复制了越多的数据,offset越靠后,优先级越高;如果上面两个条件相同,那么选择一个run id比较小的那个slave。

5、quorum和majority

每次一个哨兵要做主备切换,首先需要quorum数量的哨兵认为odown,然后选举出一个哨兵来做切换,这个哨兵还得得到majority哨兵的授权,才能正式执行切换。如果quorum<majority,比如5个哨兵,majority就是3,quorum设置为2,那么3个哨兵授权就可以执行切换;但是如果quorum>=majority,那么必须quorum数量的哨兵都授权,比如5个哨兵,quorum是5,那么必须5个哨兵都同意授权,才能执行切换。

6、configuration epoch

执行切换的那个哨兵,会从要切换到新master那里得到一个configuration epoch,这就是一个version号,每次切换的version号都必须是唯一的。
如果第一个选举出的哨兵切换失败了,那么其他哨兵会等待failover-timeout时间,然后接替继续执行切换,此时会重新获取一个新的configuration epoch,作为新的version号。

7、configuration传播

哨兵完成切换后,会在自己本地更新生成最新的master配置,然后同步给其他哨兵,就是通过之前说的pub/sub机制。这里之前的version号就很重要了,因为各种消息都是通过一个channel去发布和监听的,所以一个哨兵完成一次新的切换之后,新的master配置是跟着新的version号的,其他哨兵都是根据版本号的大小来更新自己的master配置的。


本文链接: http://www.dtmao.cc/news_show_350235.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?