三分钟带你入门 -redis- 高可用架构之哨兵,大厂 Java 高级面试题汇总解答
1、监听服务器
每个 Sentinel 节点每隔 1 秒对主节点、从节点、其他 Sentinel 节点发送 ping 命令做心跳检测,来判断服务器的状态。
节点也会对 Sentinel 进行相应的回复,在这些回复中,以下三种回复是有效回复:
返回 +PONG
返回 -LOADING
返回 -MASTERDOWN
如果节点在哨兵配置文件设置的 master-down-after-milliseconds 选项的值内,一直没有哪怕一次有效回复,那么 Sentinel 会把该服务器标记为下线状态,我们把这种下线称为主观下线,也就是说只有这个 sentinel 认为该服务器是下线状态。
如果被主观下线的服务器是主服务器时,sentinel 为了确认这个主服务器是否真的下线,该 Sentinel 会向其他的同样监听主服务器的 Sentinel 进行询问,看他们是否也认为主服务器进入下线状态,当有足够多的 Sentinel 都认为主服务器下线时,该 Sentinel 会将主服务器判断为客观下线,这是真正的下线了,并且会对它进行故障转移操作。
2、选举 Sentinel 节点完成转移任务
故障转移并不是所有的 sentinel 共同完成,而是选举出一台 sentinel 节点作为领导者来完成这次故障转移,所以当主服务器被标记为客观下线时,sentinel 之间就会通过 Raft 算法选举出一个领导者来完成故障转移工作。redis 选举领头的 sentinel 的规则和方法大致如下:
所有在线的 sentinel 都有资格被选为领导者,也就是说每个 sentinel 都有成为领导者的机会
当 sentinel 标记主服务器为主观下线时,会向其他 Sentinel 节点发送 sentinel is-master-down-by-addr 命令, 要求将自己设置为领导者
收到命令的 Sentinel 节点,采用先到先得的规则,如果没有同意过其他 Sentinel 节点的 sentinel is-master-down-by-addr 命令,将同意该请求,否则拒绝
如果该 Sentinel 节点发现自己的票数已经超过半数,那么它将成为领导者
如果在规定时间内,没有选举出 sentinel 领导者,那么将在一段时间后再次选举,知道选出 sentinel 领导者为止。
3、选举新 master 服务器完成故障转移
选举出来的 sentinel 领导者将完成剩下的故障转移工作,故障转移主要有以下三步:
1、挑选出新的主服务器
在已下线的主服务器的所有从服务器中,挑选出一个从服务器,并将其转换为主服务器,选择新的主服务器的规则如下:
在失效主服务器属下的从服务器当中, 那些被标记为主观下线、已断线、或者最后一次回复 PING 命令的时间大于五秒钟的从服务器都会被淘汰
在失效主服务器属下的从服务器当中, 那些与失效主服务器连接断开的时长超过 down-after 选项指定的时长十倍的从服务器都会被淘汰
在经历了以上两轮淘汰之后剩下来的从服务器中, 选出复制偏移量(replication offset)最大的那个从服务器作为新的主服务器;如果复制偏移量不可用, 或者从服务器的复制偏移量相同, 那么带有最小运行 ID 的那个从服务器成为新的主服务器
对挑选出来的从服务器执行 slaveof no one 命令,使其成为主节点。
2、修改其他从服务器的复制目标
当新的主服务器出现后,sentinel 的领导者下一步需要做的就是,让其他从服务器去复制新的主服务器,通过向其他从服务器发送 slaveof new_master port 命令来完成,复制规则和配置文件的 parallel-syncs 参数有关
3、将旧的主服务器变成从服务器故障转移操作最后要做的就是将已下线的主服务器设置为新的主服务的从服务器,并保持对其关注,等它恢复后命令它去复制新的主节点。
以上就是我今天要分享的 redis 哨兵知识,希望看完之后你有所收获。
最后
这份《“java 高分面试指南”-25 分类 227 页 1000+题 50w+字解析》同样可分享给有需要的朋友,感兴趣的伙伴们可挑战一下自我,在不看答案解析的情况,测试测试自己的解题水平,这样也能达到事半功倍的效果!(好东西要大家一起看才香)
CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】
评论