在 Redis 主从架构中,当主节点(Master)发生故障时,Redis Sentinel 会自动触发故障转移(Failover),将某个从节点(Slave)提升为新的主节点。Sentinel 在选择新主节点时,会根据多个因素综合评估,以确保选出最合适的从节点,通常包括最新的数据节点这一因素。具体的判断过程如下:
1. Redis Sentinel 的故障检测和切换流程
- 主观下线(SDOWN):一个 Sentinel 实例发现主节点不可用时,会标记该节点为“主观下线”。
- 客观下线(ODOWN):多个 Sentinel 实例都检测到主节点不可用,并且达成一致,才会标记该节点为“客观下线”,从而触发故障切换。
- 故障转移:Redis Sentinel 通过投票机制选举出一个 Leader Sentinel,由该 Leader 负责执行故障转移操作。
2. 从节点提升为主节点的选择标准
在执行故障转移时,Leader Sentinel 会从所有从节点中挑选一个最合适的节点提升为新的主节点。选择标准如下:
- 复制偏移量(Replication Offset):
- Redis Sentinel 首先选择复制偏移量最大的从节点。复制偏移量越大,表示该从节点同步的数据越多,即数据越接近主节点的数据。
- Sentinel 会比较所有从节点的
master_repl_offset
(主从同步偏移量)属性值,偏移量最大的从节点通常拥有最接近主节点的数据。
- 从节点优先级(Slave Priority):
- 每个从节点可以配置一个
slave-priority
参数,表示该从节点作为主节点候选的优先级,优先级值越小,优先级越高。 - 在主从切换时,Sentinel 会首先排除掉优先级设置为
0
的从节点(slave-priority=0
表示该从节点不参与故障切换),然后在其他节点中选择优先级最高的节点。 - 如果有多个从节点的复制偏移量相同,那么
slave-priority
值小的从节点将优先成为新的主节点。
- 每个从节点可以配置一个
- 从节点的响应时间:
- Sentinel 会检查从节点的响应时间,即从节点的延迟(
lag
),延迟较小的从节点通常具有更高的可靠性。 - 如果多个从节点的偏移量和优先级相同,那么 Sentinel 会优先选择网络延迟较小的从节点。
- Sentinel 会检查从节点的响应时间,即从节点的延迟(
- 运行状态和断线时长:
- Sentinel 会检查从节点的运行状态和与主节点断开连接的时长,如果某个从节点与主节点断开连接的时间较长,Sentinel 可能会优先选择其他状态更好的节点作为主节点。
3. 具体判断过程示例
假设有以下从节点状态:
从节点 | 复制偏移量 | slave-priority 值 | 延迟 | 断线时长 |
---|---|---|---|---|
从节点 A | 1000000 | 1 | 5 ms | 1 秒 |
从节点 B | 999500 | 1 | 2 ms | 1 秒 |
从节点 C | 1000000 | 2 | 10 ms | 1 秒 |
根据上述标准,Sentinel 会进行以下判断:
- 首先选择 复制偏移量最大的节点(从节点 A 和 C 偏移量最大,为
1000000
)。 - 在偏移量相同的节点中,选择
slave-priority
值最小的节点。此时从节点 A 的优先级(slave-priority=1
)高于从节点 C(slave-priority=2
)。 - Sentinel 会选择 从节点 A 作为新的主节点。
4. Sentinel 故障转移过程中的注意事项
- 数据一致性:Redis 的主从复制默认是异步复制,所以在故障转移时,新的主节点可能会略微落后于旧主节点的数据。Sentinel 通过选择复制偏移量最大的从节点,尽量确保数据的完整性。
- 配置从节点为只读:一旦某个从节点被提升为主节点,Sentinel 会重新配置其余从节点,指向新的主节点继续同步数据。
- 强一致性要求:如果业务对数据一致性要求极高,可以考虑使用 Redis 的半同步复制模式(WAIT 命令),但这会影响性能。
5. 总结
在 Redis 故障切换时,Sentinel 会综合考虑多个因素来选定最合适的从节点提升为主节点:
- 复制偏移量:优先选择复制偏移量最大的从节点,以确保新主节点拥有最新的数据。
- 从节点优先级:在偏移量相同的情况下,优先选择
slave-priority
值最小的从节点。 - 响应延迟:偏移量和优先级相同的情况下,优先选择延迟较小的节点。
Redis Sentinel 通过这些标准,在主节点故障时能够尽量确保数据完整性和快速故障恢复,提高 Redis 集群的高可用性和稳定性。