集群部署
生产环境需要部署 Nacos 集群以保证高可用性。本章介绍 Nacos 集群的部署方法和注意事项。
集群架构
推荐架构
Nacos 推荐使用以下架构部署:
┌──────────────┐
│ 域名/VIP │
│ nacos.xxx.com│
└──────────────┘
│
┌──────┴──────┐
│ Nginx/SLB │
│ 负载均衡 │
└──────┬──────┘
│
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Nacos-1 │ │ Nacos-2 │ │ Nacos-3 │
│ :8848 │◄──►│ :8848 │◄──►│ :8848 │
└──────────┘ └──────────┘ └──────────┘
│ │ │
└────────────────┼────────────────┘
│
┌──────┴──────┐
│ MySQL │
│ 主从集群 │
└─────────────┘
访问方式对比
| 访问方式 | 说明 | 推荐场景 |
|---|---|---|
| 直接 IP | <http://ip1:port/openAPI> | 不推荐,故障时需要修改 IP |
| 内网 SLB | <http://SLB:port/openAPI> | 内网访问,不暴露公网 |
| 域名 + SLB | <http://nacos.com:port/openAPI> | 推荐,可读性好,便于切换 IP |
端口说明
Nacos 2.x 使用以下端口:
| 端口 | 用途 | 说明 |
|---|---|---|
| 8848 | 主端口 | 客户端、控制台、OpenAPI |
| 9848 | gRPC 客户端端口 | 8848 + 1000 |
| 9849 | gRPC 服务端端口 | 8848 + 1001 |
| 7848 | Raft 协议端口 | 8848 - 100 |
端口配置
使用 VIP/Nginx 时,需要配置为 TCP 转发,不能使用 HTTP 代理,否则会导致 gRPC 连接中断。 9849 和 7848 端口用于服务间通信,不要暴露给外网或客户端。
环境准备
硬件要求
| 配置项 | 最低要求 | 推荐配置 |
|---|---|---|
| CPU | 2 核 | 4 核+ |
| 内存 | 4 GB | 8 GB+ |
| 磁盘 | 50 GB | 100 GB+ SSD |
| 节点数 | 3 | 3 或 5 |
软件要求
| 软件 | 版本要求 |
|---|---|
| 操作系统 | 64 位 Linux(推荐) |
| JDK | 1.8+ |
| MySQL | 5.7+ 或 8.0+ |
集群部署步骤
1. 准备数据库
创建 Nacos 数据库并初始化表结构:
-- 创建数据库
CREATE DATABASE nacos CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
-- 创建用户
CREATE USER 'nacos'@'%' IDENTIFIED BY 'nacos_password';
-- 授权
GRANT ALL PRIVILEGES ON nacos.* TO 'nacos'@'%';
FLUSH PRIVILEGES;
执行 Nacos 提供的 SQL 脚本初始化表结构:
mysql -u nacos -p nacos < conf/mysql-schema.sql
2. 下载安装包
在所有节点下载并解压 Nacos:
# 下载
wget https://github.com/alibaba/nacos/releases/download/2.3.0/nacos-server-2.3.0.tar.gz
# 解压
tar -xzf nacos-server-2.3.0.tar.gz
cd nacos
3. 配置集群节点
编辑 conf/cluster.conf 文件,配置所有集群节点:
# 格式:ip:port
# 建议使用内网 IP
192.168.1.101:8848
192.168.1.102:8848
192.168.1.103:8848
注意
所有节点的 cluster.conf 配置必须一致,且不能使用 127.0.0.1 或 localhost。
4. 配置数据库连接
编辑 conf/application.properties 文件:
# 数据库配置
spring.datasource.platform=mysql
# 数据库数量
db.num=1
# 数据库连接信息
db.url.0=jdbc:mysql://192.168.1.200:3306/nacos?characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
db.user.0=nacos
db.password.0=nacos_password
# 连接池配置
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
5. 配置认证
生产环境必须开启认证:
# 开启认证
nacos.core.auth.enabled=true
nacos.core.auth.system.type=nacos
# Token 密钥(所有节点必须一致,建议使用 32 位以上随机字符串)
nacos.core.auth.plugin.nacos.token.secret.key=YourSecretKey012345678901234567890123456789012345678901234567890123456789
# 服务端身份识别(所有节点必须一致)
nacos.core.auth.server.identity.key=nacos-server-identity
nacos.core.auth.server.identity.value=nacos-server-identity-value
6. 启动集群
在所有节点执行启动命令:
# 启动集群模式
sh startup.sh
启动成功后,查看日志确认:
tail -f logs/start.out
7. 验证集群状态
# 检查集群状态
curl "http://192.168.1.101:8848/nacos/v1/ns/operator/metrics"
返回结果中 raftMetrics 包含集群信息。
Nginx 负载均衡配置
Nginx 配置
upstream nacos-cluster {
server 192.168.1.101:8848 weight=1;
server 192.168.1.102:8848 weight=1;
server 192.168.1.103:8848 weight=1;
}
server {
listen 8848;
server_name nacos.xxx.com;
location /nacos/ {
proxy_pass http://nacos-cluster/nacos/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# gRPC 端口(TCP 转发)
stream {
upstream nacos-grpc {
server 192.168.1.101:9848 weight=1;
server 192.168.1.102:9848 weight=1;
server 192.168.1.103:9848 weight=1;
}
server {
listen 9848;
proxy_pass nacos-grpc;
}
}
客户端配置
spring:
cloud:
nacos:
discovery:
server-addr: nacos.xxx.com:8848
config:
server-addr: nacos.xxx.com:8848
Docker 部署
Docker Compose 配置
version: '3.8'
services:
nacos1:
image: nacos/nacos-server:v2.3.0
container_name: nacos1
environment:
- MODE=cluster
- NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=mysql
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_DB_NAME=nacos
- MYSQL_SERVICE_USER=nacos
- MYSQL_SERVICE_PASSWORD=nacos
- NACOS_AUTH_ENABLE=true
- NACOS_AUTH_TOKEN=YourSecretKey012345678901234567890123456789012345678901234567890123456789
- NACOS_AUTH_IDENTITY_KEY=nacos-server-identity
- NACOS_AUTH_IDENTITY_VALUE=nacos-server-identity-value
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
depends_on:
- mysql
restart: always
nacos2:
image: nacos/nacos-server:v2.3.0
container_name: nacos2
environment:
- MODE=cluster
- NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=mysql
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_DB_NAME=nacos
- MYSQL_SERVICE_USER=nacos
- MYSQL_SERVICE_PASSWORD=nacos
- NACOS_AUTH_ENABLE=true
- NACOS_AUTH_TOKEN=YourSecretKey012345678901234567890123456789012345678901234567890123456789
- NACOS_AUTH_IDENTITY_KEY=nacos-server-identity
- NACOS_AUTH_IDENTITY_VALUE=nacos-server-identity-value
ports:
- "8849:8848"
- "9858:9848"
- "9859:9849"
depends_on:
- mysql
restart: always
nacos3:
image: nacos/nacos-server:v2.3.0
container_name: nacos3
environment:
- MODE=cluster
- NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=mysql
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_DB_NAME=nacos
- MYSQL_SERVICE_USER=nacos
- MYSQL_SERVICE_PASSWORD=nacos
- NACOS_AUTH_ENABLE=true
- NACOS_AUTH_TOKEN=YourSecretKey012345678901234567890123456789012345678901234567890123456789
- NACOS_AUTH_IDENTITY_KEY=nacos-server-identity
- NACOS_AUTH_IDENTITY_VALUE=nacos-server-identity-value
ports:
- "8850:8848"
- "9868:9848"
- "9869:9849"
depends_on:
- mysql
restart: always
mysql:
image: mysql:8.0
container_name: nacos-mysql
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=nacos
- MYSQL_USER=nacos
- MYSQL_PASSWORD=nacos
volumes:
- ./mysql-data:/var/lib/mysql
- ./nacos-mysql.sql:/docker-entrypoint-initdb.d/nacos-mysql.sql
ports:
- "3306:3306"
restart: always
启动服务:
docker-compose up -d
Kubernetes 部署
使用 Helm 部署
# 添加 Helm 仓库
helm repo add nacos https://nacos-group.github.io/nacos-k8s-helm
# 安装 Nacos 集群
helm install nacos nacos/nacos \
--set replicaCount=3 \
--set mysql.enabled=true \
--set mysql.auth.rootPassword=root \
--set mysql.auth.database=nacos \
--set auth.enabled=true
手动部署
创建 nacos-cluster.yaml:
apiVersion: v1
kind: Service
metadata:
name: nacos-headless
labels:
app: nacos
spec:
type: ClusterIP
clusterIP: None
ports:
- port: 8848
name: server
- port: 9848
name: client-rpc
- port: 9849
name: server-rpc
selector:
app: nacos
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nacos
spec:
serviceName: nacos-headless
replicas: 3
selector:
matchLabels:
app: nacos
template:
metadata:
labels:
app: nacos
spec:
containers:
- name: nacos
image: nacos/nacos-server:v2.3.0
ports:
- containerPort: 8848
- containerPort: 9848
- containerPort: 9849
env:
- name: MODE
value: "cluster"
- name: NACOS_SERVERS
value: "nacos-0.nacos-headless:8848 nacos-1.nacos-headless:8848 nacos-2.nacos-headless:8848"
- name: SPRING_DATASOURCE_PLATFORM
value: "mysql"
- name: MYSQL_SERVICE_HOST
value: "mysql"
- name: MYSQL_SERVICE_PORT
value: "3306"
- name: MYSQL_SERVICE_DB_NAME
value: "nacos"
- name: MYSQL_SERVICE_USER
value: "nacos"
- name: MYSQL_SERVICE_PASSWORD
value: "nacos"
集群运维
健康检查
# 检查服务健康状态
curl "http://localhost:8848/nacos/v1/ns/operator/metrics"
# 检查集群状态
curl "http://localhost:8848/nacos/v1/core/cluster/nodes"
日志查看
# 启动日志
tail -f logs/start.out
# 运行日志
tail -f logs/nacos.log
# 访问日志
tail -f logs/access.log
数据备份
# 备份 MySQL 数据库
mysqldump -u nacos -p nacos > nacos_backup.sql
# 备份配置文件
cp -r conf conf_backup
滚动升级
- 停止一个节点
- 更新该节点的 Nacos 版本
- 启动该节点
- 验证该节点正常
- 重复以上步骤升级其他节点
扩容缩容
扩容:
- 部署新节点
- 更新所有节点的
cluster.conf - 重启所有节点
缩容:
- 停止要下线的节点
- 更新其他节点的
cluster.conf - 重启其他节点
常见问题
1. 集群节点无法通信
检查以下几点:
- 防火墙是否开放端口(8848、9848、9849、7848)
cluster.conf配置是否正确- 节点间网络是否连通
2. 数据不一致
检查以下几点:
- 数据库连接是否正常
- 是否有节点掉线
- 查看日志是否有同步错误
3. 性能问题
优化建议:
- 增加节点数量
- 优化数据库连接池配置
- 增加内存配置
- 使用 SSD 磁盘
4. 频繁 Leader 切换
可能原因:
- 网络不稳定
- 节点负载不均
- GC 时间过长
解决方案:
- 优化网络配置
- 调整 JVM 参数
- 增加节点资源