Redis 集群节点通信失败通常由绑定 IP 限制或 NAT 环境未声明外部 IP 导致,优先检查 redis.conf 中的 bind 和 cluster-announce-ip 配置,并确保防火墙放行 6379 和 16379 端口。
先说结论:配置错误需修正绑定地址并声明集群通告 IP,通信失败需排查网络策略与端口连通性。
- 先确认:检查 redis.conf 中 bind 地址是否包含通信网卡 IP
- 先处理:NAT 或 Docker 环境必须设置 cluster-announce-ip
- 再验证:使用 CLUSTER NODES 确认节点状态为 connected
命令速用版
以下命令用于快速检查当前绑定配置与集群状态,需在节点服务器终端执行:
redis-cli -h 127.0.0.1 -p 6379 CONFIG GET bind
redis-cli -h 127.0.0.1 -p 6379 CLUSTER NODES
redis-cli -h 127.0.0.1 -p 6379 CLUSTER INFO
若需临时修改绑定地址而不重启,可使用 CONFIG SET 命令,但重启后失效:
redis-cli -h 127.0.0.1 -p 6379 CONFIG SET bind 0.0.0.0
为什么会这样
绑定 IP 错误导致监听网卡不匹配,NAT 环境未声明通告 IP 导致节点间握手地址错误。
Redis 服务端通过 bind 参数限制监听的网络接口,若配置为 127.0.0.1 则无法接受外部连接。在集群模式下,节点间通过 Gossip 协议通信,若节点位于 NAT 网关或容器后,内部 IP 无法被其他节点路由,必须通过 cluster-announce-ip 显式声明外部可访问地址。
分步处理
按顺序检查配置文件、网络策略及集群声明信息,每一步完成后需观察日志变化。
步骤 1:检查绑定配置
打开 redis.conf 文件,查找 bind 行。若注释掉则默认绑定所有可用接口,若指定 IP 需确保包含集群通信网卡地址。生产环境建议绑定具体内网 IP 而非 0.0.0.0。
步骤 2:配置集群通告 IP
若节点处于 Docker、Kubernetes 或 NAT 环境,在 redis.conf 中添加 cluster-announce-ip <外部可访问 IP>。同时检查 cluster-announce-port 和 cluster-announce-bus-port 是否被映射。
步骤 3:检查防火墙与安全组
确保服务器防火墙及云厂商安全组放行 TCP 6379(服务端口)和 TCP 16379(集群总线端口,通常为服务端口 +10000)。
步骤 4:重启或重载配置
修改配置文件后重启 Redis 服务。若仅修改 CONFIG SET,需确认持久化配置已更新。
怎么验证是否生效
通过集群状态命令确认节点握手成功且无故障标记。
执行 CLUSTER INFO 命令,检查 cluster_state 字段是否为 ok。执行 CLUSTER NODES 命令,确认所有节点标志位不包含 fail 或 disconnect。查看 Redis 日志文件(默认/var/log/redis/redis.log),确认无 Connection refused 或 CLUSTER_BUSY 错误。
常见坑
忽略集群总线端口、Docker 网络模式配置错误、Protected-mode 拦截连接。
1. 集群总线端口:集群通信不仅需要 6379,还需要 16379(默认偏移量),防火墙常漏配后者。
2. Docker 网络:使用 host 模式可避免 NAT 问题,若用 bridge 模式必须配置端口映射和 announce-ip。
3. 保护模式:protected-mode yes 且未设置密码或绑定 localhost 时,远程连接会被拒绝。
常见问题
bind 配置 0.0.0.0 安全吗?
不建议在生产环境直接绑定 0.0.0.0,应绑定具体内网 IP 并配合防火墙策略。
什么情况下必须设置 cluster-announce-ip?
节点位于 NAT 网关后、容器网络内或客户端无法直接路由节点内部 IP 时必须设置。
CLUSTER NODES 显示 fail 状态怎么办?
先检查网络连通性,确认端口放行,再尝试 CLUSTER MEET 重新握手或重启故障节点。