Redis 集群节点间总线端口配置错误导致无法加入怎么办?

文章导读
Redis 集群节点间通信依赖总线端口,默认规则是客户端端口加 10000,若该端口被防火墙拦截或配置不一致,节点无法完成握手加入集群。处理重点是放行总线端口并确认配置文件中的端口偏移量未被修改。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 常见问题
  7. G 参考来源
A A

Redis 集群节点间通信依赖总线端口,默认规则是客户端端口加 10000,若该端口被防火墙拦截或配置不一致,节点无法完成握手加入集群。处理重点是放行总线端口并确认配置文件中的端口偏移量未被修改。

先说结论:总线端口不通是节点无法加入集群的常见原因,需确保客户端端口 +10000 的端口在节点间网络可达。

  • 先确认:检查 redis.conf 中是否修改了默认端口偏移量
  • 先处理:在防火墙和安全组中放行总线端口 TCP 连接
  • 再验证:使用 CLUSTER NODES 命令确认节点状态变为 connected

命令速用版

# 查看本地 Redis 监听端口
netstat -tlnp | grep redis

# 测试总线端口连通性 (假设客户端端口 6379,总线端口应为 16379)
telnet <目标节点 IP> 16379

# 检查集群状态
redis-cli `--cluster` check <任意节点 IP>:6379

为什么会这样

Redis Cluster 采用双端口机制,一个用于客户端请求,另一个用于节点间总线通信。总线端口负责传输集群拓扑变更和心跳数据,若该端口受阻,节点间无法交换 Gossip 消息,导致集群状态不一致或无法握手。

默认情况下,总线端口号等于客户端端口号加上 10000。例如客户端端口是 6379,总线端口就是 16379。如果防火墙只放行了 6379 而拦截了 16379,节点可以响应客户端请求,但无法与其他节点建立集群关系。

分步处理

第一步:确认端口配置

查看 redis.conf 配置文件,确认没有手动修改总线端口偏移量。默认无需配置,若修改过需确保所有节点一致。

grep cluster-config-file redis.conf

第二步:放行网络策略

在操作系统防火墙(如 iptables、firewalld)和云厂商安全组中,同时放行客户端端口和总线端口。协议必须为 TCP。

# firewalld 示例
firewall-cmd `--zone`=public `--add-port`=6379/tcp `--permanent`
firewall-cmd `--zone`=public `--add-port`=16379/tcp `--permanent`
firewall-cmd `--reload`

第三步:重新尝试加入

网络通畅后,使用 meet 命令让节点互相发现。若节点已启动但状态异常,可能需要重启 Redis 进程以清除旧的集群缓存文件。

Redis 集群节点间总线端口配置错误导致无法加入怎么办?
redis-cli `--cluster` add-node <新节点 IP>:6379 <现有节点 IP>:6379

怎么验证是否生效

使用 redis-cli 连接任意节点,执行集群状态检查命令。观察节点状态标志是否包含 connected,且集群状态是否为 ok。

redis-cli -h <节点 IP> -p 6379
> CLUSTER INFO
> CLUSTER NODES

在 CLUSTER NODES 输出中,检查每一行末尾的状态字段。若显示 connected 且无 fail 标志,说明总线通信正常。若显示 myself 以外的节点状态为 disconnected 或 fail,说明总线端口仍有阻断。

常见坑

云厂商安全组遗漏:很多用户只开放了 6379,忽略了总线端口。云控制台的安全组规则需单独添加总线端口。

NAT 环境映射错误:在 Docker 或 NAT 网络中,若端口映射不一致,节点广播的 IP 和端口可能无法被外部访问。需配置 cluster-announce-ip 和 cluster-announce-port。

端口偏移量被修改:若客户端端口不是 6379,总线端口依然是客户端端口 +10000。不要误以为总线端口固定是 16379。

常见问题

Redis 集群总线端口一定是 16379 吗?

不一定,默认是客户端端口加 10000。若客户端端口改为 7000,总线端口则为 17000。

防火墙只开客户端端口能读写数据吗?

能读写数据但无法组建集群。客户端请求可正常响应,但节点间无法同步槽位信息和心跳,导致集群不可用。

修改总线端口需要重启吗?

需要。端口配置属于启动参数,修改 redis.conf 中的端口设置后必须重启 Redis 进程才能生效。

参考来源

  • Redis Official Documentation, Redis Cluster specification, https://redis.io/docs/latest/develop/interact/programmability/cluster-spec/
  • Redis GitHub Repository, redis.conf example, https://github.com/redis/redis/blob/unstable/redis.conf