redis哨兵领导者、主节点选举、故障转移

本文深入解析Redis Sentinel的工作机制,包括哨兵如何发现从节点、如何判断节点故障、领导者选举流程、主节点选举策略及故障转移步骤。同时,阐述了Sentinel实现节点失败共识的原理,以及故障转移过程中关键命令的使用。

一、哨兵实现原理:三个定时任务,也回答了三个问题:

 

问题一:sentinel没有配置从节点信息如何知道从节点信息的?

 

1、每隔10秒,sentinel进行向主节点发送info命令,用于发现新的slave节点

 

问题二、如何加入新的sentinel的

2、每隔2秒,向redis数据节点_sentinel_:hello频道发送本sentinel节点的信息和对主节点的判断:这是进行对主节点进行客观下线和领导者选举的重要依据;也是发现新sentinel节点的重要依据

 

问题三:如何判断一个节点的需要主观下线的?

3、每隔1秒每个sentinel对其他的redis节点(master,slave,sentinel)执行ping操作,对于master来说

 若超过down-after-milliseconds内没有回复,就对该节点进行主观下线并询问其他的Sentinel节点是否可以客观下线

 

二、对redis节点失败达成共识

主观下线:每隔1秒每个sentinel对其他的redis节点(master,slave,sentinel)执行ping操作,若超过down-after-milliseconds内没有回复,就对该节点进行主观下线,每个sentinel节点对redis节点失败的“偏见”

客观下线:当sentinel主观下线的节点是主节点时,sentinel会通过命令sentinel is-master-down-by-addr来询问其sentinel对主节点的判断,如果超过quorum个数就认为主节点需要客观下线, 所有sentinel节点对redis节点失败达成共识

 

