首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Redis哨兵模式的故障转移详细流程

Redis Sentinel的客户端

Sentinel节点集合具备了监控、通知、自动故障转移、配置提供者若干功能,最了解主节点信息的就是Sentinel节点集合,而各个主节点可以通过进行标识的,无论是哪种编程语言的客户端,如果需要正确地连接Redis Sentinel,必须有Sentinel节点集合和masterName两个参数。

基本实现原理

实现一个Redis Sentinel客户端的基本步骤如下:

1)遍历Sentinel节点集合获取一个可用的Sentinel节点,Sentinel节点之间可以共享数据,从任意一个Sentinel节点获取主节点信息都是可以的。

2)通过sentinel get-master-addr-by-name master-name这个API来获取对应主节点的相关信息。

3)验证当前获取的“主节点”是真正的主节点,这样做的目的是为了防止故障转移期间主节点的变化。

4)保持和Sentinel节点集合的“联系”,时刻获取关于主节点的相关“信息”

主观下线和客观下线

每个Sentinel节点会每隔1秒对主节点、从节点、其他Sentinel节点发送ping命令做心跳检测,当这些节点超过down-after-milliseconds没有进行有效回复,Sentinel节点就会对该节点做失败判定,这个行为叫做主观下线。主管下线检测如下图:

当Sentinel主观下线的节点是主节点时,该Sentinel节点会通过sentinel is-master-down-by-addr命令向其他Sentinel节点询问对主节点的判断,当超过个数,Sentinel节点认为主节点确实有问题,这时该Sentinel节点会做出客观下线的决定,也就是大部分Sentinel节点都对主节点的下线做了同意的判定,那么这个判定就是客观的。客观下线流程如下图:

sentinel is-master-down-by-addr

命令参数介绍:

ip:主节点IP。

port:主节点端口。

current_epoch:当前配置纪元。

runid:此参数有两种类型,不同类型决定了此API作用的不同。runid等于“*”时,作用是Sentinel节点直接交换对主节点下线的判定。当runid等于当前Sentinel节点的runid时,作用是当前Sentinel节点希望目标Sentinel节点同意自己成为领导者的请求。

该命令返回结果包含三个参数,如下所示:

down_state:目标Sentinel节点对于主节点的下线判断,1是下线,0是在线。

leader_runid:当leader_runid等于“*”时,代表返回结果是用来做主节点是否不可达,当leader_runid等于具体的runid,代表目标节点同意runid成为领导者。

leader_epoch:领导者纪元。

Sentinel节点领导者选举

Sentinel节点对于主节点已经做了客观下线,Sentinel节点之间会做一个领导者选举的工作,选出一个Sentinel节点作为领导者进行故障转移的工作。Redis使用了Raft算法实现领导者选举。

Redis Sentinel进行领导者选举的大致思路:

1)每个在线的Sentinel节点都有资格成为领导者,当它确认主节点主观下线时候,会向其他Sentinel节点发送sentinel is-master-down-by-addr命令,要求将自己设置为领导者。

2)收到命令的Sentinel节点,如果没有同意过其他Sentinel节点的sentinel is-master-down-by-addr命令,将同意该请求,否则拒绝。

3)如果该Sentinel节点发现自己的票数已经大于等于max(quorum,num(sentinels)/2+1),那么它将成为领导者。

4)如果此过程没有选举出领导者,将进入下一次选举。

故障转移

领导者选举出的Sentinel节点负责故障转移,故障转移流程如下图:

具体步骤如下:

1)在从节点列表中选出一个节点作为新的主节点,选择方法如下:

a)过滤:“不健康”(主观下线、断线)、5秒内没有回复过Sentinel节点ping响应、与主节点失联超过down-after-milliseconds*10秒。

b)选择slave-priority(从节点优先级)最高的从节点列表,如果存在则返回,不存在则继续。

c)选择复制偏移量最大的从节点(复制的最完整),如果存在则返回,不存在则继续。

d)选择runid最小的从节点。

2)Sentinel领导者节点会对第一步选出来的从节点执行slaveof no one命令让其成为主节点。

3)Sentinel领导者节点会向剩余的从节点发送命令,让它们成为新主节点的从节点,复制规则和parallel-syncs参数有关。

4)Sentinel节点集合会将原来的主节点更新为从节点,并保持着对其关注,当其恢复后命令它去复制新的主节点。

注:配图有点丑,大家不要介意呀(^_−)☆

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20211105A0CS1000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券