Redis大乱探------哨兵(二)

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的高可用问题。

            

猜你喜欢

转载自my.oschina.net/u/3475585/blog/1824112