Redis主库挂了怎么办?

·  阅读 196

上篇文章我们搞明白了主从模式下,从库挂了也没事,客户端还能接着向其他库发送请求,那要是主库挂了咋办?大哥都没了,都没人给我们送钱了(同步数据),那还服务个屁呀,不淦了不淦了!!!

开玩笑开玩笑,为人民服务,大哥没了我们再选一个不就完事了吗?不想当大哥的小弟不是好小弟,嘿嘿嘿,这个时候我们另外一个重要的角色就登场了------哨兵

如果都是读请求,那好像没啥问题,万一要写了呢?而且肯定会写呀,主从模式是读写分离的,需要大哥也就是主库写数据的,我们看个图捋捋思路: 上面说了个解决方法,那就是让小弟们再选一个大哥出来,也就是,重新选一个主库出来。但是有几个小问题: 1、你确定大哥是真的挂了?不是睡着了? 2、还有选哪个小弟呢? 3、怎么把新上任的大哥的信息通知给客户端呢?

带着这些问题我们再往下分析。

这就不得不说哨兵机制了。在主从集群中,哨兵机制就是实现主从库自动切换的关键机制,它负责解决上面的三个问题。

哨兵机制的基本流程

首先它是个进程,主从库实例运行的时候他也在运行,他的职责就是负责监控、选主库、通知客户端。

先说说监控:就是检查看哪个实例不正常,如果从库实例没响应,哨兵就给他个标记,这个小弟不在了;如果主库没有响应,也给个标记,大哥也下线了,然后这个时候就开始自动切换主库。

具体怎么检查呢?很简单,就是在哨兵运行期间,周期的ping各个实例,看是否有响应。

切换主库流程就是哨兵的第二个任务选主库,按照一定的规则选出来。具体什么规则我们一会儿再说,别着急。

然后就是通知了,哨兵会把新主库的连接信息发送给其他从库,让他们执行replicaof命令,和新主库进行连接,并且同步数据。同样也会把新主库的连接信息发送给客户端,让他们把请求操作发到新主库上。

三个任务中,通知是最简单的,也不需要做什么决策,直接通知就行了。

难得是监控和选主这两方面!!!为啥呢?凭啥你说我下线就下线了?我睡着了还不行?还有你凭啥就把二狗子选上了?三愣子他得罪你了吗? 看看,哨兵也不容易呀!

不过总有解决方式的,我们先说说下线这个问题。

哨兵对主库的下线还有两个判断,主观下线和客观下线两种

主观下线和客观下线

主观下线就是哨兵用PING命令,如果实例响应超时,这就判断主观下线。 检查的如果是从库,标记好久ok了,影响不大,下线对外的服务也不会间断,如果是主库,就不能直接标记下线,因为有可能哨兵误判!!!,这影响就大了。

啥叫误判?就是主库实际并没有下线,只是可能集群网络压力大,拥堵,或者主库本身压力大导致没有及时响应PING命令。

那咋办嘛? 那我多搞几个哨兵不就行了?总不能每个都误判吧!!!这就是哨兵集群 只有大多数的哨兵判断主库主观下线,然后主库才会被标记客观下线,这里有个原则,少数服从多数。这也会进一步触发哨兵开始主从切换流程。

到这里我们就知道如何确定主库是否下线了

确定主库确实是完蛋咯,那我们还的接着服务呀,这个时候就要选一个新的主库了。

如何选定主库

哨兵选这个过程简单可以说成是 筛选+打分 筛选就是按照一定的条件把不符合的筛出去,就比如说二狗子天天拔你网线(一个从库实例老是连接中断。成了主库还是断,那选他搞毛啊),你肯定要把他给筛出去呀,然后再按照一定的规则给剩下的从库打分,谁的分高就选谁!!!

筛选条件具体咋判断呢?

其实Redis有个配置项 down-after-milliseconds * 10,这个是我们认定主从库断连的最大连接超时时间,如果这个时间内都没有连接成功,我们就认定主从节点断连了,如果断连次数超过了10次,说明这个从库的网络状态不好,不适合上位当主库。

筛选完了,开始打分了。

按照三个规则打三轮分,这三个规则分别是从库优先级,从库复制进度以及从库ID号

第一轮从库优先级: 用户通过slave-prioity配置项,设置从库的优先级。这个是手动设置的。

如果优先级都一样那就进行第二轮被呗!!!

第二轮和旧主库同步程度最接近的从库得分高 如何判断呢? 之前介绍过主从同步时,主库会用master_repl_offset记录当前的最新写操作在repl_backlog_buffer的位置,从库的slave_repl_offset最接近这个位置就得分高。

当然如果位置接近的值都一样,那就进行第三轮呗!!1

第三轮:ID号最小的从库得分高

Redis在选择主库时有个默认的规则:优先级和复制进度相同的情况下,ID号最小的从库得分高。这个ID值是每个实例都不同的,类似与编号。

这里就基本完成了上位选主库的操作。

给大家留个思考题,你可以把答案留在评论区,点赞最多的送你个么么么哒。 哈哈哈哈

如果主从切换的时候,客户端能正常进行请求操作吗?

感谢阅读,感觉有收获就点个赞呗!!!

分类:
阅读
标签:
分类:
阅读
标签: