Redis Cluster 从 3 主 3 从 → 5 主 10 从,本质是:主节点 +2 个(要重新分槽),从节点 +7 个(要挂到对应主上)。
一、先理清目标拓扑
3 主 3 从扩到 5 主 10 从,从节点不是均摊那么简单,先确定归属,否则后面挂 slave 会乱。
常见两种规划(假设原主 M1/M2/M3,新主 M4/M5):
| 方案 | 原 3 主每主几从 | 新 2 主每主几从 | 总从 |
|---|---|---|---|
| A 均匀型 | 2 | 2 | 3×2 + 2×2 = 10 ✅ |
| B 倾斜型(M1 热点) | M1=3, M2=2, M3=1 | 各 2 | 也是 10 |
下面按 方案 A(均匀 每主 2 从) 走,最常用。即:
- 原 M1/M2/M3:各从 1→2(每台补 1 个从)
- 新 M4/M5:各 2 从
- 共新增 2 主 + 7 从 = 15 个节点加入集群
二、前置准备
1. 新节点机器 & 配置文件
新 2 主 + 7 从 共 9 个实例(端口自定,例 7006~7014),redis.conf 关键项:
conf
cluster-enabled yes
cluster-config-file nodes-700x.conf
cluster-node-timeout 15000
port 700x
bind 0.0.0.0
requirepass "你的密码"
masterauth "你的密码"
dir /path/to/700x/
⚠️ 如果是克隆机,务必删掉旧的
nodes.conf / dump.rdb / appendonly.aof,否则 node ID 冲突,加不进集群。
2. 启动所有新实例(此时它们还是孤岛,没加入集群)
bash
redis-server /path/to/700x/redis.conf
3. 确认原集群健康
bash
redis-cli -a 密码 --cluster check 原任意节点IP:端口
# 或
redis-cli -a 密码 --cluster info 原任意节点IP:端口
3 主 3 从、slots 0--16383 全覆盖、无 fail 才能开始扩。
三、Step 1 --- 加入 2 个新主节点
任选原集群一个已知节点当"领路人":
bash
# 加 M4
redis-cli -a 密码 --cluster add-node 新M4_IP:7006 原M1_IP:7000
# 加 M5
redis-cli -a 密码 --cluster add-node 新M5_IP:7007 原M1_IP:7000
返回 [OK] New node added correctly 即成功。
此时 cluster nodes 能看到 M4/M5 是 master,但 slots = 0,还没数据。
四、Step 2 --- Reshard 重新分槽(最关键一步)
目标:16384 槽从原 3 主 → 5 主均摊,每主约 3277 个。
交互式(推荐,看得清):
bash
redis-cli -a 密码 --cluster reshard 原M1_IP:7000
再跑一次同样的流程,接收方换成 M5,再把 3277 槽从 M1/M2/M3 匀给 M5。
💡 也可以一次 reshard 把 M4+M5 都搞定,用
--cluster-from all --cluster-to M4_ID --cluster-slots 3277这种非交互式写法也行。但第一次建议交互式,避免算错。
分槽完成后校验:
bash
redis-cli -a 密码 --cluster check 原M1_IP:7000
5 主每主约 3277 slots,总和 16384 ✅
五、Step 3 --- 加入 10 个从节点
原 M1/M2/M3 各补 1 从(S1b/S2b/S3b)
bash
# 以 M1 补从为例,其余同理换 --cluster-master-id
redis-cli -a 密码 \
--cluster add-node 新S1b_IP:7008 原M1_IP:7000 \
--cluster-slave \
--cluster-master-id <M1的nodeID>
新 M4 挂 2 从(S4a/S4b)、M5 挂 2 从(S5a/S5b)
bash
# M4 的两个从
redis-cli -a 密码 --cluster add-node S4a_IP:7009 原M1_IP:7000 \
--cluster-slave --cluster-master-id <M4的nodeID>
redis-cli -a 密码 --cluster add-node S4b_IP:7010 原M1_IP:7000 \
--cluster-slave --cluster-master-id <M4的nodeID>
# M5 的两个从同理
...
10 从挂完,cluster nodes 里每台 master 后面 slaves: 2 就对了。
六、Step 4 --- 最终校验
bash
redis-cli -a 密码 --cluster info 任意节点:端口
期望输出类似:
172.16.x.1:7000 (M1) -> x keys | 3277 slots | 2 slaves
172.16.x.2:7001 (M2) -> x keys | 3277 slots | 2 slaves
172.16.x.3:7002 (M3) -> x keys | 3277 slots | 2 slaves
172.16.x.4:7006 (M4) -> x keys | 3277 slots | 2 slaves
172.16.x.5:7007 (M5) -> x keys | 3276 slots | 2 slaves
5 主 × 2 从 = 10 从,槽总和 16384 ✅
七、踩坑 & 生产注意
- reshard 期间对业务几乎无感 (Redis Cluster 迁移是逐 key
MIGRATE,原子),但大 key 多的场景单槽迁移会卡,建议避开高峰 或单次 reshard slots 别太大(有资料建议 ≤1000 一批,5 主场景一次 3277 也能跑,看你 key 体量)。 - 克隆/老实例复用 一定要清
nodes.conf+ RDB/AOF,否则 node ID 重复,集群直接拒。 - 密码 :
requirepass/masterauth新老节点必须一致,否则主从建联失败。 - 别在 reshard 中途改从属 / 下主节点,容易脑裂或槽态不一致。
- 如果用了 Redis 6+ 的 CLUSTER LINK ,可以观察迁移时的 link 流量;监控侧盯
cluster_state、migrating_slots、keyspace_hits/misses就行。
八、总结
| 阶段 | 动作 | 关键命令 |
|---|---|---|
| 准备 | 新 9 实例起好,清旧数据,配同密码 | redis-server redis.conf |
| 加主 | 2 新主空节点入集群 | redis-cli --cluster add-node 新主 旧主 |
| 分槽 | 原 3 主各匀部分槽给 M4/M5,5 主均摊 16384 | redis-cli --cluster reshard |
| 加从 | 10 从分批 add-node --cluster-slave --cluster-master-id 挂到对应主 |
同上 |
| 校验 | cluster info / cluster nodes 看 5 主 10 从、槽全 |
--- |
整个流程在线完成,不丢数据、不断业务 ,Redis Cluster 水平扩容的标准姿势就是这个顺序:先主 → 再槽 → 最后从 。如果从节点想倾斜(某主热点多给它 3 从),把 Step 3 的 --cluster-master-id 换一下就行,不影响前面。