简介
本文如何搭建 Nacos 集群
环境规划
服务器清单
| 序号 | IP地址 | 节点名称 | 说明 |
|---|---|---|---|
| 1 | 192.168.249.137 | node1 | MySQL节点 |
| 2 | 192.168.249.138 | node2 | |
| 3 | 192.168.249.139 | node3 |
服务器环境示意:

部署版本
- nacos:v2.3.2
- mysql:v8.0.18
环境准备
Docker环境
- 所有服务器需提前安装 Docker 环境
- 确认 Docker 服务正常运行:
systemctl status docker
镜像导入
在三台服务器上分别执行:
shell
# 1. 将镜像文件上传到服务器任意目录(如 /root/)
# 2. 导入镜像
docker load -i /root/nacos-server-v2.3.2.tar
# 3. 验证镜像导入成功
docker images | grep nacos-server
部署 MySQL 的服务器需要额外导入 MySQL 镜像
shell
# 1. 将镜像文件上传到服务器任意目录(如 /root/)
# 2. 导入镜像
docker load -i /root/mysql-v8.0.18.tar
# 3. 验证镜像导入成功
docker images | grep mysql
如下

相关资源可在下面这个地址下载
也可以敲下面的命令,直接 pull 对应的镜像
shell
docker pull mysql:8.0.18
docker pull nacos/nacos-server:v2.3.2
集群搭建步骤
(1)MySQL 准备
在节点 1 上找个目录,创建 MySQL 的 docker-compose.yml,内容如下,账号密码可自定义,如果自定义了账号密码,后面的步骤需要同步修改
yml
version: '3.8'
services:
mysql:
image: mysql:8.0.18
container_name: nacos-mysql
restart: always
ports:
- "3307:3306"
environment:
MYSQL_ROOT_PASSWORD: Root@123456
MYSQL_DATABASE: nacos_config
MYSQL_USER: nacos
MYSQL_PASSWORD: Nacos@123456
volumes:
- mysql-data:/var/lib/mysql
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
--lower_case_table_names=1
volumes:
mysql-data:
敲下面的命令,启动 MySQL
shell
docker-compose up -d
如下

将 Nacos 初始化脚本上传到服务器当前目录,敲下面的命令导入 Nacos 初始化脚本
shell
docker exec -i nacos-mysql mysql -unacos -pNacos@123456 nacos_config < mysql-schema.sql
如下

这个初始化脚本访问 Github 上,对应 Nacos 版本的下面这个目录中获取

(2)组件集群
获取随机码
shell
openssl rand -base64 32
如下,将该随机字符串作为 Nacos 配置 NACOS_AUTH_TOKEN 的值,设置到 docker-compose.yml 中

节点 1,创建 Nacos 的 docker-compose.yml 文件,内容如下
yml
version: '3.8'
services:
nacos:
image: nacos/nacos-server:v2.3.2
container_name: nacos
restart: always
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
environment:
MODE: cluster
# 三台集群地址
NACOS_SERVERS: 192.168.249.137:8848,192.168.249.138:8848,192.168.249.139:8848
NACOS_SERVER_IP: 192.168.249.137
# 数据库指向137
SPRING_DATASOURCE_PLATFORM: mysql
MYSQL_SERVICE_HOST: 192.168.249.137
MYSQL_SERVICE_PORT: 3307
MYSQL_SERVICE_DB_NAME: nacos_config
MYSQL_SERVICE_USER: nacos
MYSQL_SERVICE_PASSWORD: Nacos@123456
# 关键修复:加引号,转成字符串
NACOS_AUTH_ENABLE: "true"
NACOS_AUTH_TOKEN: "10xOrZhjKSLQ0PrvvM13sandGRQaB7fuC5YBxystPYU="
NACOS_AUTH_IDENTITY_KEY: serverIdentity
NACOS_AUTH_IDENTITY_VALUE: security
JVM_XMS: 512m
JVM_XMX: 512m
volumes:
- ./logs:/home/nacos/logs
启动
shell
docker-compose up -d
节点 2,创建 Nacos 的 docker-compose.yml 文件,内容如下
yml
version: '3.8'
services:
nacos:
image: nacos/nacos-server:v2.3.2
container_name: nacos
restart: always
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
environment:
MODE: cluster
# 三台集群地址
NACOS_SERVERS: 192.168.249.137:8848,192.168.249.138:8848,192.168.249.139:8848
NACOS_SERVER_IP: 192.168.249.138
# 数据库指向137
SPRING_DATASOURCE_PLATFORM: mysql
MYSQL_SERVICE_HOST: 192.168.249.137
MYSQL_SERVICE_PORT: 3307
MYSQL_SERVICE_DB_NAME: nacos_config
MYSQL_SERVICE_USER: nacos
MYSQL_SERVICE_PASSWORD: Nacos@123456
MYSQL_SERVICE_DB_PARAM: "characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true"
NACOS_AUTH_ENABLE: "true"
NACOS_AUTH_TOKEN: "10xOrZhjKSLQ0PrvvM13sandGRQaB7fuC5YBxystPYU="
NACOS_AUTH_IDENTITY_KEY: serverIdentity
NACOS_AUTH_IDENTITY_VALUE: security
JVM_XMS: 512m
JVM_XMX: 512m
volumes:
- ./logs:/home/nacos/logs
启动
shell
docker-compose up -d
节点 3,创建 Nacos 的 docker-compose.yml 文件,内容如下
yml
version: '3.8'
services:
nacos:
image: nacos/nacos-server:v2.3.2
container_name: nacos
restart: always
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
environment:
MODE: cluster
# 三台集群地址
NACOS_SERVERS: 192.168.249.137:8848,192.168.249.138:8848,192.168.249.139:8848
NACOS_SERVER_IP: 192.168.249.139
# 数据库指向137
SPRING_DATASOURCE_PLATFORM: mysql
MYSQL_SERVICE_HOST: 192.168.249.137
MYSQL_SERVICE_PORT: 3307
MYSQL_SERVICE_DB_NAME: nacos_config
MYSQL_SERVICE_USER: nacos
MYSQL_SERVICE_PASSWORD: Nacos@123456
# 关键修复:加引号,转成字符串
NACOS_AUTH_ENABLE: "true"
NACOS_AUTH_TOKEN: "10xOrZhjKSLQ0PrvvM13sandGRQaB7fuC5YBxystPYU="
NACOS_AUTH_IDENTITY_KEY: serverIdentity
NACOS_AUTH_IDENTITY_VALUE: security
JVM_XMS: 512m
JVM_XMX: 512m
volumes:
- ./logs:/home/nacos/logs
启动
shell
docker-compose up -d
可敲下面的命令查看 Nacos 容器日志
shell
docker logs -f nacos
如下,表示启动成功

