哨兵模式是指通过多个 Sentinel 实例监视 Redis 节点的状态:在某个 master 节点下线后,从 slave 节点中选举新的 master 节点,保证服务正常运行
Sentinel 判断某个 Redis 节点是否下线的逻辑如下:
默认 Sentinel 每秒发送 PING 命令给所有监视的节点(包含 master、slave、sentinel 节点),通过节点返回判断是否下线。如果某个节点在 down-after-miliseconds 毫秒内连续返回无效答复,Sentinel 修改该节点对应数据结构、在 flags 属性设置 SRI_S_DOWN 标识,标识该节点处于主观下线状态
除了主观判断外,Sentinel 还需借助其它 Sentinel 实例进行客观判断:
Sentinel 向同样监视对应节点的 Sentinel 实例询问,判断对应节点是否已下线
- 如果接收到足够数量(quorum 属性配置)的下线确认,Sentinel 修改该节点对应数据结构,在 flags 属性设置 SRI_O_DOWN 标识,标识该节点客观下线
- 如果没有收到足够数量的下线确认,移除节点的客观下线状态
- 如果节点返回 PING 命令结果有效,移除节点的主观下线状态
处于客观下线的节点如果是 master 节点,需要执行故障转移操作:
- 发起选举,选举出 master Sentinel 节点
- master Sentinel 从已下线的 master 节点的 slave 节点中选出一个升为 master 节点
- master Sentinel 设置所有 slave 节点从新的 master 节点同步数据
- master Sentinel 修改 old master 下线节点配置,当它重启后变为 slave 节点