跳到主要内容

集群部署

生产环境需要部署 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:

# 下载(使用 3.2.0 版本)
wget https://github.com/alibaba/nacos/releases/download/3.2.0/nacos-server-3.2.0.tar.gz

# 解压
tar -xzf nacos-server-3.2.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:v3.1.1
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:v3.2.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:v3.2.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:v3.1.1
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 参数
  • 增加节点资源

下一步​