Redis Sentinel
一:订阅与监视
Sentienl会订阅监视master节点,slave节点和其他订阅当前这个master的sentinel节点
- Sentinel是如何监视master节点的
- 根据配置默认会以每十秒一次的频率通过命令连接向被监视的主服务器发送INFO命令,并通过INFO命令获取主节点的信息
- 创建的是命令连接和订阅连接
- Sentinel是如何监视slave节点的
- 上一步提到的INFO命令,不仅会提供主节点的信息,还会提供主节点的从节点信息
- 创建的是命令连接和订阅连接
- Sentinel是如何监视其他订阅当前这个master的sentinel节点
- 通过下面的tips中的描述,sentinel可以通过主服务器的订阅频道获取到其他sentinel节点的信息
- sentinel和sentinel节点之间只会建立命令连接
tips:
订阅链接:专门用于订阅其他服务器的_sentinel_:hello频道。例如sentinel1向主服务的_sentinel_:hello频道发送了一条信息,其他订阅了该主服务器的_sentinel_:hello的sentinel节点(包括sentinel1都能够收到这条消息)
命令连接:用于向其他服务器发送命令
二:下线
主观下线与客观下线
Sentinel会向其他节点(主服务器、从服务器、其他的Sentinel节点)发送PING命令,其他节点会对该发送节点有两种情况的回复(每秒一次的频率)
- 有效回复: +PONG 、-LOADING 、 -MASTERDOWN 三种回复中的一种
- 无效回复:除了有效回复之外的回复或指定时间内没有返回任何回复
主观下线:
在上述的命令发送持续一段时间都收到的是无效回复,此时sentinel便会判定对应节点为主观下线状态(SRI_S_DOWN)
对应的配置项见下:
// 这个时间不仅会作用于主节点,还会作用于主节点属下的从节点,其他订阅该主节点的sentinel节点
sentinel down-after-millisenconds master 50000
不同的sentinel对下线的配置时间不同,所以他们判断主观下线的情况可能也会不一样
客观下线:
当sentinel节点认为一台主服务器下线之后,会向其他的sentinel节点发送一下操作来询问其他sentinel节点是否同意该主节点下线(如果超过一定数量的sentinel节点认为该主节点已经下线,则该主节点就会被判断为客观下线 该数量与当前的sentinel节点配置的数量有关)(SRI_O_DOWN)
# ip 主服务器ip
# port 主服务器端口
# sentinel当前的配置纪元
# 此处runid可以用*,用*只是为了检测主服务器的下线状态。若不是用*,则是用于选举领头的sentinel(后续介绍)
SENTINEL is-master-down-by-addr <ip> <port> <current_epoch> <runid>
# 其他的sentinel服务器会返回一条包括三个参数的Multi Bulk回复做为该命令的回复
<down_state> 目标节点对主服务器的检查结果 1已下线,0未下线
<leader_runid> *或目标sentinel的局部领头sentinel的运行id
<leader_epoch> 目标sentinel的局部领头sentinel的配置纪元
# 当前sentinel只有在有五台sentinel节点认为该主节点主观下线的情况下,才会将当前的主节点设置为客观下线
sentinel monitor master 127.0.0.1 6379 5
如何选举领头Sentinel节点去执行下线操作
-
所有在线的sentinel节点都有选举成为领头节点的机会
-
每次进行领头sentinel选举之后,无论是否选举成功,所有的sentinel的配置纪元都会自增一次(configuration epoch)
-
所有的sentinel节点都会要求其他进入客观下线的sentinel节点将自己设置为局部领头sentinel(一旦设置局部领头,在这个配置纪元里面局部领头就不能修改)
-
设置局部零头的命令(此处采用先到先得的原则)
# current_epoch 当前竞选局部领头的sentinel节点的配置纪元,runid 当前竞选局部领头的sentinel节点的运行id SENTINEL is-master-down-by-addr <ip> <port> <current_epoch> <runid> # 其他被设置sentinel节点会返回 <down_state> 目标节点对主服务器的检查结果 1已下线,0未下线 <leader_runid> *或目标sentinel的局部领头sentinel的运行id <leader_epoch> 目标sentinel的局部领头sentinel的配置纪元
-
只有超出半数(n/2+1)的sentinel节点都将某个sentinel节点设置为局部领头节点,该节点才会成功领头节点。如果在指定时间内没有领头节点被选举出来,则会在一段时间后在此进行选举,直到选出位置
如何选举出新的主节点
- 删除所有已经下线或断线状态的从服务器
- 删除最近五秒内没有回复过领头sentinel的info命令的从服务器
- 删除所有与已下线服务器断开超过 down-after-milliseconds * 10 毫秒的从节点(保证从节点都是最新的原下线主节点的从节点)
- 选举从服务器中优先级最高的从服务器
- 如果优先级相同,选出偏移量最大的从节点
- 如果偏移量也相同,则选出运行id最小的从节点
主从复制的方式与上篇文章讲的相同
网友评论