Linux 上自建 Nacos 集群:从环境准备到高可用验证的完整指南
1. 为什么要在 Linux 上自建 Nacos 集群1.1 从单机到集群一个绕不开的坎很多团队一开始用 Nacos 都是单机模式图省事下载解压启动就完事。开发环境跑得好好的一到预发或者生产环境问题就来了服务注册列表偶尔丢数据、配置推送延迟、某个节点挂了整个注册中心不可用。这些问题的根源其实很简单——单机 Nacos 默认用的是内嵌的 Derby 数据库数据不共享也没有任何高可用保障。Nacos 集群的核心价值在于两点数据一致性和服务高可用。集群模式下多个 Nacos 节点通过 Raft 协议1.x 版本或者 JRaft2.x 版本来保证数据一致性同时对外提供一个统一的虚拟 IP 或者负载均衡入口。任何一个节点宕机其他节点依然能正常提供注册和配置服务。这对于微服务架构来说基本是刚需。我见过不少团队在项目初期忽略这件事等到线上出故障了才临时抱佛脚。说实话Nacos 集群的搭建并不复杂但细节特别多一步错可能就要排查半天。这篇文章我会把整个流程拆开从环境准备到集群验证每一步都讲清楚为什么这么做以及我踩过的那些坑。1.2 集群方案选型三种常见模式对比在动手之前先明确你要用哪种集群模式。Nacos 集群的搭建方式主要有三种各有适用场景模式数据存储适用场景优点缺点单机模式内嵌 Derby开发测试零配置开箱即用无高可用数据不共享集群模式MySQL外部 MySQL生产环境高可用数据持久化需要维护 MySQL集群模式内嵌内嵌 Derby不推荐无数据不一致官方不推荐生产环境基本只有一种选择多节点 外部 MySQL。MySQL 负责持久化配置数据和注册信息Nacos 节点之间通过 Raft 协议同步内存状态。这样即使所有 Nacos 节点重启数据也不会丢。这里有个常见的误解有人觉得 Nacos 集群必须用奇数个节点。其实这个说法来源于 Raft 协议的选举机制——奇数节点能避免脑裂时的平票问题。3 个节点是性价比最高的选择既能容忍 1 个节点故障资源消耗也不大。如果预算充足5 个节点可以容忍 2 个节点故障但一般中小规模团队 3 个足够了。1.3 环境规划动手前必须想清楚的事在开始安装之前先把环境规划好。我建议至少准备 3 台 Linux 服务器可以是虚拟机配置建议 2C4G 起步磁盘 40G 以上。操作系统用 CentOS 7.9 或者 Ubuntu 20.04 都可以我下面以 CentOS 7.9 为例来演示。假设我们有三台机器IP 规划如下节点 A192.168.1.101节点 B192.168.1.102节点 C192.168.1.103MySQL 可以单独部署一台也可以复用其中一台 Nacos 节点。为了简单我这里把 MySQL 装在节点 A 上生产环境建议独立部署。软件版本选择上Nacos 我推荐用 2.2.x 或者 2.3.x 的稳定版JDK 必须用 1.8 以上Nacos 2.x 推荐 JDK 8 或 11MySQL 用 5.7 或 8.0 都行。版本不一致有时候会出一些莫名其妙的问题所以三台机器的 JDK 版本和 Nacos 版本必须完全一致。注意Nacos 2.x 新增了 gRPC 通信端口除了 8848 之外还需要开放 9848 和 9849 端口。很多人升级到 2.x 后集群起不来就是因为防火墙没放行这两个端口。2. 基础环境准备与依赖安装2.1 JDK 安装与版本确认Nacos 是 Java 写的JDK 是第一个要搞定的依赖。CentOS 7.9 自带的 OpenJDK 版本可能比较老建议手动安装 Oracle JDK 或者 OpenJDK 11。先检查系统是否已有 JDKjava -version如果显示 1.8 以下或者根本没有就需要安装。我习惯用 yum 安装 OpenJDK 11yum install -y java-11-openjdk java-11-openjdk-devel安装完成后再次确认java -version输出应该类似openjdk version 11.0.20 2023-08-24 LTS OpenJDK Runtime Environment (Red_Hat-11.0.20.0.8-1.el7_9) (build 11.0.208-LTS) OpenJDK 64-Bit Server VM (Red_Hat-11.0.20.0.8-1.el7_9) (build 11.0.208-LTS, mixed mode, sharing)三台机器都要做这一步确保版本一致。如果版本不一致集群启动时可能会报序列化相关的错误排查起来很头疼。实操心得如果你用 JDK 11Nacos 启动时可能会提示一些模块访问警告这是正常的不影响使用。如果追求极致干净可以在启动脚本里加上--add-opens参数但一般没必要。2.2 MySQL 安装与初始化MySQL 我选择用 5.7 版本稳定且兼容性好。在节点 A 上安装# 添加 MySQL Yum 源 rpm -Uvh https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm # 安装 MySQL 服务端 yum install -y mysql-community-server # 启动并设置开机自启 systemctl start mysqld systemctl enable mysqldMySQL 5.7 首次启动会生成一个临时密码查看grep temporary password /var/log/mysqld.log用临时密码登录后先修改密码再创建 Nacos 专用数据库和用户ALTER USER rootlocalhost IDENTIFIED BY YourStrongPassword123!; CREATE DATABASE nacos_config DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER nacos% IDENTIFIED BY NacosPass123!; GRANT ALL PRIVILEGES ON nacos_config.* TO nacos%; FLUSH PRIVILEGES;数据库字符集一定要用utf8mb4否则配置内容里有特殊字符时会乱码。这个坑我踩过当时一个配置项里有个 emoji 表情结果存进去变成问号排查了半天才发现是字符集问题。2.3 Nacos 数据库表结构初始化Nacos 的 MySQL 表结构在安装包的conf目录下有一个mysql-schema.sql文件。下载 Nacos 安装包后找到这个文件并导入# 下载 Nacos以 2.2.3 版本为例 wget https://github.com/alibaba/nacos/releases/download/2.2.3/nacos-server-2.2.3.tar.gz # 解压 tar -zxvf nacos-server-2.2.3.tar.gz # 导入表结构 mysql -u nacos -p nacos_config nacos/conf/mysql-schema.sql导入完成后可以检查一下表是否创建成功USE nacos_config; SHOW TABLES;应该能看到config_info、config_info_beta、his_config_info、users、roles等表。如果表数量不对说明导入过程中出错了需要重新导入。注意不同版本的 Nacos 表结构可能有细微差异一定要用对应版本安装包里的 SQL 文件不要从网上随便找一个 SQL 就用。3. Nacos 集群配置与启动3.1 核心配置文件详解Nacos 的配置文件在conf目录下集群模式需要修改两个文件application.properties和cluster.conf。先看application.properties这是最核心的配置。用编辑器打开vim nacos/conf/application.properties找到数据库相关配置修改为# 数据库类型 spring.datasource.platformmysql # 数据库实例数量 db.num1 # 数据库连接地址 db.url.0jdbc:mysql://192.168.1.101:3306/nacos_config?characterEncodingutf8connectTimeout1000socketTimeout3000autoReconnecttrueuseUnicodetrueuseSSLfalseserverTimezoneAsia/Shanghai # 数据库用户名 db.user.0nacos # 数据库密码 db.password.0NacosPass123!这里有几个参数值得说明。connectTimeout和socketTimeout是连接超时和读取超时默认值比较短网络波动时容易报错我一般设成 1000ms 和 3000ms。autoReconnecttrue让连接断开后自动重连生产环境建议开启。serverTimezone必须设置否则 MySQL 8.0 会报时区错误。另外Nacos 2.x 还需要配置集群通信相关的参数。在application.properties末尾添加# 集群节点列表可选cluster.conf 优先级更高 # nacos.core.protocol.raft.data.path/data/nacos/raft # 开启鉴权生产环境建议开启 nacos.core.auth.enabledtrue nacos.core.auth.server.identity.keyyourIdentityKey nacos.core.auth.server.identity.valueyourIdentityValue nacos.core.auth.plugin.nacos.token.secret.keyyourSecretKeyMustBeBase64EncodedAndAtLeast32Bytes鉴权相关的配置在 2.2.x 版本之后变得更重要了默认的 token 密钥必须修改否则会有安全风险。token.secret.key需要是 Base64 编码的字符串且解码后至少 32 字节。3.2 cluster.conf 配置与节点规划cluster.conf文件定义了集群中有哪些节点。在 Nacos 2.x 中这个文件默认不存在需要手动创建vim nacos/conf/cluster.conf内容如下192.168.1.101:8848 192.168.1.102:8848 192.168.1.103:8848每行一个节点格式是IP:端口。三台机器的这个文件内容必须完全一致。我见过有人每台机器只写自己的 IP结果集群起不来因为节点之间无法发现彼此。实操心得cluster.conf里不要写127.0.0.1或者localhost必须写实际的局域网 IP。另外如果服务器有多张网卡要确认写的是正确的那个 IP。3.3 启动脚本与 JVM 参数调优Nacos 的启动脚本在bin目录下startup.sh用于启动shutdown.sh用于停止。启动集群模式需要加-m cluster参数bash bin/startup.sh -m cluster默认的 JVM 参数可能不适合你的服务器配置可以在startup.sh中调整。找到类似下面的行JAVA_OPT${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m根据服务器内存调整比如 4G 内存的机器可以设为JAVA_OPT${JAVA_OPT} -Xms2g -Xmx2g -Xmn1g堆内存不要超过物理内存的一半留足够的内存给操作系统和堆外内存。Nacos 2.x 因为用了 gRPC堆外内存消耗比 1.x 大一些建议至少留 1G 给系统。启动后查看日志确认是否成功tail -f nacos/logs/start.out看到Nacos started successfully in cluster mode就说明启动成功了。三台机器依次启动注意启动顺序没有严格要求但建议一台完全启动后再启动下一台方便排查问题。4. 集群验证与常见问题排查4.1 验证集群状态是否正常三台都启动后第一件事是验证集群状态。Nacos 提供了一个集群状态接口curl http://192.168.1.101:8848/nacos/v1/ns/operator/servers返回的 JSON 中会列出所有节点及其状态state为UP表示节点正常。如果某个节点显示DOWN说明该节点没有成功加入集群。另一个更直观的方式是登录 Nacos 控制台在“集群管理”-“节点列表”中查看。正常情况下应该看到三个节点且都是健康状态。还可以通过服务注册来验证。在任意一个节点上注册一个测试服务curl -X POST http://192.168.1.101:8848/nacos/v1/ns/instance?serviceNametest-serviceip1.1.1.1port8080然后在另一个节点上查询curl http://192.168.1.102:8848/nacos/v1/ns/instance/list?serviceNametest-service如果能查到刚才注册的实例说明集群数据同步正常。4.2 常见问题速查表集群搭建过程中遇到的问题五花八门我整理了一个速查表覆盖大部分常见情况问题现象可能原因排查方法解决方案启动报数据库连接失败数据库地址/账号密码错误检查 application.properties确认 MySQL 可远程连接账号有权限节点显示 DOWN防火墙未放行端口telnet 测试 8848/9848/9849开放端口或关闭防火墙集群无法选举 Leadercluster.conf 不一致对比三台机器文件内容统一 cluster.conf配置推送失败gRPC 端口未开放检查 9848/9849 端口防火墙放行这两个端口启动后立即退出内存不足查看 start.out 日志调小 JVM 堆内存控制台无法登录鉴权配置错误检查 token.secret.key使用正确的 Base64 密钥其中最常见的就是端口问题。Nacos 2.x 需要三个端口8848HTTP、9848gRPC 客户端、9849gRPC 服务端。很多人只开了 8848结果集群节点之间通信正常但客户端连接不上。4.3 生产环境加固建议集群跑起来只是第一步生产环境还需要做一些加固。首先是开启鉴权前面提到的nacos.core.auth.enabledtrue必须开启并且修改默认的 token 密钥。其次是配置 MySQL 主从或者高可用Nacos 集群依赖 MySQL如果 MySQL 挂了整个注册中心也就废了。另外建议配置日志轮转Nacos 的日志默认不会自动清理时间长了会占满磁盘。可以在conf/application.properties中调整日志级别或者用系统的 logrotate 来管理。最后是监控告警Nacos 暴露了 Prometheus 格式的指标接口可以接入监控系统。关键指标包括节点数量、Leader 状态、配置数量、服务数量等。一旦节点数量少于预期或者 Leader 频繁切换就需要及时排查。实操心得我一般会在集群前面加一个负载均衡比如 Nginx 或者 HAProxy客户端统一连接负载均衡地址而不是直连某个节点。这样即使某个节点故障客户端也不需要改配置。负载均衡的健康检查要指向/nacos/actuator/health接口。5. 集群运维与日常管理5.1 节点扩容与缩容操作业务增长后可能需要扩容 Nacos 集群。扩容操作其实很简单在新机器上重复前面的安装配置步骤然后修改所有节点包括新节点的cluster.conf加入新节点的 IP。然后滚动重启所有节点。注意是滚动重启不要一次性全部重启。先重启一个节点等它完全启动并加入集群后再重启下一个。这样能保证集群始终有可用节点。缩容则相反先从cluster.conf中移除要下线的节点然后滚动重启剩余节点最后停止被移除的节点。缩容时要注意如果集群从 3 节点缩到 2 节点Raft 协议的容错能力会下降建议保持奇数节点。5.2 数据备份与恢复策略Nacos 的数据主要存在 MySQL 中所以备份 MySQL 就是备份 Nacos 数据。建议每天定时用mysqldump备份nacos_config数据库mysqldump -u nacos -p nacos_config nacos_config_$(date %Y%m%d).sql恢复的时候直接导入 SQL 文件即可。需要注意的是恢复数据后可能需要重启 Nacos 节点让内存中的缓存与数据库同步。另外Nacos 的 Raft 数据也存在本地磁盘上路径由nacos.core.protocol.raft.data.path配置。这个目录一般不需要手动备份因为数据源头在 MySQLRaft 日志只是用来做一致性同步的。5.3 版本升级注意事项Nacos 版本升级不能跳太多版本建议逐个小版本升级。比如从 2.0.x 升到 2.2.x最好先升到 2.1.x再升到 2.2.x。升级前一定要备份数据库和配置文件。升级步骤停止所有节点替换安装包修改配置文件注意新版本可能有新增配置项然后依次启动。启动后验证集群状态和数据完整性。我遇到过升级后配置丢失的情况后来发现是因为新版本的表结构和旧版本不兼容需要执行额外的 SQL 迁移脚本。所以升级前一定要仔细阅读官方发布的升级说明不要想当然。6. 个人实操体会与建议Nacos 集群搭建本身技术难度不算高但细节特别多任何一个环节疏忽都可能导致集群不正常。我自己的经验是环境一致性是最重要的——三台机器的 JDK 版本、Nacos 版本、配置文件、系统时间都必须一致。系统时间不一致会导致 Raft 选举出问题这个坑很隐蔽排查起来很费劲。另外不要跳过验证步骤。很多人启动完就以为万事大吉了结果上线后发现数据不同步。一定要做完整的验证集群状态、服务注册、配置推送、节点故障切换每一项都测一遍。最后分享一个小技巧如果条件允许可以用 Docker 或者容器化方式部署 Nacos 集群这样环境一致性更容易保证扩容缩容也更方便。不过容器化部署有它自己的坑比如网络模式选择、数据卷挂载等那是另一个话题了。对于刚开始接触 Nacos 集群的团队我建议先用物理机或者虚拟机把流程跑通理解每个配置项的含义再考虑容器化。