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,执行以下命令:

bash 复制代码
redis-cli -h 172.18.0.49 -p 6379

如果有密码,先认证
AUTH your_password

清空当前数据库的所有 key
FLUSHDB

或者清空所有数据库(更保险)
FLUSHALL
  1. 重置集群状态

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

bash 复制代码
软重置:清除集群配置,但保留 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). 重新执行集群创建命令

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

bash 复制代码
redis-cli --cluster create 172.18.0.49:6379 ...其他节点... --cluster-replicas 1

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

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

  1. 检查是否有 Key:

    bash 复制代码
    redis-cli -h 172.18.0.49 -p 6379 DBSIZE

    如果返回大于 0,执行 FLUSHALL

  2. 检查集群信息:

    bash 复制代码
    redis-cli -h 172.18.0.49 -p 6379 CLUSTER 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博客

相关推荐
utf8mb4安全女神2 小时前
【Redis数据库】哨兵集群/redis集群/安装配置/主从复制/数据持久化操作/数据结构/安全限制/PHP redis/
linux·服务器·数据结构·数据库·redis·缓存
lzz的编码时刻3 小时前
Liquibase 入门实战教程
数据库·运维开发
Zk.Sun3 小时前
Linux设置触屏双击距离容差
linux·运维·数据库
山峰哥4 小时前
数据库工程:Explain执行计划对比实战指南‌
数据库·sql·oracle·深度优先·宽度优先
crisps_ww4 小时前
自媒体运营分析-BI可视化仪表盘制作
数据库
xto_coo4 小时前
锡膏存储方法有哪些?
缓存
Geek-Chow4 小时前
微服务认证与授权:01 — 概念
java·前端·数据库
烤代码的吐司君5 小时前
Redis IO 多路复用原理与引入原因深度解析
数据库·redis·php
韶博雅6 小时前
oracle密码策略检查
数据库·oracle