社区专栏>Redis哨兵机制>
主库挂了,如何不间断服务?
- 无论是写服务中断,还是从库无法进行数据同步,都是不能接受的。
- 涉及到三个问题:
- 主库真的挂了么?
- 该选择哪个从库作为主库?
- 怎么把新主库的相关信息通知给从库和客户端呢?
- 在 Redis 主从集群中,哨兵机制是实现主从库自动切换的关键机制,它有效地解决了主从复制模式下故障转移的这三个问题。
- 哨兵其实就是一个运行在特殊模式下的 Redis 进程,主从库实例运行的同时,它也在运行。哨兵主要负责的就是三个任务:
监控、选主和通知
。
- 监控是指哨兵进程在运行时,周期性地给所有的主从库发送 PING 命令,检测它们是否仍然在线运行。
- 如果从库没有在规定时间内响应哨兵的 PING 命令,哨兵就会把它标记为“下线状态”;
- 同样,如果主库也没有在规定时间内响应哨兵的 PING 命令,哨兵就会判定主库下线,然后开始
自动切换主库
的流程。
- 实际使用过程中,往往存在哨兵集群,
多个
哨兵都PING不通主库,才会判定为真正下线(客观下线)。
- 主库挂了以后,哨兵就需要从很多个从库里,按照
一定的规则
选择一个从库实例,把它作为新的主库。
- 这一步完成后,现在的集群里就有了新主库。
- 规则包含
筛选+打分
,筛选掉不符合条件的从库,然后给剩余实例打分,分高者作为新主库。
- 筛选:从库要在线,且网络要好,可以使用配置项
down-after-milliseconds * 10
,down-after-milliseconds 是主从库断连的最大连接超时时间,断连超过10次,可以认为该从库的网络不好。
- 打分,某一轮存在最高分的从库,则结束打分,该从库变为新主库:
- 第一轮:优先级高的,
参考 slave-priority这个配置
。
- 第二轮:和旧主库同步程度最接近的,同步游标
slave_repl_offset
最接近 master_repl_offset
。
- 第三轮:ID 号小的,从库的编号。
- 在执行通知任务时,哨兵会把新主库的连接信息发给其他从库,让它们执行 replicaof 命令,和新主库建立连接,并进行数据复制。
- 同时,哨兵会把新主库的连接信息通知给客户端,让它们把请求操作发到新主库上。
主库挂了,如何不间断服务?
- 无论是写服务中断,还是从库无法进行数据同步,都是不能接受的。
- 涉及到三个问题:
- 主库真的挂了么?
- 该选择哪个从库作为主库?
- 怎么把新主库的相关信息通知给从库和客户端呢?
- 在 Redis 主从集群中,哨兵机制是实现主从库自动切换的关键机制,它有效地解决了主从复制模式下故障转移的这三个问题。
- 哨兵其实就是一个运行在特殊模式下的 Redis 进程,主从库实例运行的同时,它也在运行。哨兵主要负责的就是三个任务:
监控、选主和通知
。
- 监控是指哨兵进程在运行时,周期性地给所有的主从库发送 PING 命令,检测它们是否仍然在线运行。
- 如果从库没有在规定时间内响应哨兵的 PING 命令,哨兵就会把它标记为“下线状态”;
- 同样,如果主库也没有在规定时间内响应哨兵的 PING 命令,哨兵就会判定主库下线,然后开始
自动切换主库
的流程。
- 实际使用过程中,往往存在哨兵集群,
多个
哨兵都PING不通主库,才会判定为真正下线(客观下线)。
- 主库挂了以后,哨兵就需要从很多个从库里,按照
一定的规则
选择一个从库实例,把它作为新的主库。
- 这一步完成后,现在的集群里就有了新主库。
- 规则包含
筛选+打分
,筛选掉不符合条件的从库,然后给剩余实例打分,分高者作为新主库。
- 筛选:从库要在线,且网络要好,可以使用配置项
down-after-milliseconds * 10
,down-after-milliseconds 是主从库断连的最大连接超时时间,断连超过10次,可以认为该从库的网络不好。
- 打分,某一轮存在最高分的从库,则结束打分,该从库变为新主库:
- 第一轮:优先级高的,
参考 slave-priority这个配置
。
- 第二轮:和旧主库同步程度最接近的,同步游标
slave_repl_offset
最接近 master_repl_offset
。
- 第三轮:ID 号小的,从库的编号。
- 在执行通知任务时,哨兵会把新主库的连接信息发给其他从库,让它们执行 replicaof 命令,和新主库建立连接,并进行数据复制。
- 同时,哨兵会把新主库的连接信息通知给客户端,让它们把请求操作发到新主库上。