Redis集群节点显示fail但telnet 6379成功,说明问题在集群总线端口16379未通;需检查防火墙、安全组、protected-mode、bind及cluster-announce-ip等配置。

cluster nodes 显示 fail,但 telnet 能通 6379 怎么办
说明问题不在业务端口,而在集群总线端口。Redis 集群节点靠 Gossip 协议通信,走的是 16379(即 6379 + 10000),不是 6379。即使 telnet 192.168.5.20 6379 成功,telnet 192.168.5.20 16379 失败,节点照样被标记为 fail。
常见误判点:
- 只测了客户端端口,漏掉总线端口
- 用
ping测试网络层通断,但 ICMP 不代表 TCP 端口可达 - 在云环境只开了安全组的
6379,没加16379
实操建议:
- 在任一节点执行
redis-cli -p 6379 cluster nodes,找出状态异常节点的 IP 和端口(如192.168.5.20:6379) - 立刻从其他正常节点执行:
telnet 192.168.5.20 16379(Linux/macOS)或Test-NetConnection 192.168.5.20 -Port 16379(Windows PowerShell) - 若不通,直接跳到防火墙检查环节,别再查 Redis 日志或配置文件
firewalld / iptables 没放行 16379 端口
Linux 上最常被忽略的点:只开了服务端口,没开集群总线端口。Redis 集群通信不走 6379,Gossip 消息全走 16379,且必须双向开放——节点 A 要能连 B 的 16379,B 也要能连 A 的 16379。
firewalld 示例(需 reload):
firewall-cmd --permanent --add-port=6379/tcp firewall-cmd --permanent --add-port=16379/tcp firewall-cmd --reload
iptables 示例(临时生效):
iptables -I INPUT -p tcp --dport 6379 -j ACCEPT iptables -I INPUT -p tcp --dport 16379 -j ACCEPT service iptables save
注意:
- 云厂商(AWS/Aliyun/Tencent)的安全组策略也得同步加
16379,不能只信本地防火墙 - 某些企业网络有中间设备(如微隔离网关),会拦截非标准端口,
16379就属于“非标准”,需单独报备 -
16379是默认偏移,如果 Redis 启动时指定了非标端口(如--port 7001),总线端口就是17001,不是固定值
protected-mode no 和 bind 配置冲突导致集群发现失败
集群模式下,protected-mode yes 会强制拒绝非本地连接,哪怕你绑定了 0.0.0.0;而 bind 127.0.0.1 则让其他节点根本连不上本机的任何端口(包括 16379)。这两个配置经常一起出问题。
检查方式:
-
redis-cli -p 6379 config get protected-mode→ 必须返回no -
redis-cli -p 6379 config get bind→ 不能是127.0.0.1,应为具体内网 IP 或0.0.0.0
改完后不能只 reload 进程,必须:
- 执行
redis-cli -p 6379 config rewrite持久化到redis.conf - 执行
redis-cli -p 6379 cluster forget <old-node-id></old-node-id>清掉旧节点缓存(否则它可能还在用错的地址尝试连接) - 重启节点或用
redis-cli --cluster add-node重新加入集群
cluster-announce-ip 配置缺失引发分裂视图
跨网络部署(比如混合云、多 VPC)时,节点自动发现的 IP 往往不可靠。Redis 默认用 bind 地址或 getaddrinfo 返回的第一个 IP 做宣告地址,结果 A 节点看到 B 是公网 IP,B 节点看到 A 是私网 IP,Gossip 传播的地址对不上,形成“分裂视图”——每个节点都认为对方不可达,但自己又连得上。
解决方法是显式指定对外宣告地址:
- 在
redis.conf中添加:cluster-announce-ip 10.0.1.100(填该节点实际可被其他节点路由到的私网 IP) - 同时配好
cluster-announce-port 6379和cluster-announce-bus-port 16379(后者常被忽略) - 改完必须
config rewrite+ 重启,仅config set不生效
验证是否生效:执行 redis-cli -p 6379 cluster nodes,看输出中该节点的地址是不是你设的 cluster-announce-ip,而不是自动解析出来的地址。
这个配置一旦漏掉,在跨区域或 NAT 环境里,问题会反复出现,而且日志里几乎不报错,只表现为间歇性 fail 或槽位迁移卡住。


















