NATS 轻量消息队列的集群配置

FreeGuideOnline 最新 2026-07-08

什么是 NATS 集群

NATS 是一个高性能、轻量级的开源消息系统,常用于云原生环境中的服务间通信。集群模式通过多节点协同工作,提供高可用性和水平扩展能力。当单个 NATS 服务器无法满足吞吐量或容错需求时,便可构建集群来共享消息路由、实现负载均衡及故障转移。

集群节点发现机制

NATS 集群支持多种节点发现方式,其中基于路由地址的显式配置最为常用。每个节点都声明其他需要连接的节点地址,启动后会自动建立全互联路由。

  • 显式路由:在配置文件中通过 routes 定义目标节点地址。
  • 种子路由:每个节点只配置一个或多个种子节点,其他节点通过 Gossip 协议自动发现。
  • 基于 DNS 的发现:利用 DNS SRV 记录或服务解析,适合容器化部署。

本教程将重点演示基于显式路由的单播配置。

前置条件

  • 至少两台能够互相访问的 Linux 服务器(或本地虚拟机),本示例使用三台 IP 分别为 192.168.1.10192.168.1.11192.168.1.12 的机器。
  • 已安装 NATS Server(推荐版本 2.10+,可从官方 GitHub 或包管理器获取)。
  • 确保防火墙放行客户端端口(默认 4222)和集群端口(默认 6222)。

安装 NATS Server(如未安装)

在每台机器上执行如下步骤:

# 下载最新稳定版 nats-server(以 Linux amd64 为例)
curl -L https://github.com/nats-io/nats-server/releases/latest/download/nats-server-linux-amd64.tar.gz -o nats-server.tar.gz
tar -xzf nats-server.tar.gz
sudo cp nats-server /usr/local/bin/

验证安装:

nats-server --version

生成集群凭证(可选)

对于生产环境,建议启用 TLS 和认证。本教程仅演示无认证的纯集群配置,便于快速上手。

编写集群配置文件

在每台节点上创建配置文件 /etc/nats-server.conf。以下为三个节点的示例配置,请根据实际 IP 调整。

节点 A(192.168.1.10)配置

# 客户端监听端口
port: 4222

# 集群监听端口与地址
cluster {
  listen: 0.0.0.0:6222

  # 其他节点路由地址
  routes: [
    nats-route://192.168.1.11:6222
    nats-route://192.168.1.12:6222
  ]
}

节点 B(192.168.1.11)配置

port: 4222

cluster {
  listen: 0.0.0.0:6222

  routes: [
    nats-route://192.168.1.10:6222
    nats-route://192.168.1.12:6222
  ]
}

节点 C(192.168.1.12)配置

port: 4222

cluster {
  listen: 0.0.0.0:6222

  routes: [
    nats-route://192.168.1.10:6222
    nats-route://192.168.1.11:6222
  ]
}

注意listen 用于绑定本地集群通信地址,routes 中的地址前必须使用 nats-route:// 协议头。端口 6222 是 NATS 默认集群端口,可按需修改。

启动集群

在每一台机器上分别执行:

nats-server -c /etc/nats-server.conf

建议使用 systemd 或 Supervisor 管理进程,并设置 -D 开启调试日志以便观察集群形成过程。

启动后,可看到类似以下日志,表明节点间已建立路由连接:

[1] 2025/03/24 10:00:01.000000 [INF] 192.168.1.10:6222 - rid:1 - Route connection created
[1] 2025/03/24 10:00:01.000001 [INF] 192.168.1.11:6222 - rid:2 - Route connection created

验证集群状态

使用 nats-top 监控

nats-top 是官方提供的实时监控工具,可直观查看集群节点数量。

nats-top -s nats://192.168.1.10:4222

在监控界面中,按 c 键可切换到集群视图,确认三个节点均显示为 green 状态。

使用 NATS CLI 查询

通过 nats 命令行工具执行服务器信息查询:

nats server info -s nats://192.168.1.10:4222

输出中 cluster_size 字段应为 3,并列出所有节点信息。

发送测试消息

在两个独立的终端上分别运行订阅者和发布者,验证消息跨节点传递:

终端 1(任意节点订阅)

nats sub -s nats://192.168.1.10:4222 "test.>"

终端 2(向另一节点发布)

nats pub -s nats://192.168.1.12:4222 test.greeting "Hello, Cluster!"

终端 1 应能立即收到消息,证明集群路由正常工作。

常见集群拓扑

  • 全互联(Full Mesh):所有节点彼此直连,3~5 个节点时可靠且低延迟,超出此规模建议采用网关或超级集群。
  • 叶节点(Leaf Nodes):用于跨数据中心或网络隔离下的集群扩展,可降低 WAN 通信开销。
  • 网关(Gateway):连接多个独立集群,实现超大规模、故障隔离的全局消息网格。

故障转移测试

模拟节点宕机以检验高可用性:

  1. 停止节点 B(kill 进程或停止容器)。
  2. 在节点 A 或 C 上使用 nats server info 查看,cluster_size 将变为 2,表示节点 B 已离开集群。
  3. 继续发布/订阅消息,其他节点仍能正常通信。
  4. 重新启动节点 B,稍等片刻后,集群会自动重新建立路由连接,cluster_size 恢复为 3

附加最佳实践

  • 在生产环境中强制开启 TLS,使用 cluster { tls { ... } } 块配置加密通信。
  • 限制集群中每个节点的最大连接数,避免意外过载。
  • 尽量使用相同版本的 NATS Server,版本差异可能导致协议不兼容。
  • 使用一致的集群名称(需在同一个故障域中),可通过配置文件顶部的 cluster_name 指定,防止意外连接其他集群。
  • 日志级别可通过 -l 参数或配置文件 logtimedebug 等选项调整,便于排查网络问题。

总结

通过显式路由配置,仅需定义清晰的路由地址即可快速搭建 NATS 集群。该方式直观、稳定,适用于中小规模部署。随后可结合叶节点或网关构建更复杂的分布式消息平台。集群形成后,客户端只需连接任意节点,即可透明地享受整个集群的收发与容错能力。