Redis主从库主库挂了怎么办

1,222 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。


相关:


问题

在 Redis 主从库架构中,除了主从库之间失联的情况,节点发生故障也是可能出现的问题之一。如果是从库发生了故障,客户端可以继续向主库以及其它从库发送操作命令。但是如果出现故障的是主库,不仅客户端无法再次向 Redis 发送写操作命令,从库也没有了复制数据的来源。这样,Redis 的服务就中断了。

如果主库挂掉,会导致整个 Redis 主从集群无法正常工作,这显然太脆弱了。

哨兵机制

在 MongoDB 的复制集架构中,当主节点发生故障,会从从节点中选举出一个新的主节点。Redis 也提供了类似的将从库「升级」为主库的机制,只不过需要主库和从库意外的第三个角色来完成,也就是「哨兵」。

Redis 主从集群中,哨兵机制负责监控、主从切换和客户端通知的工作,实现了主库故障后主从自动切换。

哨兵机制是如何工作的

哨兵其实就是一个在特定状态下运行的 Redis 进程,也就是说,它也是一个 Redis 节点,只不过它不负责处理数据,而是执行哨兵的任务。

哨兵的第一个工作是监控节点的状态。它会周期性地向主从库发送 PING 命令,监控它们是否活跃。如果向一个节点发出 PING 命令后,没有在指定时间内得到响应,那么这个节点就会被哨兵判定为下线。

哨兵的第二个任务是选择主库。当被判定为下线的节点是主库时,就需要从现有的从库里面选择一个作为新的主库。从库需要满足几个条件,才能被选为新的主库:

  1. 不能处于下线状态
  2. 优先级相对别的主库要高
  3. 和旧主库的数据复制进度相对较新

新的主库确定之后,还没有完,客户端和其它从库都需要知道主库发生了变更。客户端需要将数据的写操作命令发送到新的主库,而其它从库也需要从新的主库同步数据。

哨兵的第三个工作就是通知。哨兵会把新的主库链接信息发送给其它从库,它们会执行 replicaof 命令来和新的主库建立连接并进行数据的同步。哨兵也会把新主库的连接信息通知给客户端,这样客户端就会把请求操作发送到新的主库上。