从库切换为主库,涉及三个问题
- 主库真的挂了吗?
- 该选择哪个从库作为主库?
- 怎么把新主库的相关信息通知给从库和客户端呢?
在 Redis 主从集群中,哨兵机制是实现主从库自动切换的关键机制,它有效地解决了主从复制模式下故障转移的这三个问题。
哨兵机制的基本流程
哨兵其实就是一个运行在特殊模式下的 Redis 进程,主从库实例运行的同时,它也在运行。哨兵主要负责的就是三个任务:
- 监控
- 选主(选择主库)
- 通知
主观下线和客观下线
哨兵对主库的下线判断有“主观下线”和“客观下线”两种
主观下线
哨兵进程会使用 PING 命令检测它自己和主、从库的网络连接情况,用来判断实例的状态。如果哨兵发现主库或从库对 PING 命令的响应超时了,那么,哨兵就会先把它标记为“主观下线”。
误判
主库实际并没有下线,但是哨兵误以为它下线了。误判一般会发生在集群网络压力较大、网络拥塞,或者是主库本身压力较大的情况下。
哨兵集群
采用多实例组成的集群模式进行部署
- 引入多个哨兵实例一起来判断,就可以避免单个哨兵因为自身网络状况不好,而误判主库下线的情况。
- 同时,多个哨兵的网络同时不稳定的概率较小,由它们一起做决策,误判率也能降低。
“客观下线”的标准
- 当有 N 个哨兵实例时,最好要有 N/2 + 1 个实例判断主库为“主观下线”,才能最终判定主库为“客观下线”。
- 这样一来,就可以减少误判的概率,也能避免误判带来的无谓的主从库切换。
如何选定新主库?
哨兵选择新主库的过程称为“筛选 + 打分”
- 首先,在多个从库中,先按照一定的筛选条件(在线状态、网络状态),把不符合条件的从库去掉。
- 然后,我们再按照一定的规则(优先级、复制进度、ID 号大小),给剩下的从库逐个打分,将得分最高的从库选为新主库
在选主时,除了要检查从库的当前在线状态,还要判断它之前的网络连接状态。
可以分别按照三个规则依次进行三轮打分
- 第一轮:从库优先级
- 用户可以通过 slave-priority 配置项,给不同的从库设置不同优先级
- 第二轮:从库复制进度
- 第三轮:从库 ID 号
- 在优先级和复制进度都相同的情况下,ID 号最小的从库得分最高,会被选为新主库。