Redis sentinel基本原理分为以下几方面:
- Redis sentinel的三个定时任务
- 主观下线和客观下线
- Sentinel领导者选举
- 故障转移
sentinel的三个定时任务:完成对各个节点发现和监控
1、每隔10秒,每个sentinel节点会向主节点和从节点发送info命令获得最新的拓扑结构;
- 通过向主节点执行info命令,获得从节点的信息,这也是为什么sentinel节点不需要显示配置监控从节点。
- 当有新的从节点加入时都可以立即感知出来
- 节点不可达或者故障转移后,可以通过info命令实现更新节点拓扑信息
2、每隔2秒,每个sentinel节点会向Redis数据节点的__sentinel__:hello频道上发送该sentinel节点对于主节点的判断以及当前sentinel节点的信息,同时每个sentinel节点也会订阅该频道,来了解其他sentinel节点以及他们对主节点的判断;
- 发现新的sentinel节点,通过订阅__sentinel__:hello频道
- sentinel节点之间交换主节点的状态,作为后面客观下线和领导者选举的依据
3、每隔1秒,每个sentinel节点会向主节点、从节点、其余sentinel节点发送一条ping命令做一次心跳检测,来确认这些节点当前是否可达。
客观下线和主观下线
1、主观下线
每隔sentinel节点会每隔1秒对主节点、从节点、其余sentinel节点发送ping命令做心跳检测,当这些节点超过down-after-milliseconds没有进行有效回复,sentinel节点就会对该节点做失败判定,这种行为叫主观下线。
2、客观下线
当sentinel主观下线的节点是主节点时,该sentinel节点会通过sentinel is-master-down-by-addr命令向其他sentinel节点询问对主节点的判断,当超过quorum个数,sentinel节点认为主节点确实有问题,这时该sentinel节点会做出客观下线的决定。
领导者sentinel节点选举
假如sentinel节点对主节点做出了客观下线,需要在sentinel集群中选举出一个领导者进行故障转移。
Redis使用Raft算法实现领导者选举,具体步骤:
- 每个在线的sentinel节点都有资格成为领导者,当一个sentinel节点确认主节点客观下线时,会向其他sentinel节点发送sentinel is-master-down-by-addr命令,要求将自己设置为领导者
- 收到命令的sentinel节点,如果没有同意其他sentinel节点的sentinel is-master-down-by-addr命令,将同意该请求,否则拒绝;
- 如果该sentinel及诶单发现自己的票数已经大于max(quorum,num(sentinel)/2+1),那么它将成为领导者;
- 如果此过程没有选举出领导者,将进行下一次选举;
- 每个sentinel节点只有一票;
故障转移
领导者sentinel节点负责故障转移步骤:
1、在从节点列表中选出一个节点做为新的主节点,选择方式:
- 过滤(主观下线、断线)、5秒内没有回复过sentinel节点ping响应、与主节点失联超过down-after-millionseconds*10秒
- 选择slave-priority(从节点优先级)最高的从节点列表,如果存在则返回,不存在则继续
- 选择复制偏移量最大的从节点(复制的最完整),如果存在则返回,不存在则继续;
2、sentinel领导者节点会第一步选出来的从节点执行slaveof no one命令让其成为主节点;
3、sentinel领导者会向剩余的从节点发送命令,让它们成为新主节点的从节点,复制规则和Parallel-syncs参数有关;