- 第一轮:优先级最高的从库得分高。
用户可以通过 slave-priority 配置项,给不同的从库设置不同优先级。比如,你有两个从
库,它们的内存大小不一样,你可以手动给内存大的实例设置一个高优先级。在选主时,
哨兵会给优先级高的从库打高分,如果有一个从库优先级最高,那么它就是新主库了。如
果从库的优先级都一样,那么哨兵开始第二轮打分。 - 第二轮:和旧主库同步程度最接近的从库得分高。
这个规则的依据是,如果选择和旧主库同步最接近的那个从库作为主库,那么,这个新主
库上就有最新的数据。
如何判断从库和旧主库间的同步进度呢?
主从库同步时有个命令传播的过程。在这个过程中,主库会用
master_repl_offset 记录当前的最新写操作在 repl_backlog_buffer 中的位置,而从库会
用 slave_repl_offset 这个值记录当前的复制进度。
此时,我们想要找的从库,它的 slave_repl_offset 需要最接近 master_repl_offset。如果
在所有从库中,有从库的 slave_repl_offset 最接近 master_repl_offset,那么它的得分就
最高,可以作为新主库。
就像下图所示,旧主库的 master_repl_offset 是 1000,从库 1、2 和 3 的
slave_repl_offset 分别是 950、990 和 900,那么,从库 2 就应该被选为新主库。
当然,如果有两个从库的 slave_repl_offset 值大小是一样的(例如,从库 1 和从库 2 的
slave_repl_offset 值都是 990),我们就需要给它们进行第三轮打分了。 - 每个实例都会有一个 ID,这个 ID 就类似于这里的从库的编号。目前,Redis 在选主库
时,有一个默认的规定:在优先级和复制进度都相同的情况下,ID 号最小的从库得分最
高,会被选为新主库。
到这里,新主库就被选出来了,“选主”这个过程就完成了。
我们再回顾下这个流程。首先,哨兵会按照在线状态、网络状态,筛选过滤掉一部分不符
合要求的从库,然后,依次按照优先级、复制进度、ID 号大小再对剩余的从库进行打分,
只要有得分最高的从库出现,就把它选为新主库。
redis哨兵机制 主库挂了 如何选定新主库?笔记
最新推荐文章于 2024-07-21 21:53:33 发布