
3台机器、40分钟、零停机Nacos生产集群搭建全纪录生产环境用单机同事说挂了算你的Nacos 挂了所有服务注册发现都停了。凌晨两点运维的电话把我叫醒。查了半天发现生产环境跑的是 standalone 模式一台机器。那台机器回收磁盘空间时把 Nacos 进程误杀了。第二天我花了 40 分钟搭了一套 3 节点集群。从那以后任何一台节点挂了另外两台自动接管客户端无感知。这篇文章就是那次搭建的完整记录——从 MySQL 主从到 cluster.conf 到 Nginx 负载均衡每一步都附配置文件和验证命令。为什么必须集群三个真实场景集群保障任意1台故障其他2台自动接管滚动重启客户端无感知MySQL 存储数据持久化不丢单机风险机器宕机服务全部不可用进程 OOM注册发现中断磁盘满Derby 数据损坏单机模式三大死穴机器宕机全挂、OOM 中断服务、Derby 数据说没就没。集群用 3 台机器 MySQL 把这三个问题全解决了。第一步环境总览拓扑规划角色IP端口说明Nacos Node 1192.168.1.1018848 / 9848 / 9849集群节点1Nacos Node 2192.168.1.1028848 / 9848 / 9849集群节点2Nacos Node 3192.168.1.1038848 / 9848 / 9849集群节点3MySQL 主库192.168.1.1003306集群共享数据源Nginx192.168.1.20080/443统一入口 负载均衡客户端 SDKNginx192.168.1.200:80Nacos Node1192.168.1.101:8848Nacos Node2192.168.1.102:8848Nacos Node3192.168.1.103:8848MySQL192.168.1.100:3306客户端连 NginxNginx 分发到任意节点。三个节点共享同一个 MySQL。节点之间通过 9849 端口做集群通信。 集群部署之前先确保单机能跑起来。还没搭过的看这篇第一次搭Nacos踩了5个坑——单机部署从零开始第二步MySQL 初始化-- 1. 创建数据库CREATEDATABASEIFNOTEXISTSnacos_configDEFAULTCHARACTERSETutf8mb4DEFAULTCOLLATEutf8mb4_general_ci;-- 2. 创建用户生产环境不要用 rootCREATEUSERnacos%IDENTIFIEDBYNacos2024!;GRANTALLPRIVILEGESONnacos_config.*TOnacos%;FLUSHPRIVILEGES;-- 3. 导入表结构2.3.2 版本-- 表文件在 nacos/conf/mysql-schema.sql 里-- 或者直接启动一次 Nacos standalone 连 MySQL会自动建表坑1MySQL 版本兼容性。Nacos 2.x 需要在 MySQL 5.7 或 8.0。MySQL 5.6 的utf8mb4和timestamp行为不同会导致建表失败。第三步配置 cluster.conf这是集群模式最核心的文件。每个节点都要配内容完全一样# nacos/conf/cluster.conf # 格式IP:端口集群通信端口不是 8848 192.168.1.101:9849 192.168.1.102:9849 192.168.1.103:9849坑2别写 8848。cluster.conf里写的是集群节点间通信端口 9849不是 HTTP 端口 8848。写错了集群成员列表是空的。坑3不能写 127.0.0.1。集群节点之间需要真实 IP 通信。127.0.0.1 只能本机用其他节点连不上。第四步修改 application.properties每台机器上的conf/application.properties做以下修改三台完全一样# 1. 禁用内置 Derby切换到 MySQL spring.sql.init.platformmysql db.num1 db.url.0jdbc:mysql://192.168.1.100:3306/nacos_config?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8connectTimeout5000socketTimeout10000 db.user.0nacos db.password.0Nacos2024! # 2. 集群模式不写 standalone # 只要 cluster.conf 存在且有内容自动进入集群模式 # 3. 调大 JVM 内存生产建议 # 这个在 bin/startup.sh 里改不动 properties # -Xms2g -Xmx2g -Xmn1g三个节点这文件完全一样复制粘贴即可。第五步逐节点启动# Node 1192.168.1.101cd/opt/nacos/bin ./startup.sh# 不传 -m standalone默认集群模式# 等 Node 1 启动成功后约 30~60 秒# Node 2192.168.1.102cd/opt/nacos/bin ./startup.sh# 再等 30~60 秒最后启动 Node 3192.168.1.103cd/opt/nacos/bin ./startup.sh坑4不要同时启动三个节点。启动顺序很重要。先启动的节点会发起选举。同时启动会导致脑裂——两个节点都认为自己是 Leader。MySQLNode3 (第三个启动)Node2 (第二个启动)Node1 (先启动)MySQLNode3 (第三个启动)Node2 (第二个启动)Node1 (先启动)成为 Leader成为 Follower成为 Follower集群选举完成1 Leader 2 Followers连接数据库读取 cluster.conf发现只有自己在线自选举为 Leader连接数据库发现 Node1 已是 Leader作为 Follower 加入连接数据库发现 Node1 已是 Leader作为 Follower 加入启动顺序先启 Node1自举为 Leader再启 Node2 和 Node3发现 Leader 已存在以 Follower 身份加入。第六步验证集群状态检查每个节点是否启动成功# 看启动日志tail-f/opt/nacos/logs/start.out# 成功的标志# INFO Nacos started successfully in cluster mode.# INFO The server is ready to receive requests.检查集群成员# 查任意节点的集群信息curl-XGEThttp://192.168.1.101:8848/nacos/v1/core/cluster/nodes# 返回示例# [# {ip:192.168.1.101,port:8848,state:UP,extendInfo:{raftPort:9849}},# {ip:192.168.1.102,port:8848,state:UP,extendInfo:{raftPort:9849}},# {ip:192.168.1.103,port:8848,state:UP,extendInfo:{raftPort:9849}}# ]三个节点state都是UP集群正常。验证数据一致性# 在 Node1 上注册一个服务curl-XPOSThttp://192.168.1.101:8848/nacos/v1/ns/instance\-dserviceNametest-serviceip10.0.0.1port8080# 在 Node3 上查这个服务curlhttp://192.168.1.103:8848/nacos/v1/ns/instance/list?serviceNametest-serviceNode3 返回了 Node1 注册的服务说明集群数据同步正常。第七步Nginx 负载均衡客户端不应该直连某一个 Nacos 节点——那个节点挂了所有客户端都得切地址。用 Nginx 做统一入口# /etc/nginx/conf.d/nacos-cluster.conf upstream nacos_cluster { # 最少连接数策略 least_conn; server 192.168.1.101:8848 weight1 max_fails3 fail_timeout30s; server 192.168.1.102:8848 weight1 max_fails3 fail_timeout30s; server 192.168.1.103:8848 weight1 max_fails3 fail_timeout30s; # 长连接优化 keepalive 32; keepalive_timeout 60s; } server { listen 80; server_name nacos.your-domain.com; # 控制台 location /nacos { 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; } # API 请求 location /nacos/v1 { proxy_pass http://nacos_cluster; proxy_set_header Host $host; proxy_http_version 1.1; proxy_set_header Connection ; } }客户端改一下配置spring:cloud:nacos:discovery:server-addr:nacos.your-domain.com:80# 不再是写死 192.168.1.101:8848 了第八步故障演练——确认高可用真的有效# 关闭 Node2ssh192.168.1.102/opt/nacos/bin/shutdown.sh# 立即查 Node1 的集群状态curlhttp://192.168.1.101:8848/nacos/v1/core/cluster/nodes# 返回Node2 状态变成 DOWNNode1 和 Node3 还是 UP# 客户端仍在正常注册发现服务# Node2 上的流量自动切到 Node1 和 Node3集群模式下任意一个节点挂掉服务不中断。只有三个节点全挂才会不可用。Docker Compose 一键部署测试环境用# docker-compose.ymlversion:3.8services:mysql:image:mysql:8.0container_name:nacos-mysqlenvironment:MYSQL_ROOT_PASSWORD:root123MYSQL_DATABASE:nacos_configMYSQL_USER:nacosMYSQL_PASSWORD:Nacos2024!ports:-3306:3306volumes:-./mysql-init.sql:/docker-entrypoint-initdb.d/init.sqlcommand:--character-set-serverutf8mb4--collation-serverutf8mb4_general_cinacos1:image:nacos/nacos-server:v2.3.2container_name:nacos-node1environment:-MODEcluster-NACOS_SERVERSnacos1:9849 nacos2:9849 nacos3:9849-SPRING_DATASOURCE_PLATFORMmysql-MYSQL_SERVICE_HOSTmysql-MYSQL_SERVICE_PORT3306-MYSQL_SERVICE_DB_NAMEnacos_config-MYSQL_SERVICE_USERnacos-MYSQL_SERVICE_PASSWORDNacos2024!ports:-8848:8848-9848:9848-9849:9849depends_on:-mysqlnacos2:image:nacos/nacos-server:v2.3.2container_name:nacos-node2environment:-MODEcluster-NACOS_SERVERSnacos1:9849 nacos2:9849 nacos3:9849-SPRING_DATASOURCE_PLATFORMmysql-MYSQL_SERVICE_HOSTmysql-MYSQL_SERVICE_PORT3306-MYSQL_SERVICE_DB_NAMEnacos_config-MYSQL_SERVICE_USERnacos-MYSQL_SERVICE_PASSWORDNacos2024!ports:-8849:8848-9849:9848-9859:9849# 端口映射避免冲突depends_on:-nacos1nacos3:image:nacos/nacos-server:v2.3.2container_name:nacos-node3environment:-MODEcluster-NACOS_SERVERSnacos1:9849 nacos2:9849 nacos3:9849-SPRING_DATASOURCE_PLATFORMmysql-MYSQL_SERVICE_HOSTmysql-MYSQL_SERVICE_PORT3306-MYSQL_SERVICE_DB_NAMEnacos_config-MYSQL_SERVICE_USERnacos-MYSQL_SERVICE_PASSWORDNacos2024!ports:-8850:8848-9850:9848-9860:9849depends_on:-nacos2# 一键启动docker-composeup-d# 等所有容器就绪后检查docker-composeps# 所有 nacos-node* 状态应该是 healthy常见集群问题速查现象原因解决每个节点只能看到自己cluster.conf 里写了 127.0.0.1改成真实 IP访问任意节点都卡死MySQL 连不上或表没建检查 MySQL 地址和nacos_config数据库启动后反复选举三个节点同时启动导致脑裂关闭所有节点间隔 30 秒逐个启动9849 Address already in use上一轮进程没杀掉kill -9残留进程注册的服务一部分节点看不到集群节点间网络不通三个节点互相 telnet 9849 端口总结三节点集群搭建的核心MySQL 共享存储三个节点连同一个 MySQL数据天然一致。cluster.conf写三个节点的真实 IP 9849 端口不能写 127.0.0.1。逐个启动间隔 30 秒避免同时启动导致脑裂。Nginx 统一入口客户端连 Nginx不直连任何一台节点。故障验证关一个节点确认另两个正常、客户端无感知。从单机到集群本质上加了三个东西MySQL 共享存储 cluster.conf 节点列表 Nginx 负载均衡。其他配置跟单机一模一样。你们生产环境 Nacos 怎么搭的评论区留个数字1单机跑着没出事心大 23节点集群MySQL 3k8s部署 4还没上生产。顺便说说你遇到过最离谱的 Nacos 故障是什么。