三、选举sentinel领导者 使用的raft算法(https://raft.github.io),大致思路:

1、每个做主观下线的sentinel节点像其他sentinel节点发送命令,要求将自己设置为领导者

2、接收到的sentinel可以同意或者拒绝

3、如果该sentinel节点发现自己的票数已经超过半数并且超过了quorum

4、如果此过程选举出了多个领导者,那么将等待一段时重新进行选举

 

 

四、主节点选举:选举出可以代替主节点的slave从节点

 

1、选择健康状态从节点(排除主观下线、断线),排除5秒钟没有心跳的、排除主节点失联超过10*down-after-millisecends

2、选择slave-priority高的从节点优先级列表

4、选择偏移量大的

5、选择runid小的

 

 

五、进行故障转移

 

1、sentinel的领导者从slave中选举出合适的从节点进行故障转移

2、对选取的slave执行slave of no one

3、更新应用程序端的链接到新的主节点

4、对其他从节点变更master为新的节点

5、修复原来的master并将其设置为新master的slave

 

 

六、:sentinel is-master-down-by-addr命令

 

1、当前sentinel节点如果判断主节点是主观下线之后会向其他sentinel发送此命令询问其他节点对主节点的判断

sentinel is-master-down-by-addr ip port epoch runid

入参:runid会传“*” 标识要询问目标sentinel是否主观下线主节点 epoch传入当前纪元

返回参数:down_state:返回目标的判断,1是下线 0是不下线

leader_runid:返回“*”

 

2、当进行领导者选举时每个判断客观下线的sentinel都会向其他sentinel发送此命令

 

sentinel is-master-down-by-addr ip port epoch runid

 

入参:runid是当前sentinel的runid,标识希望目标节点同意自己成为领导者

返回参数:leader_runid 返回具体的runid表示同意当前节点成为领导者

 

 

 

 

 

<think>嗯,用户想了解Redis哨兵模式下,主节点宕机后从节点选举主节点的流程。我需要先回顾一下Redis哨兵的相关知识,确保回答准确。 首先,哨兵集群的主要功能是监控主节点和从节点,当主节点不可用时,自动进行故障转移。这个过程包括几个关键步骤:检测主节点下线、选举哨兵领导者、选择新的主节点、切换配置和通知客户端。 根据引用[1],哨兵节点会定期检查主节点的状态。如果超过半数的哨兵认为主节点主观下线(SDOWN),就会触发客观下线(ODOWN)。这时候需要开始故障转移流程。这里要注意,客观下线的判断需要多数哨兵的确认,避免误判。 接下来,选举哨兵领导者。引用[2]提到,哨兵之间使用Raft算法来选出一个领导者,由它来负责后续的故障转移操作。这一步很重要,因为只有领导者才能执行故障转移,确保操作的唯一性。 然后是选择新的主节点。引用[2]和[4]指出,领导者会根据从节点的健康状况、复制偏移量、优先级等因素进行评估。优先级高的从节点会被优先考虑,复制偏移量最新的节点数据更完整,所以这一步要综合考虑多个因素,确保选出最合适的从节点。 之后,领导者会发送slaveof no one命令给选中的从节点,使其成为新的主节点,并更新其他从节点和客户端的配置。这里可能遇到的问题如引用[3]和[4]提到的端口未开放或防火墙问题,导致故障转移失败,需要确保网络配置正确。 最后,通知客户端新的主节点地址,并持续监控旧主节点,以防它恢复后作为从节点加入集群。这部分在引用[1]和[3]中有提到,配置文件的正确设置和网络可达性很重要。 用户可能还想知道选举中的细节,比如如何避免多个领导者,或者如何处理网络分区的问题。另外,实际应用中可能遇到的配置错误,比如bind设置或防火墙问题,需要根据引用[3]和[4]的建议来解决。 总结回答时,要分步骤清晰地解释流程,引用相关参考资料,并指出常见问题及解决方法,这样用户能全面理解整个过程。</think>### Redis哨兵模式主节点故障转移流程解析 Redis哨兵模式下主节点宕机后的从节点选举流程可分为以下关键步骤,结合引用内容中的技术细节进行说明: 1. **检测主节点故障** - 每个哨兵节点每隔1秒向主节点发送`PING`命令(默认配置) - 当主节点连续无响应超过`down-after-milliseconds`阈值(默认30秒),哨兵将其标记为**主观下线(SDOWN)** - **客观下线(ODOWN)** 需要满足:`quorum`数量(配置参数)的哨兵节点都确认主节点不可用[^1][^4] - 触发故障转移的条件:多数哨兵节点达成共识(哨兵总数/2 +1) 2. **选举哨兵领导者** - 使用Raft算法哨兵节点选举领导者(Leader),只有领导者能执行故障转移[^2] - 选举规则: - 每个发现主节点ODOWN的哨兵会发起投票请求 - 先到先得的投票机制,最先达到多数票的哨兵成为Leader - 每个纪元(epoch)只产生一个Leader 3. **筛选候选从节点** - 领导者哨兵根据以下标准评估从节点: ```python # 伪代码评估逻辑 def select_slave(slaves): valid_slaves = [s for s in slaves if s.info_repl_age < 60 # 数据同步延迟 and s.last_ack_time < 5000 # 最近响应时间 and s.slave_priority > 0] # 优先级配置 # 按优先级排序,相同优先级比复制偏移量 return sorted(valid_slaves, key=lambda x: (-x.slave_priority, -x.repl_offset)) ``` - 排除条件: - 长时间未响应(超过`repl-timeout`配置) - 复制偏移量过时(与主节点差异超过阈值) - 手动配置`slave-priority=0`的节点不参与选举[^2] 4. **执行故障转移** - 领导者向目标从节点发送`SLAVEOF NO ONE`命令,将其提升为主节点 - 更新哨兵集群的拓扑信息: ```shell # 修改新主节点的配置 config set slave-read-only no # 通知其他从节点复制新主节点 sentinel failover <master-name> ``` - 更新所有哨兵的`sentinel.conf`,记录新主节点信息 5. **客户端重定向** - 哨兵通过`+switch-master`事件通知客户端 - 客户端订阅`__sentinel__:hello`频道获取新主节点地址 - 旧主节点恢复后会被哨兵自动设置为新主节点的从节点[^1] **常见问题解决方案**: - 故障转移失败时检查: 1. 确保所有节点间端口开放(6379+16379)[^3] 2. 配置文件添加`bind 0.0.0.0`允许跨服务器通信 3. 关闭防火墙或设置正确规则: ```shell systemctl stop firewalld.service # CentOS ufw allow 6379/tcp # Ubuntu ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值