redis 扩容步骤

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_statemigrating_slotskeyspace_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 换一下就行,不影响前面。