哨兵模式解决的问题
主节点宕机时,若人工选择新主节点,并将其余从节点修改为新主节点的从节点,将会十分繁琐;哨兵模式的出现就是为了解决该情况
哨兵模式概述
哨兵模式Redis提供的一种特殊模式,通过开启哨兵进程监视主节点的运行情况(判断是否宕机)
哨兵通过间歇性向主节点发送消息,以主节点是否(在指定时间内)回应作为依据,判断主节点是否宕机
哨兵会在主节点宕机后自行投票选举新主节点,并修改自身的配置文件、通过发布订阅模式通知其余从节点修改配置文件,成为新主节点的从节点
哨兵模式图解
让哨兵进行单兵作战,可能会发生问题,所以通常会建立哨兵集群,哨兵集群间也会相互监控
判断主节点是否宕机
主观下线:仅一个哨兵检测到主节点宕机时,并不会马上发起failover(故障转移),因为此时仅是该哨兵主观认为服务器宕机
客观下线:该哨兵主观认为主节点宕机后,会向其余哨兵发送is-master-down-by-addr
命令,其余哨兵会立即判断主节点是否宕机,并做出回应:肯定或否定;若最终认为主节点宕机的哨兵数大于quorum参数值(配置文件中指定),则该节点判断主节点客观下线
判断主节点客观下线后,哨兵们会进行哨兵领袖选举(故障转移的工作一个哨兵就能完成)
Leader(领袖)选举
领袖选举:哨兵们对候选者进行投票
候选者:判断主节点客观下线的哨兵
候选者会向其余哨兵发送投票命令,表明希望成为领袖,并要求其余哨兵为自己投票;哨兵们均有一次投票机会,候选者会将票投给自己
成为领袖的条件:
- 获得半数以上的赞成票
- 赞成票数大于quorum参数值
存在多个候选者时:
哨兵们会为最先收到的投票命令的发送者投票,再次收到投票命令后将拒绝投票
为什么哨兵集群的最少哨兵数为3
哨兵集群下quorum参数最小值为2,毕竟若quorum参数值为1,则会产生"独裁":主观下线与客观下线等价,此时集群就失去了意义
哨兵仅有一位时不能被称为集群,所以在此讨论哨兵有两位时的情况:
此时quorum参数值只能为2,为1会产生"独裁",大于2则哨兵失去作用:无法判断客观下线
此时是否能成功进行领袖选举?
回顾上文所说的当选领袖条件,显然赞成票数大于quorum参数值是无法实现的,故无法成功进行领袖选举
同样的思路,可验证当quorum参数值为2时、哨兵有三位时可成功进行领袖选举,故哨兵集群的最少哨兵数为3(当然,若将quorum参数设置为3,此时依旧无法成功进行领袖选举)
创建哨兵进程的命令
redis-server sentinel配置文件路径 --sentinel 或 redis-sentinel sentinel配置文件路径