集群验证
(1)访问
随便访问以下任意节点,都能连接到集群,账号密码都是 nacos/nacos
- http://192.168.249.137:8848/nacos
- http://192.168.249.138:8848/nacos
- http://192.168.249.139:8848/nacos
登录后,可见部署模式为 cluster (集群模式),并且 集群管理-节点列表 可见其他节点

(2)配置列表
在任意节点创建配置,可在其他节点访问到该配置文件,说明配置在节点间是同步的

Spring Boot 项目配置
如下,仅需 server-addr 更改为集群各个节点地址
yml
spring:
application:
name: your-service-name # 你的服务名
cloud:
nacos:
# 注册中心(服务发现)
discovery:
server-addr: 192.168.249.137:8848,192.168.249.138:8848,192.168.249.139:8848
namespace: public
username: nacos
password: nacos
# 配置中心(读取配置文件)
config:
server-addr: 192.168.249.137:8848,192.168.249.138:8848,192.168.249.139:8848
namespace: public
group: DEFAULT_GROUP
file-extension: yaml
username: nacos
password: nacos
Nginx 负载均衡配置(可选)
为了对外提供统一的访问入口,建议在集群前部署 Nginx 做反向代理和负载均衡。
(1)Nginx 配置示例
nginx
upstream nacos_cluster {
server 192.168.249.137:8848;
server 192.168.249.138:8848;
server 192.168.249.139:8848;
}
server {
listen 8848;
server_name nacos.example.com;
location / {
proxy_pass http://nacos_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
(2)Spring Boot 项目调整
使用负载均衡后,服务端只需配置 Nginx 地址即可:
yaml
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.249.100:8848
config:
server-addr: 192.168.249.100:8848
注意事项
(1)端口说明
Nacos 2.x 版本新增了 gRPC 通信端口,需要确保以下端口开放:
| 端口 | 协议 | 说明 |
|---|---|---|
| 8848 | TCP | HTTP 服务端口,主端口 |
| 9848 | TCP | 客户端 gRPC 请求端口 |
| 9849 | TCP | 服务端 gRPC 请求端口 |
重要:防火墙需要开放这三个端口,否则节点间通信会失败。
(2)集群节点数量
- Nacos 采用 Raft 协议实现共识,集群节点数必须为 奇数(1, 3, 5, 7...)
- 推荐生产环境至少 3 节点,可容忍 1 节点故障
- 5 节点集群可容忍 2 节点故障,可用性更高
(3)时间同步
集群各节点时间必须同步,否则会导致:
- 数据一致性问题
- 节点间心跳异常
- Leader 选举失败
建议配置 NTP 时间同步服务:
shell
# 安装并启用 NTP
yum install -y ntp
systemctl enable ntpd
systemctl start ntpd
(4)鉴权配置
NACOS_AUTH_TOKEN三个节点必须完全一致- 建议使用
openssl rand -base64 32生成足够强度的随机串 - 生产环境务必修改默认账号密码
nacos/nacos - 建议创建独立的命名空间和权限控制
(5)JVM 参数调优
根据服务器内存调整 JVM 参数:
yaml
environment:
JVM_XMS: 1g # 初始堆内存
JVM_XMX: 1g # 最大堆内存
JVM_XMN: 512m # 新生代大小
建议:JVM 最大堆内存不超过物理内存的 70%
(6) MySQL 高可用
本方案中 MySQL 是单点,生产环境建议:
- 搭建 MySQL 主从复制
- 或使用 MySQL Group Replication
- 或采用外部数据库服务(如云数据库 RDS)
常见问题
(1)节点无法加入集群
现象:节点列表中只能看到自己,看不到其他节点
排查步骤:
- 检查防火墙是否开放 8848、9848、9849 端口
- 检查
NACOS_SERVERS配置是否正确 - 检查
NACOS_SERVER_IP是否为本机 IP - 查看容器日志:
docker logs nacos
(2)启动报错 "Connection is closed"
原因:MySQL 连接配置错误
解决方案:
- 检查 MySQL 服务是否正常
- 验证数据库账号密码是否正确
- 确认数据库端口 3307 可访问
(3)配置不同步
现象:在一个节点创建的配置,其他节点看不到
解决方案:
- 检查三个节点的数据库配置是否指向同一 MySQL
- 重启异常节点:
docker-compose restart nacos - 查看日志确认是否有数据库连接错误
(4)内存占用过高
现象:Nacos 容器内存持续增长
解决方案:
- 调整 JVM 参数:减小
JVM_XMX值 - 检查是否有大量服务频繁上下线
- 清理过期的服务实例记录