NATS集群部署
2026/1/15大约 3 分钟
NATS集群部署
集群架构
NATS 支持多种集群模式,提供高可用和水平扩展能力。
集群模式
1. 全网格集群(Full Mesh)
所有节点互相连接,适合小规模集群。
2. 超级集群(Super Cluster)
通过 Gateway 连接多个集群,适合跨地域部署。
3. Leaf Node
边缘节点连接到中心集群,适合边缘计算场景。
基础集群配置
节点 1 配置
# node1.conf
server_name: nats-1
listen: 0.0.0.0:4222
http_port: 8222
cluster {
name: my-cluster
listen: 0.0.0.0:6222
routes: [
nats-route://nats-2:6222
nats-route://nats-3:6222
]
}
jetstream {
store_dir: /data/jetstream
max_mem: 1G
max_file: 10G
}节点 2 配置
# node2.conf
server_name: nats-2
listen: 0.0.0.0:4222
http_port: 8222
cluster {
name: my-cluster
listen: 0.0.0.0:6222
routes: [
nats-route://nats-1:6222
nats-route://nats-3:6222
]
}
jetstream {
store_dir: /data/jetstream
max_mem: 1G
max_file: 10G
}节点 3 配置
# node3.conf
server_name: nats-3
listen: 0.0.0.0:4222
http_port: 8222
cluster {
name: my-cluster
listen: 0.0.0.0:6222
routes: [
nats-route://nats-1:6222
nats-route://nats-2:6222
]
}
jetstream {
store_dir: /data/jetstream
max_mem: 1G
max_file: 10G
}Docker Compose 部署
version: '3.8'
services:
nats-1:
image: nats:latest
container_name: nats-1
ports:
- "4222:4222"
- "8222:8222"
volumes:
- ./node1.conf:/etc/nats/nats.conf
- nats-1-data:/data
command: ["-c", "/etc/nats/nats.conf"]
networks:
- nats-cluster
nats-2:
image: nats:latest
container_name: nats-2
ports:
- "4223:4222"
- "8223:8222"
volumes:
- ./node2.conf:/etc/nats/nats.conf
- nats-2-data:/data
command: ["-c", "/etc/nats/nats.conf"]
networks:
- nats-cluster
nats-3:
image: nats:latest
container_name: nats-3
ports:
- "4224:4222"
- "8224:8222"
volumes:
- ./node3.conf:/etc/nats/nats.conf
- nats-3-data:/data
command: ["-c", "/etc/nats/nats.conf"]
networks:
- nats-cluster
networks:
nats-cluster:
driver: bridge
volumes:
nats-1-data:
nats-2-data:
nats-3-data:JetStream 集群
JetStream 在集群模式下支持数据复制,提供高可用性。
配置副本数
// 创建带副本的 Stream
js.AddStream(&nats.StreamConfig{
Name: "ORDERS",
Subjects: []string{"orders.*"},
Storage: nats.FileStorage,
Replicas: 3, // 3 副本
})副本选举
当 Leader 故障时,Follower 会自动选举新的 Leader。
超级集群配置
集群 A(US)
# us-node1.conf
server_name: us-nats-1
listen: 0.0.0.0:4222
cluster {
name: us-cluster
listen: 0.0.0.0:6222
routes: [
nats-route://us-nats-2:6222
]
}
gateway {
name: us-cluster
listen: 0.0.0.0:7222
gateways: [
{ name: eu-cluster, urls: ["nats://eu-nats-1:7222"] }
]
}集群 B(EU)
# eu-node1.conf
server_name: eu-nats-1
listen: 0.0.0.0:4222
cluster {
name: eu-cluster
listen: 0.0.0.0:6222
routes: [
nats-route://eu-nats-2:6222
]
}
gateway {
name: eu-cluster
listen: 0.0.0.0:7222
gateways: [
{ name: us-cluster, urls: ["nats://us-nats-1:7222"] }
]
}Leaf Node 配置
Hub 节点
# hub.conf
server_name: hub-nats
listen: 0.0.0.0:4222
leafnodes {
listen: 0.0.0.0:7422
}Leaf 节点
# leaf.conf
server_name: leaf-nats
listen: 0.0.0.0:4222
leafnodes {
remotes: [
{ url: "nats://hub-nats:7422" }
]
}客户端连接集群
// 连接多个服务器
nc, err := nats.Connect("nats://nats-1:4222,nats://nats-2:4222,nats://nats-3:4222",
nats.MaxReconnects(-1), // 无限重连
nats.ReconnectWait(time.Second),
nats.DisconnectErrHandler(func(nc *nats.Conn, err error) {
log.Printf("Disconnected: %v", err)
}),
nats.ReconnectHandler(func(nc *nats.Conn) {
log.Printf("Reconnected to %s", nc.ConnectedUrl())
}),
)监控集群状态
# 查看集群信息
nats server report jetstream --cluster
# 查看路由信息
curl http://localhost:8222/routez
# 查看网关信息
curl http://localhost:8222/gatewayz
# 查看 Leaf 节点
curl http://localhost:8222/leafz输出示例:
╭─────────────────────────────────────────────────────────────────────────────────────╮
│ Cluster Overview │
├──────────┬──────────┬────────┬─────────┬─────────┬────────┬─────────┬───────────────┤
│ Server │ Cluster │ Conns │ Subs │ Msgs In │ Msgs Out│ Bytes In│ Bytes Out │
├──────────┼──────────┼────────┼─────────┼─────────┼────────┼─────────┼───────────────┤
│ nats-1 │ my-cluster│ 10 │ 50 │ 1000 │ 2000 │ 100KB │ 200KB │
│ nats-2 │ my-cluster│ 8 │ 45 │ 800 │ 1600 │ 80KB │ 160KB │
│ nats-3 │ my-cluster│ 12 │ 55 │ 1200 │ 2400 │ 120KB │ 240KB │
╰──────────┴──────────┴────────┴─────────┴─────────┴────────┴─────────┴───────────────╯小结
NATS 提供了灵活的集群部署方案,包括全网格集群、超级集群和 Leaf Node 模式。JetStream 在集群模式下支持数据复制,确保高可用性。
面试题预览
常见面试题
- NATS 集群如何实现高可用?
- 超级集群和普通集群有什么区别?
- JetStream 的副本机制是如何工作的?
