写点什么

Redis 哨兵模式

用户头像
是老郭啊
关注
发布于: 2020 年 09 月 08 日

前提:

主从模式下,若主库挂掉,从库无法进行数据同步和写入是非常危险的,因此,我们需要去监控主库是否挂掉,并且在主库挂掉之后重新选择一个从库作为主库。因此我们会引入 redis 的哨兵机制。但是,我们需要知道的是:

  • 主库是否真的挂掉

  • 选择哪个从库作为主库

  • 若哨兵挂掉了怎么办

  • 怎么将新主库的信息同步给其他从库和客户端

哨兵机制的基本流程

每个哨兵的主要负责任务: 监控 ->选主 -> 通知。

为了尽量减少因为哨兵的误判(可能是哨兵本身网络不稳定,或者是集群网络压力大,网络拥塞,亦或者是主库此时压力较大),因此会引入哨兵集群,由集群少数服从多数原则来判断主库是否客观下线。

客观下线的标准为 N/2+1 个哨兵实例判断主库为主观下线。

当集群判断主库客观下线后,那么存在两个问题

  • 怎么选择新主库

  • 由哪个哨兵实例来执行主从切换工作和通知任务

怎么选择新主库

  1. 检查从库当前的在线状态,还有之前的网络连接状态,如果从库与主库断连超出一定阈值则过滤掉这个从库。

  2. 按照用户的 slave-priority 配置项,来根据优先级打分,优先级最高的从库成为新主库,若优先级一样则进入下一轮打分。

  3. 选择复制进度最快的从库。

  4. 若出现 2 个或以上的从库分数相同,则根据 从库 ID 号来, ID 号小的得分高。

哪个实例来执行主从切换工作和通知

1.哨兵之间怎么建立连接

当我们有一个哨兵集群之后,我们应该知道他们之间是怎么通信的。哨兵实例之前是基于 pub/sub 机制,只要哨兵和主库建立起连接就可以在主库上发布消息,同时也在主库上订阅消息,获取其他哨兵发布的连接信息(ip,port 等)。

2.哨兵怎么获取从库 ip,port 信息

哨兵向主库发送 INFO 命令,主库接收到这个命令就会把从库列表返回给哨兵,哨兵就可以根据从库列表中的连接信息,和每一个从库建立连接,并在这个连接上持续对从库进行监控。

3.由哪个哨兵执行主从切换

任何一个哨兵实例只要自身判断主库为 主观下线后,就会给其他实例发送 is-master-down-by-addr 命令,其他实例会根据连接情况作出 Y or N。

哨兵只要获取仲裁所需的赞成票数(配置文件中的 quorum)就可以标记主库为 客观下线。此时该哨兵再给其他哨兵发送命令,表明希望自己来执行主从切换,这个过程称为 “Leader 选举”。

任意一个想称为 leader 的哨兵都需要满足 2 个条件:1⃣️拿到半数以上的赞成票,2⃣️拿到票数的同时要大于 quorum 值。

若出现投票结果无法选出 “leader”的情况,将会取消该轮选举,重新进行选举,为了防止一直进入死循环,哨兵对主从库的在线状态检查时会加一个小小的随机时间进行时间偏移。

用户头像

是老郭啊

关注

一位头发日渐稀疏的 90后 IT男 2020.04.07 加入

当你焦虑大于努力时,你将沦为焦虑本身。

评论

发布
暂无评论
Redis 哨兵模式