Redis sentinel基本原理分为如下几方面:
- Redis sentinel的三个定时任务
- 主观下线和客观下线
- Sentinel领导者选举
- 故障转移
sentinel的三个定时任务:完成对各个节点发现和监控
一、每隔10秒,每一个sentinel节点会向主节点和从节点发送info命令得到最新的拓扑结构;
- 经过向主节点执行info命令,得到从节点的信息,这也是为何sentinel节点不须要显示配置监控从节点。
- 当有新的从节点加入时均可以当即感知出来
- 节点不可达或者故障转移后,能够经过info命令实现更新节点拓扑信息
二、每隔2秒,每一个sentinel节点会向Redis数据节点的__sentinel__:hello频道上发送该sentinel节点对于主节点的判断以及当前sentinel节点的信息,同时每一个sentinel节点也会订阅该频道,来了解其余sentinel节点以及他们对主节点的判断;
- 发现新的sentinel节点,经过订阅__sentinel__:hello频道
- sentinel节点之间交换主节点的状态,做为后面客观下线和领导者选举的依据
三、每隔1秒,每一个sentinel节点会向主节点、从节点、其他sentinel节点发送一条ping命令作一次心跳检测,来确认这些节点当前是否可达。
客观下线和主观下线
一、主观下线
每隔sentinel节点会每隔1秒对主节点、从节点、其他sentinel节点发送ping命令作心跳检测,当这些节点超过down-after-milliseconds没有进行有效回复,sentinel节点就会对该节点作失败断定,这种行为叫主观下线。
二、客观下线
当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节点负责故障转移步骤:
一、在从节点列表中选出一个节点作为新的主节点,选择方式:
- 过滤(主观下线、断线)、5秒内没有回复过sentinel节点ping响应、与主节点失联超过down-after-millionseconds*10秒
- 选择slave-priority(从节点优先级)最高的从节点列表,若是存在则返回,不存在则继续
- 选择复制偏移量最大的从节点(复制的最完整),若是存在则返回,不存在则继续;
二、sentinel领导者节点会第一步选出来的从节点执行slaveof no one命令让其成为主节点;
三、sentinel领导者会向剩余的从节点发送命令,让它们成为新主节点的从节点,复制规则和Parallel-syncs参数有关;