前言
Redis主从同步是提升了可用性,从库挂了,还有多个从库可以使用。但是如果主库挂了,该怎么办呢?
这就要提到哨兵机制了。在Redis主从集群中,哨兵机制是实现主从库自动切换的关键机制,有效的解决了主从复制模式下故障转移的问题。
哨兵机制的基本流程
哨兵机制就是一个运行在特殊模式下的Redis进程,主从库实例运行的同时,它在运行。
哨兵主要负责的三个任务:监控、选主和通知。
监控
哨兵在运行时,周期性的会给主库和从库发送PING命令,对应的主库或者从库没有在规定时间内响应,则会标记为“下线状态”。
自动切换
主库挂了之后,哨兵需要从多个从库里,按照一定规则,选举一个从库为主库。
通知
哨兵会将新的主库信息发送给其他从库,让他们执行replicaof命令, 和新主库建立连接,并进行数据复制。
同时新的主库信息会通知给客户端,让他们将新的请求发送到新主库上。
主观下线和客观下线
上面我们提到,哨兵进程会通过PING命令检测它和主从库网络的连接状况,用来判断示例的状态。
如果检测的是从库,简单的标记为“主观下线”即可,因为从库下线影响不大,集群对外服务不会间断。
如果检测的是主库,则不能轻易标记为“主观下线”。因为哨兵存在误判的情况,主库其实没有故障。但是一旦开启了主从切换,后续的选主和通知操作都会带来额外的计算和通信开销。
那么如何减少误判呢?
通常会采用多实例组成的集群模式进行部署,也就是哨兵集群。
引入多个哨兵实例一起判断,可以避免单个实例因自身网络状态不好,而导致误判的情况。当大多数的哨兵实例都判断主库为“主观下线”时,主库才会被标记为“客观下线”。遵循原则“少数服从多数”。
如何选择新主库?
这里我们先来看一个流程图:
主要的过程就是筛选和打分。
筛选
保证所选择的从库仍然在线运行,其次还要判断之前的网络连接状态。如何判断呢?有个配置项down-after-milliseconds
,是主从库断连的最大连接超时时间。在这个时间内,主从库还没连接上,我们可以认为是断连。如果断连次数超过10次,则认为这个库的网络状况不好,不适合做新主库。
打分
三轮打分,只要某一轮某个库的得分最高,就选定为主库;如果没有,则进行下一轮。
优先级最高的从库得分最高
手动配置slave-priority
,给不同的从库设置不同的优先级。根据配置,我们可以给配置更好的从库设置高优先级。
和旧主库同步最近的那个从库作为主库
主库会用master_repl_offset
记录当前最新的写操作在repl_backlog_buffer
缓冲区中的位置,从库会用slave_repl_offset
记录从库当前复制的位置,两者距离最近则评分高。
ID号小的从库得分高
每个示例都会有个ID,这里类似于从库的编号。
Redis在选主库时,有个默认的规定:在优先级和复制进度都一样的情况下,ID最小的库得分最高。
通过以上三步,可以选出新主库。
参考资料
极客时间《Redis核心技术与实战》