目录标题
CLUSTER FAILOVER vs CLUSTER FAILOVER TAKEOVER 区别
是的,CLUSTER FAILOVER
和 CLUSTER FAILOVER TAKEOVER
在 Redis Cluster 中含义完全不同,作用场景也不同。我们先解释区别,再解答你的第二个问题(为什么两个主挂了之后就无法切换)。
✅ 一、CLUSTER FAILOVER
vs CLUSTER FAILOVER TAKEOVER
区别
命令 | 类型 | 含义与用途 |
---|---|---|
CLUSTER FAILOVER | 被动式/默认 | 只有在主节点不可用,且通过投票选举胜出时,从节点才会自动切换为主(正常 failover 流程) |
CLUSTER FAILOVER TAKEOVER | 主动式/强制 | 强制从节点立即切换为主节点,不等待主宕机、不等待投票,用于人工干预或需要“抢主”时 |
📌 说明:
-
CLUSTER FAILOVER
:- 通常由 Redis 自动触发(或手动执行)
- 需要满足条件:如主节点不可达、failover-timeout 到达、仲裁票数达到(多数)
- 安全性高、适用于真实故障切换
-
CLUSTER FAILOVER TAKEOVER
:-
强制将从节点切换为主节点
-
不需要等待主节点下线广播和票数仲裁
-
常用于:
- 主节点长时间不可恢复
- 主观 down 和客观 down 没同步(例如脑裂)
- 灾难恢复/故障模拟
-
❗ 二、为什么 3 分片集群中 2 个主挂了就无法切换?
🌐 背景设定
你说的“3 分片集群”应类似如下:
分片 | 主节点 | 从节点 |
---|---|---|
Slot 0-5000 | A (主) | A1 (从) |
Slot 5001-10000 | B (主) | B1 (从) |
Slot 10001-16383 | C (主) | C1 (从) |
假设现在 A 和 B 两个主都挂了,只有 C 主还在。
🚨 原因:选主过程需要“多数投票”,但你没了多数!
Redis Cluster 使用 Raft-like 仲裁机制,要求:
要将从节点切为主,需获得超过半数的主节点票数(即大多数主节点的确认)
- 你现在主节点剩 1 台(C),共计 3 个主
- C1(从)想切主,但它需要 2 票(多数 > 3/2)
- 但其他主都挂了,拿不到票,切主失败
📌 这就是为什么:
Redis Cluster 的主备切换(自动 failover)需要多数活跃主节点在线
✅ 解决方法建议
方法一:手动执行 CLUSTER FAILOVER TAKEOVER
在从节点 A1/B1 上执行:
redis-cli -h A1_IP -p A1_PORT cluster failover takeover
这会强制切换为主,不依赖投票机制
方法二:增加主节点数量或调整复制结构
- 若使用 5 主节点结构,则 2 台挂了还能达成多数(3/5)
- 或者部署三副本(1主+2从),容错更强
✅ 总结
问题点 | 原因 | 建议 |
---|---|---|
CLUSTER FAILOVER 无法完成 | 无法达到投票多数(失去 quorum) | 使用 CLUSTER FAILOVER TAKEOVER |
自动切换失效 | 主节点不足,选举失败 | 调整为更高可用的复制结构(如 1主2从、5主结构) |
从节点抢主 | 需要人工介入 | 执行 TAKEOVER ,或集群脚本恢复 |
如你能贴出 CLUSTER NODES
和当前拓扑图,我可以帮你一步步模拟出如何恢复两个挂掉的主节点并保持数据不丢失。是否需要?
failover 未恢复 的问题,又想移动槽位(slots)
如果你在 Redis Cluster 中遇到了 failover 未恢复 的问题,又想 移动槽位(slots),需要非常谨慎。因为此时集群状态可能处于不稳定状态,贸然迁移槽位可能导致数据丢失或集群不可用。
✅ 一、前提确认
在进行槽位移动前,请确认以下几点:
-
集群是否为 OK 状态?
redis-cli -c -h <任意节点> cluster info
若返回:
cluster_state:fail
则表示集群不健康,不建议迁移 slot,先排查 failover 问题。
-
failover 原因查明了吗?
- 是否有主节点宕机但未完全替换为新主?
- 哨兵或集群自身是否阻止了故障转移?
- 网络或配置是否导致投票失败?
- 是否存在没有足够的副本?
-
是否手动迁移主从后遗留问题?
- 使用
CLUSTER FORGET
、CLUSTER REPLICATE
做过人工干预吗?
- 使用
⚠️ 二、若仍决定强制移动槽位(谨慎)
1. 查看 slots 分布
redis-cli -c -h <节点IP> -p <端口> cluster slots
2. 选择要迁移的 slot(例如从节点 A 移动 slot 1000 到节点 B)
- 注意:目标节点 B 应为一个正常的 master 节点。
- 确保 slot 所属节点当前 online,且数据已手动同步或已无重要数据
3. 使用 redis-trib 或 redis-cli 手动迁移 slot
推荐方式(Redis 5+)使用 redis-cli
:
# 先设置目标节点接收 slot
redis-cli -h B -p 7000 cluster setslot 1000 importing <A-node-ID>
redis-cli -h A -p 7000 cluster setslot 1000 migrating <B-node-ID>
# 移动数据(如果有键,建议使用 redis-cli --scan --cluster)
redis-cli -c --cluster call 127.0.0.1:7000 del <key...> # 或使用 redis-shake/migrate 工具
# 完成后设置 slot 所属为 B
redis-cli -h B -p 7000 cluster setslot 1000 node <B-node-ID>
或者使用官方工具 redis-cli --cluster
:
redis-cli --cluster reshard <ip:port>
# 输入需要迁移的槽数
# 指定目标节点 ID
# 可以指定源节点 ID,也可让它自动选
🚨 三、不要在以下场景迁移 slot!
- 存在 fail 状态但未修复主从结构
- 正在执行 failover
- 节点之间通讯中断(cluster meet/ping 失败)
- 副本数量不足,无法完成投票
🛠 四、推荐处理流程(如果集群 failover 卡住)
-
确认宕机主是否应被剔除:
redis-cli -h 任意正常节点 cluster forget <宕机节点ID>
-
将从节点手动提升为主:
redis-cli -h 从节点IP cluster replicate no_one
-
修复 slots 所属:
redis-cli -h 新主 cluster setslot <slot> node <新主ID>
-
确认 cluster_state 恢复为 OK
✅ 五、可选工具(安全迁移)
- redis-trib.rb
redis-cli --cluster
redis-shake
:数据迁移工具redis-migrate-tool
:支持 slot 迁移
🧠 总结
状态 | 是否可迁移槽位 | 建议行动 |
---|---|---|
cluster_state:ok | ✅ 可迁移 | 使用 redis-cli 迁移槽位 |
cluster_state:fail,failover 未恢复 | ❌ 不建议 | 优先恢复主从,修复集群结构 |
集群分裂 | ❌ 严禁迁移 | 需合并 view、恢复 gossip |
如你愿意提供当前 CLUSTER NODES
和 CLUSTER INFO
输出,我可以帮你详细判断是否能移动槽位及最佳方案。是否需要?
什么是 “Raft-like” 仲裁机制?
Redis Cluster 虽然没有完整实现 Raft 协议,但它在 故障转移(failover)流程中,确实借用了类似 Raft 的多数仲裁机制,所以我们说它是 “Raft-like”(类似 Raft)仲裁机制,但 不是 Raft 协议的完整实现。
✅ 什么是 “Raft-like” 仲裁机制?
在 Redis Cluster 的自动主备切换中,Redis 使用的是 投票机制(vote-based failover),其核心思想跟 Raft 等分布式一致性协议中的“多数投票选主”类似。
🔧 Redis Cluster 中的主备切换流程
以下是 Redis Cluster 中一个从节点触发故障转移的大致过程:
1. 主观下线(Subjective Down)
- 节点 A 认为主节点 B 宕机,标记为
FAIL
- 这只是 A 的“主观判断”
2. 客观下线(Objective Down)
- 如果超过半数的主节点都报告 B 为
FAIL
- 那么 B 就被“客观下线”(即 failover 投票仲裁成功)
3. 从节点发起竞选
- B 的从节点 B1 发现 B 被
FAIL
- B1 会进入 failover wait time 状态
- 如果它在超时时间内未看到其他副本先切主,就发起 failover 请求
4. 多数主节点投票
- B1 发送
FAILOVER_AUTH_REQUEST
请求 - 其他主节点是否授权(vote)决定是否允许 B1 成为主
- 如果 B1 获得超过半数的授权,它就切换为主
🧠 类似 Raft 的地方(Raft-like)
特性 | Redis Cluster | Raft |
---|---|---|
多数投票选主 | ✅(需要过半主节点投票) | ✅(需要过半节点投票) |
每个节点一次投票周期一票 | ✅(一次 failover 只能投一票) | ✅(一次 term 一票) |
任期概念(term) | ❌(没有明确 term) | ✅(明确任期编号) |
日志复制/强一致性 | ❌(Redis Cluster是最终一致) | ✅(强一致性,日志同步) |
快照/日志追赶机制 | ❌ | ✅(Raft 有 log compaction 等) |
结论:Redis 仅在故障切换中参考 Raft 的“多数投票选主”机制,但不具备 Raft 的完整特性。
🧱 Redis 设计考虑
Redis Cluster 设计目标是:
高性能 + 最终一致性,不是 CAP 中的强一致系统。
所以它只在主节点宕机时使用部分投票逻辑来保持“集群一致性视图”,不会做 WAL 日志同步,也不阻塞写入来保持数据一致性。
✅ 总结
项目 | 内容 |
---|---|
Redis 是否实现 Raft? | ❌ 否,不是完整 Raft,实现的是部分投票机制 |
什么是 Raft-like? | 在 failover 时使用多数投票、一次一票、竞选等机制,类似 Raft 的思路 |
为什么不能自动切换主? | 因为 Redis Cluster 切主依赖“多数投票”,主节点不足时无法完成投票 |
如果你对 Redis 真正实现了 Raft 的方案感兴趣,可以了解一下:
- Redis Raft:Redis Labs 开发的基于 Raft 协议的 Redis 分布式方案,实现强一致性
是否需要我帮你对比一下 Redis Cluster 和 Redis Raft 的架构和应用场景?