Redis 集群启动报 CLUSTERBUSY 或 Slot busy 错误,通常是因为节点残留了旧的集群配置文件或数据,导致槽位状态冲突。最推荐的处理方向是清除所有节点上的 cluster-config-file 文件和 RDB/AOF 数据,并执行 cluster reset 重置节点状态后重新启动。
先说结论:该错误本质是集群槽位状态不一致,需清理残留配置并重置节点。
- 先确认:检查报错日志是否包含 ERR Slot is already busy 或节点无法握手。
- 先处理:删除 nodes-*.conf 配置文件及 dump.rdb 文件,执行 flushall 和 cluster reset。
- 再验证:使用 cluster info 查看 cluster_state 是否为 ok。
命令速用版
若需快速清理环境,可在每个节点依次执行以下命令,注意这会清空该节点所有数据。
redis-cli -p 7000 flushallredis-cli -p 7000 cluster resetrm -f nodes-7000.conf dump-7000.rdb appendonly-7000.aof
清理完成后,重新运行集群创建命令,例如:
redis-cli `--cluster` create 127.0.0.1:7000 127.0.0.1:7001 ... `--cluster-replicas` 1
为什么会这样
核心原因是上一次集群配置失败留下的元数据干扰了新集群的初始化。Redis 集群节点会在本地生成 cluster-config-file(默认 nodes-*.conf),记录槽位分配和节点关系。如果重启或重建集群时未删除该文件,节点会认为旧槽位仍被占用,从而报出 Slot is already busy 错误。此外,数据库 0 中若存有数据,也可能导致节点被视为非空而拒绝加入新集群。
分步处理
按顺序执行以下操作,确保所有参与集群的节点状态一致。
1. 停止所有 Redis 实例
避免在清理文件时进程正在写入,导致文件锁或数据不一致。
2. 删除本地残留文件
进入每个节点的启动目录,删除 cluster-config-file 指定的文件(如 nodes-7000.conf)以及 rdb 和 aof 文件。参考来源指出,需删除 redis.conf 里面 cluster-config-file 所在的文件。
3. 重置节点状态
启动单个节点,连接后执行 flushall 清空数据,再执行 cluster reset 清除集群元数据。若节点无法启动,先完成文件删除再启动。
4. 重新创建集群
所有节点清理完毕后,使用 redis-cli 或 redis-trib.rb 重新执行 create 命令。确保地址使用 IP 而非域名,避免 ERR Invalid node address specified 错误。
怎么验证是否生效
操作完成后,通过以下指标确认集群恢复正常。
1. 检查集群状态
连接任意节点执行 cluster info,确认 cluster_state:ok 且 cluster_slots_assigned:16383。
2. 检查节点握手
执行 cluster nodes,确认所有节点状态显示为 connect 或 master/slave,无 fail 或 connecting 状态。
3. 验证端口监听
使用 netstat -tuln | grep :端口 确认客户端端口和总线端口(客户端端口 +10000)均处于 LISTEN 状态,排除端口冲突导致的握手失败。
常见坑
处理过程中容易忽略以下细节,导致问题复发。
1. 总线端口冲突
Redis 集群总线端口默认为客户端端口 +10000。若规划不当(如 6999 和 7000 同时部署),总线端口可能重叠。确保任意两个节点的 client_port 与 client_port + 10000 区间互不重叠。
2. 配置文件名重复
单机搭建多节点时,若节点 conf 文件名字一样或 cluster-config-file 指向同一文件,会导致槽位冲突。确保每个节点有独立的集群配置文件名。
3. 绑定地址限制
若 redis.conf 中 bind 了 127.0.0.1,外部节点无法连接。集群部署建议注释 bind 或绑定具体局域网 IP,并设置 protected-mode no。
常见问题
报错 ERR Slot 0 is already busy 怎么解决?
这是典型的残留配置错误,需删除所有节点上的 nodes-*.conf 文件并执行 cluster reset。
集群启动一直卡在 Waiting for the cluster to join 怎么办?
检查防火墙是否放行了客户端端口及总线端口(端口 +10000),并确认节点间网络互通。
redis-trib.rb 提示 Ruby 版本过低如何处理?
redis-trib.rb 依赖 Ruby 2.3.0 或以上版本,若版本过低需升级 Ruby 或改用 redis-cli `--cluster` 命令。
参考来源
1. CSDN 博客,标题:redis 集群启动报错 解决方案_waiting for node to register,内容涉及删除备份文件及 cluster-config-file。
2. 51CTO 博客,标题:redis 集群搭建 (二),URL:http://blog.51cto.com/zhoushouby/1560505,指出节点配置文件名重复导致 Slot busy。
3. CSDN 博客,标题:解决 Redis 集群部署常见错误,内容涉及删除上次启动自动生成的所有文件。
4. CSDN 博客,标题:创建 Redis-Cluster 集群常见问题 - 解决方案,内容涉及 Ruby 版本兼容及哈希槽占用错误处理。