Redis 故障转移(Failover)是指在主节点失效时,自动将其中一个从节点提升为主节点的过程,以确保系统的高可用性。在Redis中,有两种主要的故障转移方式:基于Redis Sentinel的故障转移和Redis Cluster的故障转移。
基于Redis Sentinel的故障转移
-
故障检测:
- Sentinel(哨兵)通过定期向主节点和从节点发送PING命令来监控它们的健康状态。
- 当主节点连续几次未能响应PING命令时,Sentinel将主节点标记为“主观下线”(SDOWN)。
-
协商客观下线:
- 主观下线后,Sentinel之间会通过发布/订阅机制和其他Sentinel通信,询问它们是否也认为主节点不可达。
- 若达到配置文件中设置的Sentinel数量阈值(一般要求大多数同意),则主节点被标记为“客观下线”(ODOWN)。
-
选举领导者 Sentinel:
- 在确定主节点客观下线后,Sentinel之间通过Raft或类似算法选举出一个领导者 Sentinel(Leader Sentinel)来执行故障转移操作。
-
选择新主节点:
- Leader Sentinel会选择一个从节点作为新的主节点,依据的因素可能包括:从节点的优先级、复制延迟、复制偏移量等。
-
故障转移执行:
- Leader Sentinel会执行以下操作:
- 将选定的从节点晋升为主节点,通过发送
FAILOVER
命令。 - 让其他从节点改为复制新的主节点。
- 更新所有Sentinel和客户端关于新主节点的信息。
- 将选定的从节点晋升为主节点,通过发送
- Leader Sentinel会执行以下操作:
-
配置更新:
- Sentinel会更新自己的配置,并通过发布与订阅机制通知其他Sentinel和客户端关于新的主节点位置。
基于Redis Cluster的故障转移
-
故障检测:
- Redis Cluster中的每个节点都负责监测与其相连的其他节点的健康状况,通过互相发送
PING
命令。
- Redis Cluster中的每个节点都负责监测与其相连的其他节点的健康状况,通过互相发送
-
主节点下线:
- 当一个主节点长时间不响应,其他节点会认为它已下线,并通过Gossip协议传播这个状态信息。
-
槽位重新分配:
- 下线主节点负责的槽位需要被其他在线节点接管。Cluster中的任一在线节点都可以发起槽位的重新分配。
- 这个过程包括选择合适的从节点提升为主节点,并将槽位迁移至新主节点。
-
数据迁移:
- 槽位迁移期间,Redis会使用
MIGRATE
命令将数据从旧主节点移动到新主节点。
- 槽位迁移期间,Redis会使用
-
配置更新:
- 集群中的每个节点通过Gossip协议广播集群配置的更改,包括新的主节点信息。
在源码层面上,对于Redis Sentinel,故障转移的相关逻辑主要集中在 sentinel.c
文件中,而对于Redis Cluster,故障转移相关的实现可以在 cluster.c
文件中找到。故障转移的过程中,涉及到的不仅仅是主从切换,还包括了节点间的网络通信、状态同步、配置更新等一系列复杂的操作。