redis cluster硬性要求至少3个主节点以满足多数派投票机制,6节点(3主3从)可容忍1主故障,奇数主节点更利于避免平票;单节点内存需预留复制缓冲区与连接开销;扩容需手动迁移槽位并验证实时指标。

节点数量必须满足投票机制和故障容忍底线
Redis Cluster 要求至少 3 个主节点,否则 redis-cli --cluster create 会直接报错:Cluster requires at least 3 master nodes。这不是建议,而是硬性限制——因为故障判定依赖多数派投票(quorum),2 个主节点无法形成多数,任意一个宕机就导致集群不可用。
生产环境别只堆主节点数,得配从节点。每个主节点配 1 个从节点(即 --cluster-replicas 1)是最低可用线:6 节点(3 主 3 从)能容忍 1 个主节点彻底失联;若要容忍同时挂掉 2 个主节点,就得 5 主 5 从(10 节点),但要注意节点总数不能超过 1000(官方文档明确上限),且实际运维复杂度陡增。
- 奇数主节点更稳妥:3/5/7 主节点比 4/6 更容易达成投票多数(避免 2:2 平票)
- 单台机器跑多个节点仅限测试:端口、
pidfile、dir、cluster-config-file必须全错开,否则启动时互相覆盖配置文件 - 跨机房部署慎用:节点间延迟 > 150ms 会导致
cluster-node-timeout频繁误判,触发不必要的故障转移
内存不是按总数据量平均分,而是按写入压力+复制缓冲区预估
单节点内存不能只看“缓存数据大小”,得叠加复制缓冲区(replication backlog)和客户端连接内存开销。比如业务写入 QPS 1 万,主从复制延迟波动大时,repl-backlog-size 默认 1MB 就可能溢出,导致从节点全量同步——这会瞬间吃光内存。
经验公式:单节点内存 = 数据常驻内存 × 1.3 + 复制缓冲区(建议 ≥ 100MB)+ 连接数 × 10KB。例如 10GB 热数据,1000 并发连接,保守配 16GB 内存起步;若用 allkeys-lru 策略,还要预留 20% 内存给淘汰抖动。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
-
maxmemory必须显式设置,否则 Redis 可能 OOM 被系统 kill,而 cluster 不会自动感知该节点死亡 - 不要把所有节点内存设成一样:热点 key 集中在某几个槽位,对应主节点内存使用率会远高于其他节点
- 用
redis-cli -p 7000 info memory查used_memory_peak_human,比used_memory_human更反映真实压力峰值
扩容不是加节点就行,得算清槽位迁移成本
Redis Cluster 的 16384 个槽位是固定总量,新增主节点后,必须把部分槽位从老节点迁移到新节点。迁移过程会阻塞对应槽位的写操作,且迁移速度受网络带宽和 key 大小影响极大——一个 1MB 的 hash key 迁移耗时可能是 1KB string 的百倍。
实操中,每次只扩 1 个主节点,用 redis-cli --cluster reshard 手动指定迁移槽位数(比如每次搬 1000 个),并避开业务高峰。别信“自动均衡”:集群不会主动重分配槽位,新节点默认不承载任何槽位,加进去就是闲置状态。
- 迁移前先用
cluster nodes确认目标节点connected状态为 yes,否则迁移命令会卡住 - 迁移中执行
cluster nodes会看到 migrating / importing 标记,此时对应槽位读写可能返回TRYAGAIN或重定向 - 迁移完成必须执行
cluster forget清理旧节点 ID(如果已下线),否则残留节点信息会导致后续扩容失败
验证规划是否合理,得看 cluster info 里的 real-time 指标
配置完节点、启动集群后,别只扫一眼 cluster state:ok 就完事。真正暴露问题的是 cluster_info 中的实时指标:
-
cluster_known_nodes必须等于你部署的节点总数(含从节点),少一个说明某个节点没成功加入 -
cluster_stats_messages_sent/received如果每秒低于 100,大概率是网络不通或防火墙拦了集群端口(不只是 redis 默认端口,还有port+10000的集群通信端口) -
cluster_slots_assigned必须恒为 16384,否则有槽位未分配,集群无法写入新 key
最容易被忽略的是 cluster_current_epoch 和 cluster_my_epoch:如果两者差值 > 1,说明该节点长期未参与投票,可能因网络分区被隔离,此时它对外提供服务但数据已不同步。










