redis cluster 是官方推荐的无中心分布式方案,基于16384个哈希槽实现自动分片,支持主从复制与自动故障转移;最小生产规模为3主3从,需正确配置cluster-enabled、aof持久化、超时及覆盖策略,通过redis-cli --cluster create初始化,并依赖crc16(key)%16384路由key。

Redis Cluster 是官方推荐的分布式方案,不用代理、不依赖中心节点,靠 16384 个哈希槽(slot)把数据自动分到多个节点上,同时支持主从复制和自动故障转移。搭建本身不难,但配置细节和分片逻辑容易出错,尤其在 slot 分配、节点通信和高可用验证环节。
集群节点规划与基础配置
最小可用规模是 3 主 3 从(共 6 节点),主节点负责写和槽位管理,从节点提供冗余和读扩展。单机测试可用不同端口模拟,生产环境建议跨机器部署,避免单点故障。
- 每个节点需独立配置目录,例如:
/opt/redis-cluster/7001、/opt/redis-cluster/7002… - 关键配置项必须开启:
cluster-enabled yes、appendonly yes(推荐 AOF 持久化)、protected-mode no(测试阶段;生产务必设密码) -
cluster-node-timeout建议设为 5000–15000 毫秒,过短易误判节点下线,过长影响故障响应速度 -
cluster-require-full-coverage no——允许部分槽不可用时集群仍可写(避免单节点宕机导致整个集群拒绝服务)
启动节点与集群初始化
先逐个启动所有 Redis 实例(6 个),再用 redis-cli --cluster create 命令自动完成握手、主从分配和槽位均分。
- 命令示例:
redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 ... 127.0.0.1:7006 --cluster-replicas 1 - 该命令会交互式确认槽位分配(默认平均划分:0–5460、5461–10922、10923–16383),也可加
--cluster-yes跳过确认 - 启动后执行
redis-cli -c -p 7001 cluster nodes,检查状态是否全为connected,且 slots 总数覆盖 0–16383
数据分片原理与 key 路由规则
Redis 不按 key 做哈希,而是用 CRC16(key) % 16384 算出所属槽位,再查槽位映射表找到对应节点。这意味着:
- 同一个 key 永远落在同一节点,保证单 key 操作原子性
- 多 key 操作(如
mget)要求所有 key 在同一槽位,否则报错;可用{tag}强制路由,例如set {user123}:name "Alice"和set {user123}:age "30"会被分配到相同槽位 - 客户端收到
Moved错误说明槽位归属已变,应更新本地路由缓存;收到Ask错误则表示槽位正在迁移中,需先转向目标节点重试
槽位管理与动态扩容缩容
集群运行后,可通过命令手动调整槽位分布,实现在线扩容或均衡负载。
- 查看当前分配:
redis-cli -p 7001 cluster slots - 迁移槽位:先用
cluster getkeysinslot <slot><count></count></slot>获取该槽 key 列表,再用redis-cli --cluster reshard或cluster addslots/cluster delslots操作 - 新增节点后,用
--cluster rebalance自动均分槽位;缩容前需先将待下线节点的槽位迁出,再执行cluster forget - 注意:迁移过程不影响服务,但大量 key 迁移可能短暂升高网络与 CPU 开销











