sentinel的原理

sentinel的原理

   张吉吉     2020年1月3日 01:44     320

1、平台正常运行中的sentinel

当sentinel已经启动并且平台也正常运行的时候,sentinel其实一直是处在监控整个redis系统中,sentinel一直在做三件事情。

(1)每隔1秒,就会去向主节点和从节点还有其它的sentinel节点发送ping命令以判断节点是否存活。

(2)每隔2秒,会向redis数据节点__sentinel__:hello的channel去发送消息,消息包括了对主节点的判断和当前sentinel节点的信息,而其他sentinel节点会从此channel去订阅消息,从而获知其他sentinel目前的状态,以及对主节点的判断。

(3)每隔10秒,sentinel节点就会向主节点和从节点发送info的命令,来获取redis整套系统的最新的拓扑,info命令中包含了redis节点的所有信息,通过获取这些信息,sentinel就能通过这些信息判断是否有新节点加入,或者有旧节点已经退出整体平台。

 

2、判断平台是否发生故障

那么是如何判断平台发生了故障呢?

这里有两个概念一个主观下线(S_DOWN)和客观下线(O_DOWN)。

主观下线

sentinel在每1秒都会发送ping命令来判断节点的存活,当节点超过了down-after-milliseconds没有应答后,此sentinel节点就会主观认为其已经出现问题,其实就是当前监测节点对redis节点进行的判断。

down-after-milliseconds是可以在sentinel.conf文件中进行配置的,默认的就是30s,可以根据实际情况进行更改。

 

客观下线

当sentinel主观下线的是主节点时,该sentinel节点会通过 sentinel is-master-down-by-addr 命令向其他sentinel节点询问对主节点的判断,当超过 quorum个数,就会下判定,这就是客观判定。

整个quorum个数是可以在配置文件中进行设定的。

 

下图是日志中主观下线的判定。

1.png

 

3、切换节点

(1)选取leader

<1>当sentinel节点确认主节点主观下线时,会向其他sentinel节点发送 sentinel is-master-down-by-addr 命令,要求将自己设置为leader

<2>收到命令的sentinel节点,如果没有同意过其他sentinel节点的 sentinel is-master-down-by-addr 命令,将同意该请求,否则拒绝。

<3>如果该sentinel节点发现自己的票数大于等于max(quorum,num(sentinels)/2+1),那么它就成为leader。

<4>如果此过程没有选出leader,进行下一次选举。

 

(2)故障转移

从节点中选出一个节点作为新的主节点;

过滤:不健康(主观下线、断线)、5秒内没回复过 Sentinel 节点ping响应、与主节点失联超过 down-after-milliseconds*10秒

选择 slave-priority (从节点优先级)最高的从节点

选择复制偏移量最大的从节点

选择runid最小的从节点

 

Sentinel Leader节点会对第一步选出来的从节点执行 slaveof no one 命令让其成为主节点。

Sentinel Leader 节点会向剩余的从节点发送命令,让他们成为新主节点的从节点。

Sentinel节点会将原来的主节点更新为从节点,并保持对其的关注。


推荐文章:

Redis Sentinel 架构原理详解

Redis Sentinel实现原理



其他文章