Nacos集群搭建

简介

本文如何搭建 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

登录后,可见部署模式为 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)节点无法加入集群

现象:节点列表中只能看到自己,看不到其他节点

排查步骤

  1. 检查防火墙是否开放 8848、9848、9849 端口
  2. 检查 NACOS_SERVERS 配置是否正确
  3. 检查 NACOS_SERVER_IP 是否为本机 IP
  4. 查看容器日志:docker logs nacos

(2)启动报错 "Connection is closed"

原因:MySQL 连接配置错误

解决方案

  • 检查 MySQL 服务是否正常
  • 验证数据库账号密码是否正确
  • 确认数据库端口 3307 可访问

(3)配置不同步

现象:在一个节点创建的配置,其他节点看不到

解决方案

  1. 检查三个节点的数据库配置是否指向同一 MySQL
  2. 重启异常节点:docker-compose restart nacos
  3. 查看日志确认是否有数据库连接错误

(4)内存占用过高

现象:Nacos 容器内存持续增长

解决方案

  1. 调整 JVM 参数:减小 JVM_XMX
  2. 检查是否有大量服务频繁上下线
  3. 清理过期的服务实例记录

相关推荐
志凌海纳SmartX2 天前
浅析 kernel bypass 网卡及其在超融合架构的性能表现
架构·网卡·高可用·低延迟·smartx·榫卯超融合
devilnumber3 天前
Nacos 超精简精华版
nacos
Thanks_ks4 天前
分布式锁:Redis 与 Redisson 的工程实践与避坑指南
java·redis·分布式锁·redisson·微服务架构·并发编程·高可用
庞轩px4 天前
第八篇:Spring与微服务——从SpringBoot到SpringCloud的演进
spring boot·spring·微服务·nacos·gateway·sentinel
Irissgwe5 天前
redis之集群(Cluster)
数据库·redis·缓存·集群·redis集群·数据分片算法
@王先生15 天前
【K8S-ETCD初始化三节点集群】
前端·chrome·k8s·etcd·集群
苏渡苇6 天前
万字长文 | Spring Cloud Alibaba组件之Nacos实战及Nacos客户端服务注册源码解析
spring cloud·微服务·nacos·注册中心·配置中心·sca
阿里-于怀7 天前
Nacos Skill Registry: 面向个人场景的Skill中心实践
阿里云·云原生·nacos·agent·skills
suweijie76810 天前
Nacos配置读取异常排查与解决指南
微服务·nacos·springboot·配置中心·问题排查