一、什么是哨兵模式
哨兵模式:监控整体工作过程,并根据监控的服务情况,进行主从切换(基于主从模式的基础上)
工作原理:哨兵在经历主从切换过程中经历了三个阶段
- 监控(同步信息)
- 通知(保持联通)
- 故障转移(1、发现问题;2、竞选负责人;3、优选新master;4、新master上任,其他slave切换新master,原master作为slave故障回复后连接)
二、监控阶段(阶段一)
用于同步各个节点的状态信息
1、获取各个sentinel的状态(是否在线)
2、获取master的状态
(1)master属性
- runid
- role:master
(2)各个slave的详细信息
3、获取所有slave的状态(根据master中的slave信息)
slave属性
- runid
- role:master
- master_host、master_port
- offset
- ....
sentinel会向master、slave以及其他sentinel获取状态
sentinel之间会 组件“对应频道”,大家一起发布信息、订阅信息、收集信息、同步信息等
三、通知阶段(阶段二)
维护长期信息对等阶段
sentinel群体会进行信息互通
sentinel会通过建立的命令链接(cmd链接)获取(master、slave)对应的工作状态,不管是哪个sentinel获取到,都会把信息回传,并且同步给其他sentinel
三、故障转移阶段(阶段三)【重点】
1、sentinel1 向master发送一个指令,尝试多次没有响应,那么会将自己信息里的master标记一个状态主观下线(SRI_S_DOWN)认为下线了,并将信息传播到 sentinel 内网中。
2、其他 sentinel 收到消息后,也会去尝试向master发送指令,如果没有收到响应那么,会同上面做相同的操作
3、单个sentinel 认为下线是 主观下线(SRI_S_DOWN) 但是当 超过半数的 sentinel 都认为下线了,那么就会认为是 客观下线(SRI_O_DOWN)
4、一旦标记为客观下线 那么进入下一阶段,选择处置的人选进行清理队伍
- 多个sentinel 同时发送处理指令(需要处理的IP、端口);
- 开始竞选真正由谁来处理(为了保障自己能够得到处理权,则将自己的竞选次数带上)
- 进行投票选举:每个sentinel 作为参选者同时也是投票者,都拥有一票(当多个sentinel 同时将消息发送到内网中时,sentinel 认为先接到谁广播发送的内网消息,则自己把这一票投给谁,如果多个消息同时到达一个sentinel,那么该sentinel会根据先后顺序,将票投给先到达的一方)
- 按照这种机制,所有的信息沟通完毕后会得到一个结果,票数最多的当选(如果存在相同票数的,那么就会再来一轮竞选,没经历一轮竞选次数会+1)
5、投票选举出处置的 sentinel 后,该sentinel 在备选的slave中选择一个做为新的master
选取规则
- 选取在线的
- 选取响应快的(sentinel 会一直和 slave 做请求,需要从中优先选取响应快的,剔除慢的)
- 与原先的master断开时间(剔除和master断开时间长的slave;例如:有三个据上次连接时间间隔分别是4秒,6秒,8秒,则将8秒的剔除,需要知道哪个slave和master保持的关系比比较近,关系近的留下来)
- 优先原则【优先级、offset、runid】
6、sentinel 发送指令
- 告诉选定好的 slave 你将是新的 master ;发送slave of no one(与旧master断开)
- 向其他slave发送 slave of 新 master IP 端口(告诉所有 slave 别连就的master了,去连这个新的)