问题在集群总线端口16379未通;redis集群节点间gossip协议、心跳及故障检测均走16379端口(客户端端口+10000),而非6379,需检查防火墙、安全组及cluster-announce-bus-port配置。

cluster nodes 显示 fail 但 telnet 6379 成功,说明问题在 16379
Redis 集群节点之间不靠 6379 通信,Gossip 协议、心跳、故障检测全走集群总线端口(client port + 10000),默认是 16379。即使你从 A 节点能 telnet B_IP 6379 成功,只要 telnet B_IP 16379 失败,B 就会被标记为 fail 或 noaddr。
常见误判:
- 只测了业务端口,没测总线端口
- 用
ping判断网络通断——ICMP 通不代表16379/TCP可达 - 云平台安全组只开了
6379,漏掉16379
怎么快速确认 16379 是否真的通
先找目标节点:在任一正常节点执行 redis-cli -p 6379 cluster nodes,找出状态异常的节点 IP 和端口(比如 192.168.5.20:6379)。
再从其他节点实测其总线端口:
- Linux/macOS:
telnet 192.168.5.20 16379 - Windows PowerShell:
Test-NetConnection 192.168.5.20 -Port 16379
不通就直接查防火墙或安全组,别翻 Redis 日志——日志里只会反复刷 IOERR 或 timeout,根源不在 Redis 进程本身。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
firewalld / iptables 必须成对放行 client port 和 bus port
如果你用 --port 7001 启动节点,总线端口就是 17001,不是固定 16379。每个节点的两个端口都得显式添加:
firewall-cmd --permanent --add-port=7001/tcpfirewall-cmd --permanent --add-port=17001/tcp- 多节点部署(如 7002/7003)必须逐个配
17002/17003,没有批量捷径 - 执行
firewall-cmd --reload后,务必用firewall-cmd --list-ports确认是否真加进去了
注意:ss -tlnp | grep :7001 要能看到 Redis 进程在监听,否则防火墙开了也没用。
Docker/K8s 环境下 cluster-announce-bus-port 必须显式配置
容器场景下,Redis 自动探测的总线端口往往不对。必须在 redis.conf 中显式设置:
-
cluster-announce-ip设为宿主机可被访问的 IP(不能是127.0.0.1或容器内网 IP) -
cluster-announce-port设为容器映射的客户端端口(如-p 6380:6379→ 填6380) -
cluster-announce-bus-port必须等于cluster-announce-port + 10000(如6380→16380) - 该
bus-port也得在宿主机防火墙或云安全组中放行
没配 cluster-announce-bus-port,节点广播的总线地址仍是自动推导的错误值,其他节点连不上它,自己也收不到心跳——这个坑在 Docker Compose 和 K8s StatefulSet 里高频出现,且极难通过日志定位。










