cluster-announce-ip 和 cluster-announce-port 必须成对设置,前者指定节点对外广播的IP(如宿主机公网或内网IP),后者必须与容器映射的客户端端口一致,且cluster-announce-bus-port需为后者加10000,三者共同确保集群内外通信正常。

cluster-announce-ip 和 cluster-announce-port 必须成对设置
Redis 集群节点启动后,会通过 Gossip 协议向其他节点广播自己的地址信息。如果只改了 cluster-announce-ip 却没同步改 cluster-announce-port,客户端或其它节点拿到的仍是旧端口(比如 6379),但实际容器映射的是 6380 —— 连接必然失败。
常见错误现象:CLUSTER NODES 返回的节点地址是 172.18.0.2:6379,但宿主机上 docker ps 显示该容器映射的是 0.0.0.0:6380->6379/tcp,外部根本连不上这个“假端口”。
-
cluster-announce-ip应设为宿主机可被访问的 IP(如云服务器公网 IP 或 Docker 宿主机内网 IP) -
cluster-announce-port必须与容器对外暴露的客户端端口一致(如-p 6380:6379时,此处填6380) -
cluster-announce-bus-port同理,必须等于cluster-announce-port + 10000(如 6380 → 16380),且该端口也得在防火墙/安全组中放行
bind 0.0.0.0 不等于 cluster-announce-ip 可以省略
很多人误以为只要 bind 0.0.0.0 + protected-mode no 就够了,其实完全不够。Redis 启动时读取 bind 决定监听哪个网卡,但它广播给集群的地址由 cluster-announce-ip 控制 —— 两者完全解耦。
典型翻车场景:Docker 容器里 bind 0.0.0.0,但 cluster-announce-ip 没配,结果 Redis 自动用容器内部 IP(如 172.18.0.2)广播,外部客户端拿到后直连失败。
- 即使你用
--network=host模式,也建议显式配置cluster-announce-ip,避免依赖自动探测 - 不要在配置里写
cluster-announce-ip 127.0.0.1,这会导致所有节点都广播回环地址 - 若用 Docker Compose,
cluster-announce-ip应填宿主机 IP,不是host.docker.internal(后者仅容器内可用,集群节点间不可达)
集群总线端口(bus-port)必须单独放行
Redis Cluster 节点之间靠两个端口通信:client port(如 6379)和 bus port(默认 client port + 10000)。后者用于 Gossip、failover 投票、槽迁移等关键操作,但常被忽略。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
现象:redis-cli --cluster create 卡在 Waiting for the cluster to join...,CLUSTER NODES 里节点状态长期为 fail 或不显示。
- 云服务器必须在安全组中同时开放两个端口:例如客户端映射为 6380,则需放行
6380和16380 - Docker 运行时必须用
-p显式映射 bus port:-p 16380:16380,不能只映射 client port - Linux 主机防火墙(如
ufw或firewalld)也要允许这两个端口,否则节点间握手失败
docker network 桥接模式下 cluster-announce-ip 不能填容器 IP
当使用 docker network create redis-net 创建自定义桥接网络时,容器获得的是类似 172.18.0.x 的内部 IP。这些地址对外不可达,但若你在 redis.conf 中把 cluster-announce-ip 设为此类地址,集群拓扑就会污染 —— 外部客户端拿到后无法连接,内部节点也可能因路由混乱拒绝加入。
正确做法是:无论容器网络类型如何,cluster-announce-ip 始终指向外部可访问的入口地址(宿主机 IP 或负载均衡 VIP),让所有节点“对外统一出口”。
- 用
docker inspect redis-net查到网关 IP(如172.18.0.1)≠ 可用的cluster-announce-ip,它只是网桥网关,不转发外部请求 - 若服务和 Redis 都在同台宿主机,
cluster-announce-ip可填宿主机内网 IP(如192.168.1.100),前提是客户端能路由到它 - 跨主机部署时,
cluster-announce-ip必须是各节点彼此可达的三层 IP,不能依赖 Docker 虚拟网段
最易被忽略的一点:cluster-announce-* 系列参数一旦写入,Redis 就不再尝试自动发现地址;哪怕你后续改了宿主机网络或加了代理,只要配置没更新,集群就继续广播过期信息。每次调整网络拓扑,务必检查并重载这些配置。

















