Redis集群创建时出现“Node xxx.xxx is not empty”问题处理

Redis集群创建时出现“Node xxx.xxx is not empty”问题处理

事件回顾

今日重启服务器的Redis集群,登录Redis节点,通过cluster info发现Docker重启后,集群的Redis服务器IP地址发生变化, 导致Redis集群节点未连接,因此需要重新创建Redis集群,但在重新创建Redis集群时出现错误:

[root@localhost ~]# redis-cli --cluster create 172.18.0.49:6379 172.18.0.50:6379 172.18.0.51:6379 --cluster-replicas 0 [ERR]Node 172.18.0.49:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

这个错误表明你尝试加入集群的 Redis 节点(172.18.0.49:6379)不是“干净”的(即集群中有缓存数据)。Redis 集群要求新加入的节点必须是空的,即:

  1. 数据库中不能有数据(Database 0 必须为空)。
  2. 不能保留旧的集群配置信息(如nodes.conf文件中记录的旧集群拓扑或 Node ID)。

根本原因分析:

  • 残留配置文件:非正常关闭集群时,nodes.conf文件未被清理
  • 数据残留:dump.rdb或aof文件包含历史数据

以下是解决该问题的步骤:

方法一:彻底重置节点(推荐)

这是最彻底的方法,适用于你想将该节点作为全新节点加入集群的情况。

  1. 进入该节点并清空数据

连接到报错的节点172.18.0.49:6379,执行以下命令:

redis-cli-h172.18.0.49-p6379如果有密码,先认证 AUTH your_password 清空当前数据库的所有 key FLUSHDB 或者清空所有数据库(更保险) FLUSHALL
  1. 重置集群状态

在同一个redis-cli会话中,执行集群重置命令:

软重置:清除集群配置,但保留 Node ID CLUSTER RESET SOFT 如果软重置后仍然报错,或者你想完全重新生成 Node ID,使用硬重置 CLUSTER RESET HARD
  • 注意:CLUSTER RESET会忘记所有其他节点,清除槽位分配,并将自身变为一个没有任何槽位的空主节点。
  1. 删除持久化的集群配置文件(关键步骤)

如果执行完上述命令后再次创建集群仍然报错,说明磁盘上的nodes.conf文件仍包含旧信息。你需要停止 Redis 服务,删除该文件,然后重启。

(1). 停止 Redis 服务:
bash 根据实际启动方式选择 redis-cli -h 172.18.0.49 -p 6379 SHUTDOWN 或者 systemctl stop redis

(2). 找到并删除nodes.conf
查看redis.confcluster-config-file指定的文件名(默认通常是nodes-6379.confnodes.conf)。
bash 假设数据目录在 /var/lib/redis rm /var/lib/redis/nodes-6379.conf
警告:只删除nodes-*.conf文件,千万不要删除dump.rdbappendonly.aof,除非你确定不需要保留任何数据。

(3). 重启 Redis 服务:
bash redis-server /path/to/redis.conf

(4). 重新执行集群创建命令

现在该节点已经是干净的空节点,可以重新运行你的创建命令:

redis-cli--clustercreate172.18.0.49:6379...其他节点... --cluster-replicas1

方法二:检查并手动清理(仅当无法重启时)

如果你不能重启服务,可以尝试以下步骤,但成功率低于方法一:

  1. 检查是否有 Key:

    redis-cli-h172.18.0.49-p6379DBSIZE

    如果返回大于 0,执行FLUSHALL

  2. 检查集群信息:

    redis-cli-h172.18.0.49-p6379CLUSTER INFO

    如果cluster_known_nodes大于 1,说明它还记得其他节点。执行CLUSTER RESET SOFT

  3. 再次尝试创建。如果依然报错,必须采用方法一中的“删除配置文件并重启”步骤。

常见原因分析

  1. 复用旧容器/实例:在 Docker 环境中,如果容器被重启但未删除卷(Volume),nodes.confdump.rdb会被保留。下次启动时,Redis 会加载旧的集群状态,导致被认为“非空”。
  2. 之前加入过其他集群:该节点之前可能属于另一个集群,即使数据被清空,nodes.conf中的 Cluster ID 和节点列表依然存在。
  3. 测试残留数据:在搭建集群前,曾向该单点 Redis 写入过测试数据。

总结

要解决Node is not empty错误,核心是确保节点处于初始状态:

  1. 无数据 (FLUSHALL)
  2. 无集群记忆 (CLUSTER RESET)
  3. 无持久化集群文件 (删除nodes.conf并重启)

执行完这三步后,节点即可正常加入新集群。

参考资料

[1] CLUSTER RESET | Docs - Redis官网
[2] Troubleshooting pocket guide for Redis Enterprise Software | Docs - Redis官网
[3] CLUSTER RESET | Redis - redis-stack.io
[4] How to Fix ‘CLUSTERDOWN’ Errors in Redis - oneuptime.com
[5] redis 集群 节点错误 redis集群 node is not empty - CSDN博客
[6] Redis 创建群时报错 Node XXX is not empty - CSDN博客
[7] Redis集群出现的问题及处理方法 - CSDN博客
[8] 搭建Redis集群时出现的一些报错处理 - CSDN博客
[9] redis cluster集群常见错误问题记录 - CSDN博客
[10] Node 192.168.132.100:7001 is not empty. Either the node already knows other nodes (check with CLUST - CSDN博客