必须开启cluster-enabled yes,否则无法进入集群模式;需配置cluster-config-file(各节点文件名不可重复)、bind 0.0.0.0 ::1、protected-mode no,并清理残留数据与配置文件,再用redis-cli --cluster create指定6节点(3主3从)执行初始化。

redis.conf 必须开启 cluster-enabled yes
这是启动原生集群最基础、也最容易被跳过的一步。不加这行,redis-server 启动后只是个普通实例,redis-cli --cluster create 会直接报错 [ERR] Node 127.0.0.1:7001 is not empty 或 CLUSTER NODES 返回空,因为根本没进集群模式。
注意:cluster-enabled 必须写在配置文件里,不能靠 CONFIG SET cluster-enabled yes 动态开启 —— Redis 不允许运行时启用集群模式。
- 必须同时设置
cluster-config-file,且每个节点的文件名不能重复(比如nodes-7001.conf、nodes-7002.conf) -
bind建议显式设为0.0.0.0 ::1(IPv4+IPv6),否则单机多实例或 IPv6 环境下可能连不上 -
protected-mode no要关掉,否则即使 bind 了 0.0.0.0,也会拒绝非本地连接
启动前必须清空数据和 node 配置文件
反复执行 redis-cli --cluster create 失败,十有八九是因为残留了旧状态。Redis Cluster 启动时会读取 cluster-config-file 和 dir 下的 dump.rdb / appendonly.aof,只要里面存了键或已有集群元数据,就会拒绝加入新集群。
每次重试前务必手动清理:
- 删掉
cluster-config-file指定的文件(如nodes-7001.conf) - 清空
dir目录下的所有文件(尤其是dump.rdb、appendonly.aof、nodes-*.conf) - 确认
pidfile对应的进程已退出,避免端口占用或 pid 文件残留
别信“重启服务就行”——redis-server 不会自动覆盖或清理这些文件。
redis-cli --cluster create 的参数顺序和数量限制
命令本身不难,但参数稍有差池就直接退出并打印一堆 *** ERROR。核心规则就两条:
- 节点列表必须是完整的 6 个地址(3 主 3 从),格式统一为
IP:PORT,不能混用 hostname(除非 /etc/hosts 全局配好且各节点互通) -
--cluster-replicas 1表示“每 1 个主节点配 1 个从节点”,所以总节点数必须是(master + master × replicas),即最小合法组合是 6 节点(3 主 × 1 从 = 3 从)
常见错误:
redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 --cluster-replicas 1 → 报错 Redis Cluster requires at least 3 master nodes
redis-cli --cluster create 127.0.0.1:7001 ... --cluster-replicas 2 → 6 节点配 2 从/主 = 12 节点,不够就报错
正确示例(单机伪集群):
redis-cli --cluster create \ 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 \ 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 \ --cluster-replicas 1
集群初始化后,cluster nodes 返回 IP 是绑定地址还是发现地址?
这是线上踩坑最多的一环:你 bind 了 0.0.0.0,但 cluster nodes 里显示的可能是容器内网 IP、Docker bridge 地址,甚至 127.0.0.1 —— 导致其他节点连不上。
根本原因是 Redis 启动时会自动探测“本机可路由的 IP”,优先选第一个非 loopback 接口地址。它不看 bind,只看系统路由表。
解决方法只有两个:
- 启动前用
ip addr确认主网卡 IP,并在redis.conf中显式加cluster-announce-ip 192.168.10.10(替换为你的真实业务 IP) - 如果跑在 Docker 或 Kubernetes 里,必须挂载 host 网络,或用
--add-host统一解析,否则cluster-announce-ip也救不了跨主机发现
这个 IP 一旦写入 nodes-*.conf,后续重启都会沿用,改配置不重启是无效的。


















