Redis Sentinel 服务端实现原理

Redis主从复制-master

高可用解决方案

三个定时任务

1、每10秒每个sentinel对master和slave执行info

    (1) 发现slave节点

    (2) 确认主从关系

2、每2秒每个sentinel通过master节点的channel交换信息(pub/sub)

    (1) 通过_sentinel_:hello频道交互

    (2) 交互对节点的“看法”和自身信息

3、每1秒每个sentinel对其他sentinel和redis执行ping

    (1) 心跳监测,失败判定依据

领导者选举

原因:只有一个sentinel节点完成故障转移

选举:通过 sentinel is-master-down-by-addr 命令都希望成为领导者

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

2、收到命令的sentinel节点如果没有同意其他sentinel节点发送的命令,那么将同意该请求,否则拒绝。

3、如果该sentinel节点发现自己的 number of votes 已经超过sentinel集合半数且超过quorum,那么它将成为领导者。

4、如果此过程有多个sentinel节点成为了领导者,那么将等待一段时间重新进行选择。

故障转移(sentinel领导者节点完成)

1、从slave节点中选出一个“合适的”节点作为新的master节点

2、对上面的slave节点执行 slaveof no one 命令让其成为master节点

3、向剩余的slave节点发送命令,让它们成为新的master节点的salve节点,复制规则和parallel-syncs参数有关。

4、更新对原来master节点配置为slave,并保持着对其“关注”,当其回复后命令它去复制新的master节点。

选择“合适的”slave节点

1、选择 slave-priority(slave节点优先级)最高的salve节点,如果存在则返回,不存在则继续。

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

3、选择runId最小的salve节点。

总结

1、Redis Sentinel 是Redis的高可用使用方案:故障发现、故障自动转移、配置中心、客户端通知。

2、Redis Sentinel 从Redis2.8版本开始才正式生产可用,之前版本生产不可用。

3、尽可能在不同物理机上部署Redis Sentinel所有节点。

4、Redis Sentinel 中的Sentinel节点个数应该为大于等于3且最好为奇数。

5、Redis Sentinel 中的数据节点与普通节点没有区别。

6、客户端初始化时连接的是Sentinel节点集合,不再是具体的Redis节点,但Sentinel只是配置中心不是代理。

7、Redis Sentinel 通过三个定时任务实现了Sentinel节点对于主节点、从节点其余Sentinel节点的监控。

8、Redis Sentinel 在对节点做失败判定时分为主观下线和客观下线。

9、看懂 Redis Sentinel 故障转移日志对于 Redis Sentinel 以及问题排查非常有帮助。

10、Redis Sentinel 实现读写分离高可用可以依赖 Sentinel 节点的消息通知,获取Redis数据节点的状态变化。


 

猜你喜欢

转载自my.oschina.net/u/3777515/blog/1629719