跳到主要内容

集群部署

生产环境需要部署 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
9848gRPC 客户端端口8848 + 1000
9849gRPC 服务端端口8848 + 1001
7848Raft 协议端口8848 - 100
端口配置

使用 VIP/Nginx 时,需要配置为 TCP 转发,不能使用 HTTP 代理,否则会导致 gRPC 连接中断。 9849 和 7848 端口用于服务间通信,不要暴露给外网或客户端。

环境准备

硬件要求

配置项最低要求推荐配置
CPU2 核4 核+
内存4 GB8 GB+
磁盘50 GB100 GB+ SSD
节点数33 或 5

软件要求

软件版本要求
操作系统64 位 Linux(推荐)
JDK1.8+
MySQL5.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.1localhost

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

滚动升级

  1. 停止一个节点
  2. 更新该节点的 Nacos 版本
  3. 启动该节点
  4. 验证该节点正常
  5. 重复以上步骤升级其他节点

扩容缩容

扩容

  1. 部署新节点
  2. 更新所有节点的 cluster.conf
  3. 重启所有节点

缩容

  1. 停止要下线的节点
  2. 更新其他节点的 cluster.conf
  3. 重启其他节点

常见问题

1. 集群节点无法通信

检查以下几点:

  • 防火墙是否开放端口(8848、9848、9849、7848)
  • cluster.conf 配置是否正确
  • 节点间网络是否连通

2. 数据不一致

检查以下几点:

  • 数据库连接是否正常
  • 是否有节点掉线
  • 查看日志是否有同步错误

3. 性能问题

优化建议:

  • 增加节点数量
  • 优化数据库连接池配置
  • 增加内存配置
  • 使用 SSD 磁盘

4. 频繁 Leader 切换

可能原因:

  • 网络不稳定
  • 节点负载不均
  • GC 时间过长

解决方案:

  • 优化网络配置
  • 调整 JVM 参数
  • 增加节点资源

下一步