Update Redis.md

补充 Redis Cluster 至少 3 个主节点的原因与少数派一侧的读请求处理。
This commit is contained in:
CyC2018
2026-10-31 00:23:18 +08:00
parent c6a820fba5
commit a1fef52e50
+2 -2
View File
@@ -736,9 +736,9 @@ Redis Cluster 不需要哨兵,节点之间通过集群总线(端口号加 10
1. 其它节点超过 cluster-node-timeout 没有收到 7002 的回复,各自把它标记为 PFAIL(疑似下线);
2. 某个节点通过 Gossip 得知多数主节点都认为 7002 疑似下线,把它标记为 FAIL 并广播;
3. 7002 的从节点按复制偏移量排名,数据最新的等待最短(500~1000 毫秒加上排名 × 1 秒),最先发起选举;
4. 从节点把纪元加 1 后请求投票,每个主节点在一个纪元中只投一票,得到多数主节点的票后接管 7002 的槽。
4. 从节点把纪元加 1 后请求投票,每个主节点在一个纪元中只投一票,得到多数主节点的票后接管 7002 的槽。所以集群至少要有 3 个主节点,只有 2 个时一个宕机,剩下的一个得不到多数票。
需要注意的是,主从之间是异步复制,主节点宕机前刚写入、还没有复制到从节点的数据会丢失,所以 Redis Cluster 不保证[强一致性](分布式.md#一致性)。网络分区时,少数派一侧的主节点超过 cluster-node-timeout 后拒绝写入,所以它在这之前接受的写入可能丢失。
需要注意的是,主从之间是异步复制,主节点宕机前刚写入、还没有复制到从节点的数据会丢失,所以 Redis Cluster 不保证[强一致性](分布式.md#一致性)。网络分区时,少数派一侧的主节点超过 cluster-node-timeout 后拒绝写入,所以它在这之前接受的写入可能丢失;默认配置下读请求也会被拒绝(cluster-allow-reads-when-down 默认为 no)。
扩容时要把一部分槽迁移到新节点。迁移以键为单位进行,期间一个槽的键一部分在源节点、一部分在目标节点,客户端靠 ASK 重定向找到它们。以把槽 5712 从 7002 迁移到 7003 为例(Redis 7.4 实测,见[附录 A13](#a13-槽迁移与-ask-重定向)):