1.1前言
前一篇文章中,我们分析了主从复制的原理,但是在该模式下,一旦主节点由于故障无法提供服务,需要人工干预才能将从节点变为主节点,因此该模式不是高可用的。欣慰的是,Redis从2.8开始正式提供哨兵架构来解决这个问题。
1.2哨兵
当主节点出现故障时,哨兵(Redis Sentinel)模式下能自动完成故障发现和故障转移,并通知应用方,从而实现真正的高可用。
1.2.1故障发现
- Sentinel节点每隔1秒钟向主节点发动ping命令判断其存活状态,当主节点在down-after-milliseconds时间内没有正确的响应,则Sentinel将此主节点置为“主观下线”。主观即当前Sentinel节点单方面认为主节点不可用,并没有得到其他Sentinel节点的确认。
- 随后该Sentinel节点会通过 is-master-down-by-addr命令向其他Sentinel节点进行确认。当确认的Sentinel节点数>=quorum时,则该Sentinel节点认定该主节点“客观下线”。
- 当判定主节点为客观下线时,需要选取一个Sentinel节点作为领导者来处理故障转移工作。Redis使用了Raft算法实现领导者选举。大致选举流程如下:首先Sentinel节点确认主节点主观下线时,会像其他Sentinel节点发送is-master-down-by-addr命令,要求将自己设置为领导者。然后收到该命令的Sentinel节点,如果没有同意过其他Sentinel节点的命令,则同意该请求,否则拒绝。最后如果该Sentinel节点如果收到超过一半的意向同意,则成为领导者,如果本回合没有选出领导者,则开启下一回合。
1.2.2故障转移
步骤如下:
- 在从节点列表中选出一个节点作为新的主节点(1.先过滤掉不健康节点。2.选择从节点优先级最高的从节点,最在则返回,否则继续第三步。3.选择复制偏移量最大的节点,即复制最完整的节点,不存在则继续第四步。4.选择runid最小的从节点)。
- 将上面选出来的从节点执行slaveof no one 命令,让其成为主节点。
- Sentinel领导者节点向剩余的从节点发送命令,让他们成为新主节点的从节点。
1.3总结
哨兵机制能够自动完成故障发现和故障转移,有效的解决了Redis的高可用问题。