哨兵机制的作用是实现主从集群的故障自动恢复,帮助选取新的主节点维护主从集群正常运行。
哨兵的作用
监控
监控的意思是不断检查master和slave是否正常工作。
主观下线
哨兵每隔一秒(可调)会向主从集群中的每一个节点发送ping命令,存活的节点会发送响应给哨兵,如果节点没有发送响应给哨兵,则认为该节点主观下线了。
客观下线
为了防止网络拥塞等原因造成单个哨兵误判现象,当超过quorum(quorum值一般为哨兵个数的一半+1)的哨兵数量认为该节点主观下线时,该节点客观下线。
故障恢复
当哨兵集群认为主从集群中的主服务器客观下线后,要重新选择一个新的主服务器,在此之前,先进行哨兵集群的选主。
哨兵选主
主从集群中的主服务器客观下线的同时哨兵集群会选择一个leader进行主从集群的重新选主。
候选者:判断主节点客观下线的哨兵可以当候选者
- 假若哨兵A主动判断master主观下线,就向其他哨兵发送命令,其他哨兵收到命令后判断主节点是否主观下线,如果是,可以向A投赞同票。
- 如果A收到的赞同票数超过quorum值,该主节点客观下线,并且A成为候选者。
- A成为候选者后想成为leader,于是向其他哨兵发起请求投票,每个哨兵都有一次投票机会。
- 如果A拿到一半以上赞同票并且票数大于等于quorum值,则成为leader。
主从故障转移
-
选出新主节点。判断依据: 网络状态(slave与master断开时间的长短,如果超过指定值,就排除该节点 > slave的优先级(slave-priority)> 复制进度 > 节点ID(越小越优先)。
-
哨兵leader对新主节点发送slaveof no one命令。
- 哨兵对其他节点发送slaverof 新主节点ip命令。
- 通知客户端主节点已经更换。客户端与哨兵连接之后会订阅哨兵频道,主从切换完成后哨兵发布新主节点的ip和端口号到相应频道上,客户端就可以收到信息。
- 对故障节点标记成slave,故障恢复后slaveof新主节点。
创建哨兵
1. 创建配置文件sentinel.conf
sentinel monitor <主节点名字> <主节点IP> <主节点端口号> <quorum>
2. 执行redis-sentinel /sentinel.conf
发布者/订阅者模式
当启动哨兵之后,哨兵就会订阅主节点上的频道,并且把自己的IP地址和端口信息发布到频道上,其他哨兵也订阅了这个频道,所以每个哨兵都可以获取其他哨兵和主从节点的信息。