Redis集群槽位分配异常修复指南
问题现象与影响
Redis集群中,当节点故障、扩容缩容或网络分区后,可能出现槽位(slot)分配异常,导致部分key无法正常读写,客户端报MOVED重定向错误或集群状态fail。及时修复可避免服务中断。
修复前置准备
- 确认集群所有节点可达,使用redis-cli -c -h {ip} -p {port} cluster nodes查看节点状态。
- 备份节点数据(推荐RDB或AOF)以防修复失误。
- 确保使用Redis 3.0及以上版本,支持在线reshard。
完整修复步骤
步骤1:检查槽位分配概况
登录任意节点,执行:
redis-cli -h {ip} -p {port} cluster slots
观察输出中每个槽位的起始与结束范围,确认是否存在未分配的槽或重复分配。
步骤2:定位异常槽位
执行cluster info查看cluster_state是否为ok。若为fail,使用cluster nodes识别标记为fail或handshake的节点。使用cluster countkeysinslot {slot}检查特定槽位的key数量,异常槽位通常key数为0但未正确归属。
步骤3:修复缺失或重复的槽位
如果存在未分配的槽(集群状态中的cluster_slots_assigned不等于16384),使用redis-cli --cluster fix {host}:{port}自动修复。该命令会重新分配缺失槽并修复冲突。
手动分配示例:
redis-cli -h {target-node-ip} -p {target-node-port} cluster addslots {slot_id}
注意:手动分配前需确保目标节点没有该槽。
步骤4:处理节点故障引起的槽位迁移
如果存在fail节点,使用cluster forget {node-id}移除故障节点,并执行redis-cli --cluster rebalance {ip}:{port}以自动平衡槽位。
也可通过redis-cli --cluster reshard {ip}:{port}交互式迁移槽位。根据提示输入源节点ID、槽位数量(建议每次迁移少于500个槽)和目标节点ID。
步骤5:验证集群状态
最后执行cluster info确认cluster_state:ok,cluster_slots_assigned=16384。随机插入若干key并检查cluster keyslot {key}对应的节点是否正确。运行redis-cli --cluster check {ip}:{port}输出无错误。
注意事项
- 修复过程中避免对集群执行写入/读取关键业务操作,优先在维护窗口执行。
- 若使用Redis Cluster Proxy(如Twemproxy),需同步更新拓扑配置。
- 大型集群(100+节点)建议分批迁移槽位,避免网络/CPU瞬时压力。
以上步骤适用于大部分Redis集群槽位分配异常场景。若仍无法修复,建议联系Redis社区或专业DBA介入。