1)哨兵模式原理
①哨兵如何实现相互监督的功能
- 哨兵通过发布订阅__sentinel__:hello channel来实现这个功能。每个哨兵每隔2s会向自己监控的所有主从Redis节点发送hello message,包括自己的IP、端口、运行ID、自己监控的Master节点IP、Master节点端口。
- 所有主从Redis节点也会反馈这样的信息
②哨兵如何故障检测
基于多数投票原则
第一:某个哨兵节点判定master节点故障,他会投出一票S_DOWN(主观下线)
第二:当有足够多的sentinel节点判定master节点故障都投出S_DOWN票时,master节点会被认为是真正的下线了(客观下线)。
③哨兵模式如何实现故障恢复
故障恢复需要完成如下几步操作:
第一:通过选主机制选择新的Master节点替换掉原来的故障节点
第二:其他的节点成为Slave节点用于主从复制,也就是不变
第三:告知客户端新的master节点地址信息,同时执行必要的脚本来通知系统管理员。
(2)选主机制
过程:
sentinel的选举过程基本上是Raft协议的实现,即所有节点会随机休眠一段时间,然后发起拉票,当某个节点获得的票数超过max(sentinel|/2 + 1), qurom时,该节点就被推选为leader节点。注意是哨兵去从节点里面选。
到底选谁呢?
①根据指定的优先级选择
管理员在启动edis slave节点的时候,指定了其优先级,哨兵会先从优先级高的从节点去选择。
②根据数据更新程度选择
优先级相同,所有slave节点复制数据的时候都会记录复制偏移量,哨兵会选择复制偏移量最大的slave节点,因为值越大说明与master节点的数据更一致。
③根据runid选择:
Redis 每个节点启动的时候都会分配有一个唯一的runId, 选择runId最小的slave节点。