NATS 轻量消息队列的集群配置
什么是 NATS 集群
NATS 是一个高性能、轻量级的开源消息系统,常用于云原生环境中的服务间通信。集群模式通过多节点协同工作,提供高可用性和水平扩展能力。当单个 NATS 服务器无法满足吞吐量或容错需求时,便可构建集群来共享消息路由、实现负载均衡及故障转移。
集群节点发现机制
NATS 集群支持多种节点发现方式,其中基于路由地址的显式配置最为常用。每个节点都声明其他需要连接的节点地址,启动后会自动建立全互联路由。
- 显式路由:在配置文件中通过
routes定义目标节点地址。 - 种子路由:每个节点只配置一个或多个种子节点,其他节点通过 Gossip 协议自动发现。
- 基于 DNS 的发现:利用 DNS SRV 记录或服务解析,适合容器化部署。
本教程将重点演示基于显式路由的单播配置。
前置条件
- 至少两台能够互相访问的 Linux 服务器(或本地虚拟机),本示例使用三台 IP 分别为
192.168.1.10、192.168.1.11、192.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):连接多个独立集群,实现超大规模、故障隔离的全局消息网格。
故障转移测试
模拟节点宕机以检验高可用性:
- 停止节点 B(
kill进程或停止容器)。 - 在节点 A 或 C 上使用
nats server info查看,cluster_size将变为2,表示节点 B 已离开集群。 - 继续发布/订阅消息,其他节点仍能正常通信。
- 重新启动节点 B,稍等片刻后,集群会自动重新建立路由连接,
cluster_size恢复为3。
附加最佳实践
- 在生产环境中强制开启 TLS,使用
cluster { tls { ... } }块配置加密通信。 - 限制集群中每个节点的最大连接数,避免意外过载。
- 尽量使用相同版本的 NATS Server,版本差异可能导致协议不兼容。
- 使用一致的集群名称(需在同一个故障域中),可通过配置文件顶部的
cluster_name指定,防止意外连接其他集群。 - 日志级别可通过
-l参数或配置文件logtime、debug等选项调整,便于排查网络问题。
总结
通过显式路由配置,仅需定义清晰的路由地址即可快速搭建 NATS 集群。该方式直观、稳定,适用于中小规模部署。随后可结合叶节点或网关构建更复杂的分布式消息平台。集群形成后,客户端只需连接任意节点,即可透明地享受整个集群的收发与容错能力。