一、前言为什么需要伸缩随着业务增长你的 Redis Cluster 可能面临❌容量不足内存使用率 80%❌性能瓶颈单节点 QPS 超过 8万❌资源浪费低峰期节点闲置Redis Cluster 支持在线伸缩无需停机通过插槽Slot迁移实现数据重平衡。本文将手把手演示✅如何安全扩容新增主从节点✅如何优雅缩容下线节点并迁移数据✅全程业务无感知二、环境准备2.1 当前集群状态3 主 3 从节点端口角色负责 Slotnode17001master0–5460node27002master5461–10922node37003master10923–16383node47004slave→ node1node57005slave→ node2node67006slave→ node32.2 目标扩容新增node7(7007)主 node8(7008)从接管部分 slot缩容下线node3(7003)将其 slot 迁移至其他节点前提已搭建 Redis Cluster参考前文《Redis 搭建分片集群》三、第一部分在线扩容新增主从节点3.1 步骤 1启动新节点创建配置目录mkdir -p /opt/redis-cluster/{7007,7008}配置 redis.conf以 7007 为例port 7007 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 15000 appendonly yes protected-mode no bind 0.0.0.0 daemonize yes dir /opt/redis-cluster/7007⚠️注意7008 配置类似仅改端口和 dir启动节点redis-server /opt/redis-cluster/7007/redis.conf redis-server /opt/redis-cluster/7008/redis.conf此时新节点是孤立节点未加入集群。3.2 步骤 2将新主节点加入集群# 任选一个现有节点执行 redis-cli --cluster add-node 192.168.1.10:7007 192.168.1.10:7001192.168.1.10:7007新主节点192.168.1.10:7001集群中任意现有节点✅验证redis-cli -p 7001 cluster nodes # 应看到 7007 节点角色为 master但 slots 为空3.3 步骤 3将新从节点挂到新主redis-cli --cluster add-node \ --cluster-slave \ --cluster-master-id 7007的node-id \ 192.168.1.10:7008 \ 192.168.1.10:7001如何获取 node-idredis-cli -p 7007 cluster myid✅验证redis-cli -p 7001 cluster nodes | grep 7008 # 应显示slave 7007-node-id3.4 步骤 4迁移插槽重平衡数据方法一自动重平衡推荐redis-cli --cluster rebalance 192.168.1.10:7001 \ --cluster-use-empty-masters \ # 允许空主参与分配 --cluster-threshold 1 # 最小不平衡比例%方法二手动指定迁移量# 从每个老主迁移 1000 个 slot 到 7007 redis-cli --cluster reshard 192.168.1.10:7001交互式输入How many slots do you want to move?→3000What is the receiving node ID?→7007-node-idSource node IDs→ 输入all从所有主节点匀出⏱️迁移过程客户端可能收到ASK重定向业务无中断Lettuce/Jedis 自动处理✅验证迁移结果redis-cli -p 7001 cluster slots # 应看到 7007 负责部分 slot如 0-1000, 5461-6461, ...四、第二部分在线缩容安全下线节点目标下线node3(7003)及其从节点node6(7006)4.1 步骤 1迁移 node3 的所有插槽# 查看 node3 负责的 slot 范围 redis-cli -p 7003 cluster nodes | grep myself # 输出示例... master - 0-0 3 connected 10923-16383 # 将其 slot 全部迁移到 node1(7001) redis-cli --cluster reshard 192.168.1.10:7001交互输入slots to move:546116383 - 10923 1 5461receiving node ID:7001-node-idsource node ID:7003-node-iddone✅关键确保迁移完成后再下线4.2 步骤 2下线从节点7006# 在主节点执行 forget redis-cli -p 7001 cluster forget 7006-node-id # 停止 7006 进程 kill $(pgrep -f 7006)⚠️必须先 forget 再 kill否则集群会尝试重连。4.3 步骤 3下线主节点7003确认其 slots 已清空redis-cli -p 7003 cluster nodes | grep myself # 应显示connected无 slot 范围执行下线# 在其他节点 forget redis-cli -p 7001 cluster forget 7003-node-id # 停止进程 kill $(pgrep -f 7003)✅最终验证redis-cli -p 7001 cluster nodes # 应不再显示 7003 和 7006五、客户端影响与最佳实践5.1 业务是否中断扩容/缩容期间写操作可能短暂延迟slot 迁移中读操作自动重定向MOVED/ASK现代客户端Lettuce/Jedis自动处理应用层无感知5.2 生产环境建议场景建议扩容时机内存使用率 70%或 CPU 持续 80%迁移速度使用--cluster-timeout控制避免网络打满监控指标关注migrate_cached_sockets,evicted_keys回滚方案迁移前备份 AOF/RDB5.3 避免踩坑❌ 不要直接 kill 节点先forget❌ 不要在高峰期执行大规模迁移✅ 迁移后验证数据一致性抽样比对六、自动化脚本示例扩容#!/bin/bash # auto_expand.sh NEW_MASTER_PORT7009 NEW_SLAVE_PORT7010 EXISTING_NODE192.168.1.10:7001 # 1. 启动新节点略 # 2. 加入集群 redis-cli --cluster add-node 192.168.1.10:$NEW_MASTER_PORT $EXISTING_NODE MASTER_ID$(redis-cli -p $NEW_MASTER_PORT cluster myid) redis-cli --cluster add-node \ --cluster-slave \ --cluster-master-id $MASTER_ID \ 192.168.1.10:$NEW_SLAVE_PORT \ $EXISTING_NODE # 3. 自动重平衡 redis-cli --cluster rebalance $EXISTING_NODE --cluster-use-empty-masters echo 扩容完成七、结语感谢您的阅读如果你有任何疑问或想要分享的经验请在评论区留言交流
Redis分片集群伸缩
一、前言为什么需要伸缩随着业务增长你的 Redis Cluster 可能面临❌容量不足内存使用率 80%❌性能瓶颈单节点 QPS 超过 8万❌资源浪费低峰期节点闲置Redis Cluster 支持在线伸缩无需停机通过插槽Slot迁移实现数据重平衡。本文将手把手演示✅如何安全扩容新增主从节点✅如何优雅缩容下线节点并迁移数据✅全程业务无感知二、环境准备2.1 当前集群状态3 主 3 从节点端口角色负责 Slotnode17001master0–5460node27002master5461–10922node37003master10923–16383node47004slave→ node1node57005slave→ node2node67006slave→ node32.2 目标扩容新增node7(7007)主 node8(7008)从接管部分 slot缩容下线node3(7003)将其 slot 迁移至其他节点前提已搭建 Redis Cluster参考前文《Redis 搭建分片集群》三、第一部分在线扩容新增主从节点3.1 步骤 1启动新节点创建配置目录mkdir -p /opt/redis-cluster/{7007,7008}配置 redis.conf以 7007 为例port 7007 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 15000 appendonly yes protected-mode no bind 0.0.0.0 daemonize yes dir /opt/redis-cluster/7007⚠️注意7008 配置类似仅改端口和 dir启动节点redis-server /opt/redis-cluster/7007/redis.conf redis-server /opt/redis-cluster/7008/redis.conf此时新节点是孤立节点未加入集群。3.2 步骤 2将新主节点加入集群# 任选一个现有节点执行 redis-cli --cluster add-node 192.168.1.10:7007 192.168.1.10:7001192.168.1.10:7007新主节点192.168.1.10:7001集群中任意现有节点✅验证redis-cli -p 7001 cluster nodes # 应看到 7007 节点角色为 master但 slots 为空3.3 步骤 3将新从节点挂到新主redis-cli --cluster add-node \ --cluster-slave \ --cluster-master-id 7007的node-id \ 192.168.1.10:7008 \ 192.168.1.10:7001如何获取 node-idredis-cli -p 7007 cluster myid✅验证redis-cli -p 7001 cluster nodes | grep 7008 # 应显示slave 7007-node-id3.4 步骤 4迁移插槽重平衡数据方法一自动重平衡推荐redis-cli --cluster rebalance 192.168.1.10:7001 \ --cluster-use-empty-masters \ # 允许空主参与分配 --cluster-threshold 1 # 最小不平衡比例%方法二手动指定迁移量# 从每个老主迁移 1000 个 slot 到 7007 redis-cli --cluster reshard 192.168.1.10:7001交互式输入How many slots do you want to move?→3000What is the receiving node ID?→7007-node-idSource node IDs→ 输入all从所有主节点匀出⏱️迁移过程客户端可能收到ASK重定向业务无中断Lettuce/Jedis 自动处理✅验证迁移结果redis-cli -p 7001 cluster slots # 应看到 7007 负责部分 slot如 0-1000, 5461-6461, ...四、第二部分在线缩容安全下线节点目标下线node3(7003)及其从节点node6(7006)4.1 步骤 1迁移 node3 的所有插槽# 查看 node3 负责的 slot 范围 redis-cli -p 7003 cluster nodes | grep myself # 输出示例... master - 0-0 3 connected 10923-16383 # 将其 slot 全部迁移到 node1(7001) redis-cli --cluster reshard 192.168.1.10:7001交互输入slots to move:546116383 - 10923 1 5461receiving node ID:7001-node-idsource node ID:7003-node-iddone✅关键确保迁移完成后再下线4.2 步骤 2下线从节点7006# 在主节点执行 forget redis-cli -p 7001 cluster forget 7006-node-id # 停止 7006 进程 kill $(pgrep -f 7006)⚠️必须先 forget 再 kill否则集群会尝试重连。4.3 步骤 3下线主节点7003确认其 slots 已清空redis-cli -p 7003 cluster nodes | grep myself # 应显示connected无 slot 范围执行下线# 在其他节点 forget redis-cli -p 7001 cluster forget 7003-node-id # 停止进程 kill $(pgrep -f 7003)✅最终验证redis-cli -p 7001 cluster nodes # 应不再显示 7003 和 7006五、客户端影响与最佳实践5.1 业务是否中断扩容/缩容期间写操作可能短暂延迟slot 迁移中读操作自动重定向MOVED/ASK现代客户端Lettuce/Jedis自动处理应用层无感知5.2 生产环境建议场景建议扩容时机内存使用率 70%或 CPU 持续 80%迁移速度使用--cluster-timeout控制避免网络打满监控指标关注migrate_cached_sockets,evicted_keys回滚方案迁移前备份 AOF/RDB5.3 避免踩坑❌ 不要直接 kill 节点先forget❌ 不要在高峰期执行大规模迁移✅ 迁移后验证数据一致性抽样比对六、自动化脚本示例扩容#!/bin/bash # auto_expand.sh NEW_MASTER_PORT7009 NEW_SLAVE_PORT7010 EXISTING_NODE192.168.1.10:7001 # 1. 启动新节点略 # 2. 加入集群 redis-cli --cluster add-node 192.168.1.10:$NEW_MASTER_PORT $EXISTING_NODE MASTER_ID$(redis-cli -p $NEW_MASTER_PORT cluster myid) redis-cli --cluster add-node \ --cluster-slave \ --cluster-master-id $MASTER_ID \ 192.168.1.10:$NEW_SLAVE_PORT \ $EXISTING_NODE # 3. 自动重平衡 redis-cli --cluster rebalance $EXISTING_NODE --cluster-use-empty-masters echo 扩容完成七、结语感谢您的阅读如果你有任何疑问或想要分享的经验请在评论区留言交流