redis哨兵原理
作者:向前的步伐 / 发表: 2021年5月28日 00:24 / 更新: 2022年4月27日 08:47 / redis / 阅读量:666
一、简介
哨兵是redis提供的一种高可用的方式,哨兵是一个独立的进程,通过发送命令、等待redis服务响应,从而实现集群的监控和故障的转移。它的原理的实现主要包括哨兵的三个定时任务、主观下线和客观下线、哨兵的领导者选举、故障转移。
二、三个定时任务
一套合理的监控机制,是哨兵判断节点可不可达的重要保证,redis哨兵通过3个定时任务完成对各个节点的监控。
1,每隔10秒,每个哨兵节点会向主节点和从节点发送info命令来获取集群的最新拓扑结构。
在redis主节点上执行info replication可以看到节点的拓扑信息:
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=3937,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=3937,lag=1
从这信息可以找到主节点下的从节点的信息,可以监控从节点。所以哨兵只需要显示配置主节点,从节点的信息可以通过info命令来获取,再进行监控。
2,每隔2秒,每个哨兵节点会向redis数据节点的__sentinel__:hello频道上发送该哨兵节点对主节点的判断,以及当前哨兵节点的信息;其他的哨兵节点通过订阅的方式,来了解其他哨兵节点的信息以及对主节点的判断。
通过订阅主节点的__sentinel__:hello频道来获取到其他哨兵节点的信息;同时哨兵节点之前可以交换主节点的判断信息,作为后面客观下线以及领导者选取的依据。
哨兵节点的publish信息格式:
<Sentinel节点IP> <Sentinel节点端口> <Sentinel节点runId> <Sentinel节点配置版本> <主节点名字> <主节点Ip> <主节点端口> <主节点配置版本>
3,每个1秒,哨兵节点会向主节点、从节点、其他的哨兵节点发送ping命令做一次心跳检测,来确定服务是否可达。
哨兵对主节点、从节点和其他的哨兵节点建立起连接,实现对所有节点的监控。
三、主观下线和客观下线
1,主观下线
哨兵节点会向集群中的其他节点发送ping命令做心跳检测,但这些节点的响应速度超过设置的down-after-milliseconds时,哨兵节点会认为该节点不可达,这就是主观下线。
2,客观下线
当主观下线的节点是主节点时,该哨兵节点会向其他哨兵节点发送sentinel is-master-down-by-addr命令来询问主节点的判断,当超过quorum个数哨兵认为主节点有问题,这时该节点会对主节点做客观下线,也就是大部门哨兵节点都认为主节点不可达。
这里询问其他节点的主节点的命令为:
sentinel is-master-down-by-addr <ip> <port> <current_epoch> <runid>
- ip:主节点的IP
- port:主节点的端口
- current_epoch:当前配置纪元
- runid:此参数有两种类型,不同的类型决定了此API做用的不同
当runid等于’*‘时,作用就是哨兵节点直接交换对主节点的判断。
当runid等于当前哨兵节点的runid时,作用就是当前哨兵节点希望目标节点同意自己成为领导者,发起领导者的选举。
例如:当其中一个哨兵对主节点做了主观下线之后,就会向其他的哨兵节点发送:
sentinel is-master-down-by-addr 127.0.0.1 6379 0 *
返回的结果包含三个参数:
- dowm_state:目标哨兵节点对主节点的下线判断:1是下线,0是在线。
- leader_runid:当leader_runid为’*‘时,代表结果是用来判断主节点是否下线的;当runid为具体的runid时,代表目标节点同意runid成为领导者。
- leader_epoch:领导者纪元。
四、领导者哨兵节点的选举
当哨兵节点发现主节点下线之后,并不会马上进行故障转移,而是需要选举一个哨兵节点做为领导者,再由领导者进行故障转移。大致的思路如下:
1,每个哨兵节点都有资格成为领导者,当它确认主节点主观下线之后,会向其他哨兵节点发送sentinel is-master-down-by-addr命令,并要求设置自己成为领导。
2,收到命令的哨兵节点,如果没有同意过其他哨兵节点的sentinel is-master-down-by-addr命令,就会同意,否则拒绝。
3,如果该哨兵节点发现自己的票数大于max(quorum,num(sentinel/2+1)),那么它将成为领导者。
4,如果此过程没有选举出领导者,将进入下一轮选举。
五、故障转移
被选举为领导者的哨兵节点负责主节点的故障转移,具体步骤如下:
1,在从节点列表中选出一个节点作为主节点,选择方法如下:
- 过滤不健康(主观下线)、5秒内没有回复过哨兵节点ping命令的、与主节点失联超过down-after-milliseconds*10秒的。
- 选择slave-priority(从节点优先级)最高的从节点,如果存在就返回,没有就继续。
- 选择复制偏移量最大的从节点(复制的最完整),如果存在则返回,没有就继续。
- 选择runid最小的从节点。