根本原因是cluster-announce-ip未显式配置,导致节点广播Docker内网IP或127.0.0.1;必须设为其他节点可直连的真实IP,且同步配置cluster-announce-port与cluster-announce-bus-port,并删除旧nodes.conf。

Redis集群在容器里启动后节点互相认不出、握手失败、客户端连上却重定向到内网IP——根本不是网络不通,而是每个节点“自报家门”的IP错了。
cluster-announce-ip 必须显式配置,不能依赖默认值
Redis 6.0+ 才支持 cluster-announce-ip,但很多部署直接跳过它,结果节点启动后调用 getaddrinfo() 拿到的是 Docker 网桥地址(如 172.17.0.5)或 127.0.0.1,其他节点根本连不上。
-
cluster-announce-ip值必须是其他节点能直接telnet通的地址:宿主机真实局域网 IP(如192.168.31.130)、Kubernetes Headless Service DNS 名(需 Redis 6.2+ 且开启cluster-announce-hostnames yes) -
cluster-announce-port和cluster-announce-bus-port必须与实际监听端口一致;比如容器内port 7001,则总线端口默认是17001,cluster-announce-bus-port就得设成17001 - 所有节点的
cluster-announce-ip必须能互相路由——别混用公网 IP 和内网 IP,否则部分节点握手成功、部分卡在WAITING FOR CLUSTER TO JOIN - 改完配置后,
nodes.conf里的旧 IP 不会自动更新,必须手动批量替换或删掉让 Redis 重建(重启前删nodes.conf最省事)
bind 和 cluster-announce-ip 必须保持一致,且不能是 0.0.0.0 或 127.0.0.1
很多人设了 bind 0.0.0.0 图省事,但 cluster-announce-ip 仍得填具体可连通 IP。填 0.0.0.0 或 127.0.0.1 会导致其他节点尝试连 127.0.0.1:7001 ——那只是它自己,不是你想要的节点。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
-
bind要设为宿主机对外可用的网卡 IP(比如192.168.1.100),不是docker0或vethxxx这类虚拟网卡地址 -
cluster-announce-ip必须和bind值相同,否则 Redis 内部逻辑会混乱:监听在一个地址,却告诉别人它在另一个地址 - 用
ss -tuln | grep :7001确认进程真正在监听你填的那个 IP,而不是只监听127.0.0.1
host 模式下不能靠 -p 映射端口,但防火墙必须放行总线端口
用 --network host 启动容器时,-p 7001:6379 完全无效,容器直接占宿主机端口。但很多人忘了:Redis Cluster 总线通信端口(client_port + 10000)必须手动开放,否则节点间发不出 MEET 消息。
- 宿主机防火墙(
iptables/firewalld)必须放行所有节点的客户端端口(如7001–7006)和对应总线端口(如17001–17006) - 云服务器安全组也要同步开这些端口,缺一不可;只开客户端端口、不开总线端口,集群永远卡在
Waiting for the cluster to join - 不要试图用
-p 17001:16379映射总线端口——host 模式下它不生效,只靠宿主机原生端口通信 - 多个 Redis 实例共用 host 网络时,务必确认端口不冲突:
ss -tuln | grep :7001查有没有被其他进程占用
客户端连上后重定向到内网 IP?那是 cluster nodes 返回的 announce-ip 不对
公网客户端通过 redis-cli -c -h 公网IP -p 7001 连上,执行 SET foo bar 却被重定向到 172.17.0.5:7001 ——说明集群拓扑里存的就是错的 IP,不是客户端配置问题。
- 用
redis-cli -h 公网IP -p 7001 cluster nodes查看返回内容,确认每个节点的 IP 字段是否为你配置的cluster-announce-ip - 如果仍是内网 IP,说明配置没生效:检查 redis.conf 是否加载正确、
redis-server启动时是否指定了该配置文件、nodes.conf是否残留旧记录 - 在 Kubernetes 中若用 Headless Service,DNS 名必须能被所有 Pod 解析,且 Redis 版本 ≥ 6.2、
cluster-announce-hostnames yes已启用
最常被忽略的一点:改完 cluster-announce-ip 后,不删 nodes.conf,Redis 会优先读它里面缓存的旧 IP,导致新配置形同虚设。

















