扩容分两步:加入与接槽
在集群中新增一个节点只完成了一半工作:add-node 把节点加入集群的拓扑视图,此时它没有任何槽,也就没有任何数据。第二步是用 reshard 把一部分槽连数据一起迁移过去,新节点才开始承担流量。新增从节点则需要在加入时指定跟随的主节点,否则会被随机分配。
基本信息
| 适用平台 | Redis 3.0+ 的 Cluster 模式,redis-cli 带集群子命令 |
|---|---|
| 加主节点 | redis-cli --cluster add-node 新节点 现有节点 |
| 接槽 | redis-cli --cluster reshard 现有节点 --cluster-from --cluster-to --cluster-slots |
| 加从节点 | add-node 时追加 --cluster-slave 与 --cluster-master-id |
| 收尾校验 | redis-cli --cluster check |
典型使用场景
- 容量不足需要横向扩容主节点
- 为某个主节点补充从节点,提高可用性
- 替换故障节点:先加入新节点再迁移槽
- 缩容前的逆操作准备:明确槽的迁入迁出流程
- 演练扩容流程,验证数据迁移对业务的影响
加入主节点并接槽
加入主节点并接槽
# 第一步:把新节点加入集群(默认作为主节点,持有 0 个槽)
redis-cli --cluster add-node 10.0.0.7:6379 10.0.0.1:6379
# 第二步:把槽与数据从旧节点迁到新节点
redis-cli --cluster reshard 10.0.0.1:6379 \
--cluster-from <源节点ID> --cluster-to <新节点ID> \
--cluster-slots 2000 --cluster-yes
# 第三步:校验集群一致性
redis-cli --cluster check 10.0.0.1:6379加入从节点
加入从节点
# 以从节点身份加入,并指定要跟随的主节点
redis-cli --cluster add-node 10.0.0.8:6379 10.0.0.1:6379 \
--cluster-slave --cluster-master-id <目标主节点ID>
# 确认拓扑:应能看到该主节点下有 1 个从节点
redis-cli -h 10.0.0.1 CLUSTER NODES | grep -E 'master|slave'
redis-cli --cluster check 10.0.0.1:6379参数与收尾
| 参数 | 作用 | 注意 |
|---|---|---|
| add-node | 把节点加入集群 | 默认成为未持槽的主节点 |
| --cluster-slave | 以从节点身份加入 | 必须配合主节点 ID |
| --cluster-master-id | 指定跟随的主节点 | 缺失时会被随机分配 |
| reshard --cluster-slots | 指定迁移的槽数量 | 数量按容量规划确定 |
| --cluster-yes | 跳过交互确认 | 脚本化中使用,先确认参数正确 |
| --cluster check | 一致性体检 | 扩容后必做 |
新节点加入后不会自动获得数据:客户端的槽映射更新到全集群需要一点时间,迁移完成后用 CLUSTER SLOTS 或 --cluster check 确认拓扑已经同步。
扩容应选择合适的时段进行:reshard 过程中会逐键迁移并产生重定向,期间客户端可能收到 ASK 或 MOVED 响应,对延迟敏感的请求会受影响。