
一、Redis 集群槽位迁移基础1.1 Redis 集群槽位分布原理Redis 集群将所有数据分成 16384 个槽每个节点负责处理一部分槽的数据。当客户端访问键时Redis 会根据键的 CRC16 值对 16384 取模确定该键属于哪个槽进而路由到负责该槽的节点上。slot CRC16(key) % 16384这种分布方式确保了数据在集群中的均匀分布每个节点承担大致相等的数据量提高整体性能。1.2 槽位迁移的必要性当集群面临以下情况时需要进行槽位迁移集群扩容增加新节点需要重新分配槽位以均衡负载集群缩容移除节点需要将其负责的槽位迁移到其他节点负载不均某些节点负载过高需要调整槽位分布维护升级对特定节点进行维护前需将其槽位迁移1.3 槽位迁移的基本流程Redis 槽位迁移是一个两阶段过程开始迁移目标节点准备接收槽位源节点迁移槽位中的数据更新节点槽位信息客户端感知新槽位分布迁移完成二、集群扩容过程中的槽位迁移2.1 扩容准备与节点添加准备新 Redis 节点配置 cluster-enabled yes将新节点加入集群bashredis-cli --cluster add-node 192.168.1.10:7000 192.168.1.1:7000新节点初始状态下不负责任何槽位处于加入集群但未分配槽位状态2.2 槽位迁移策略扩容时采用哈希槽重新分配策略将现有节点的槽位部分迁移到新节点分析当前槽位分布确定每个节点需迁移的槽位数量选择负载高的节点作为源节点将源节点的槽位迁移到新节点验证迁移结果完成扩容2.3 扩容过程中的阻塞问题2.3.1 迁移过程中的键阻塞在迁移槽位时源节点需要执行以下命令redis-cli --cluster reshard 192.168.1.1:7000问题如果被迁移的键很大MIGRATE 命令会长时间阻塞源节点在迁移过程中如果有大量请求访问被迁移的键会显著影响性能2.3.2 客户端缓存槽位信息导致的路由错误Redis 客户端会缓存槽位与节点的映射关系在迁移过程中可能出现客户端缓存了过期的槽位信息新槽位还未完全迁移完成但客户端已尝试访问新节点解决方案使用支持集群自动发现的客户端设置合理的客户端缓存更新策略三、集群缩容过程中的槽位迁移3.1 缩容准备与节点下线确认待下线节点负责的槽位数量执行下线命令bashredis-cli --cluster del-node 192.168.1.10:7000 node-id系统会自动将节点的槽位迁移到其他节点3.2 槽位迁移回迁缩容过程中需要将待下线节点的槽位迁移到其他健康节点选择目标节点计算需要迁移的槽位逐个迁移槽位到目标节点更新集群槽位配置验证数据完整性安全下线节点3.3 缩容过程中的阻塞问题3.3.1 迁移完成前的不可用窗口当节点标记为下线后在槽位完全迁移完成前该节点会拒绝处理请求(error) MOVED 1234 192.168.1.11:7000解决方案在业务低峰期执行缩容操作使用 CLUSTER SETSLOT 命令手动控制迁移过程3.3.2 迁移过程中的数据一致性风险在缩容过程中如果客户端在迁移前后访问不同的节点可能出现读到旧数据写操作被拒绝解决方案使用 REDIS 的 PERSISTENCE 模式确保数据持久化在业务层实现重试机制四、Reshard 操作与阻塞问题4.1 Reshard 基本概念Reshard 是在不增减节点的情况下重新分配槽位的过程主要用于负载均衡优化数据分布为特定节点分配更多资源4.2 Reshard 操作流程确定源节点和目标节点计算需要迁移的槽位范围执行迁移命令监控迁移进度验证迁移结果完成重新分配4.3 Reshard 过程中的阻塞问题4.3.1 MIGRATE 命令的阻塞特性MIGRATE 命令是 Redis 3.0 提供的槽位迁移工具其工作原理MIGRATE target_host target_port key_id db_id timeout_id [COPY|REPLACE]问题对于大键MIGRATE 命令会长时间阻塞源节点当 timeout_id 设置过短可能导致迁移中断当 timeout_id 设置过长会导致源节点长时间不可用4.3.2 批量迁移导致的性能问题批量迁移槽位时如果并发迁移过多会导致源节点 CPU 使用率飙升网络带宽被大量迁移数据占用目标节点写入压力过大五、优化策略与解决方案5.1 槽位迁移参数调优5.1.1 调整迁移速度参数在 redis.conf 中调整以下参数cluster-node-timeout 5000 cluster-migration-barrier 15.1.2 合理设置 MIGRATE 超时时间redis-cli --cluster reshard --timeout 60000 192.168.1.1:70005.2 非阻塞迁移方案5.2.1 使用 Redis 4.0 的 NONCE MIGRATIONRedis 4.0 提供了 NONCE MIGRATION 机制支持更细粒度的迁移控制CLUSTER GETKEYSINSLOT slot count CLUSTER SETSLOT importing CLUSTER SETSLOT migrating CLUSTER SETSLOT node_id5.2.2 使用 Redis-trib 工具的批量迁移功能redis-cli --cluster reshard --cluster-yes --cluster-from source-node --cluster-to target-node --cluster-slots slot-count 192.168.1.1:70005.3 迁移监控与预警5.3.1 使用 Redis CLI 监控迁移状态redis-cli -p 7000 cluster nodes | grep -E (migrating|importing)5.3.2 监控关键指标迁移中的槽位数量源节点和目标节点的 CPU 使用率网络带宽使用情况错误日志分析5.3.3 实现自动化迁移脚本import redis import time def monitor_migration(cluster_nodes, slot): r redis.StrictRedis(hostcluster_nodes[0], port7000) while True: info r.execute_command(CLUSTER, SETSLOT, slot, NODES) if migrating not in info and importing not in info: print(fSlot {slot} migration completed) break print(fSlot {slot} is still migrating...) time.sleep(5)六、最佳实践总结6.1 迁移时间窗口选择选择业务低峰期进行大规模迁移避免在促销、活动等关键业务时段操作提前通知相关团队做好准备6.2 迁移前后检查清单迁移前备份所有节点数据检查集群状态确认迁移方案准备回滚计划迁移中监控系统资源检查迁移日志验证数据一致性迁移后验证所有槽位分布检查客户端连接清理临时配置6.3 故障处理预案迁移中断记录已完成的槽位迁移重新发起未完成的迁移使用 CLUSTER SETSLOT 手动修复数据不一致检查冲突的键合并数据或重新迁移必要时从备份恢复