Sentinel(哨兵)是Redis高可用性的解决方案:由一个或多个Sentinel示例组成Sentinel系统,监视任意多个主服务器及其从服务器。
Sentinel本质上是一个运行在特殊模式下的Redis服务器。
Sentinel可视作主服务器的一个客户端,每10秒一次向被监视的主服务器发送INFO命令,通过收到的回复来获取主服务器的信息。
1.1 主观下线
Sentinel每秒一次向所有与它建立了命令连接的实例(包括主服务器、从服务器、其他Sentinel)发送PING命令,通过回复来判断是否在线。如果在一定时间返回无效回复,就判断为主观下线。
1.2 客观下线
Sentinel一旦判断某个主服务器为主管下线后,为了确认,会向监视该主服务器的其他Sentinel进行询问,超过一定数量的回复下线就将其判断为客观下线。
1.3 选举领头Sentinel
当一个主服务被判断客观下线时,监测该服务器的各个Sentinel就会进行协商,选举一个领头的Sentinel,由领头Sentinel对下线的主服务器进行故障转移操作
选举方式:Raft算法
每个Sentinel都有被选举的机会,通过投票选举,过半当选。
1.4 故障转移
领头Sentinel执行的故障转移操作有三个步骤:
- 从下线的主服务器属下的所有从服务器里面挑选一个,将其转换为主服务器
- 其他的从服务器改为复制新的主服务器
- 将下线的主服务器设置为新主服务器的从服务器
1.4.1 选举新主服务器
领头Sentinel将所有从服务器保存到一个列表,剔除下线的、5秒内没有回复的、与下线主服务器断开超时的从服务器,保证备选的从服务器都是正常在线并成功通信的,且数据比较新。
最后根据下面规则挑选(存在相同的就看下一个条件):
- 优先级最大
- 偏移量最大
- ID最小