Nacos集群搭建实战:从原理到高可用部署与验证
2026/7/30 11:36:02 网站建设 项目流程

1. 从单机到集群:为什么你的Nacos需要“抱团取暖”?

如果你正在看这篇文章,大概率是遇到了这样的场景:项目里的配置项越来越多,服务注册列表越来越长,某个深夜,你负责维护的那台单机Nacos突然宕机,然后整个开发群就炸了锅。这不是危言耸听,而是很多团队从单体架构转向微服务初期必经的“阵痛”。Nacos作为服务发现和配置管理的核心,一旦单点故障,影响的不是某一个功能,而是整个系统的可用性。所以,搭建Nacos集群,不是为了追求技术时髦,而是微服务架构下保障系统高可用、高可靠的“生存刚需”。

简单来说,Nacos集群就是把多个Nacos服务实例组织在一起,让它们协同工作。其核心价值在于两点:一是数据一致性,无论请求打到哪个实例,你看到的服务列表和配置信息都是一样的;二是高可用性,任何一个实例挂掉,其他实例能立刻接管流量,服务不中断。这背后依赖的是一个分布式的数据存储和同步机制。很多人刚开始接触时,会被“集群”、“持久化”、“选举”这些词吓到,觉得操作复杂。其实,只要你理清几个核心概念和步骤,整个过程就像搭积木一样清晰。接下来,我会以一个最常见的三节点集群为例,手把手带你走通从环境准备、安装配置到最终验证的完整流程,并分享几个我趟过坑才总结出来的关键细节。

2. 集群搭建前的核心准备:兵马未动,粮草先行

在开始敲命令之前,充分的准备工作能避免你半路卡壳,甚至从头再来。这里我把它拆解为三个部分:基础设施、软件版本和架构规划。

2.1 基础设施与网络环境

首先,你需要准备至少三台服务器(虚拟机或物理机均可)。为什么是三台?这是分布式系统里一个经典的最小可用集群数,基于“多数派”原则,三台机器可以容忍其中一台故障,集群依然能正常选举和决策。如果只有两台,其中一台宕机,剩下的那台无法判断是自己网络断了还是对方挂了,容易产生“脑裂”问题。

服务器基础要求

  • 操作系统:主流Linux发行版,如CentOS 7+、Ubuntu 18.04+。本文以CentOS 7为例。
  • 资源配置:建议每台至少2核CPU、4GB内存。Nacos本身不算重,但需要为Java进程和未来的数据增长留出余量。
  • 网络:确保三台服务器之间网络互通,并且需要开放一系列端口。除了Nacos客户端访问的默认8848端口,集群节点间通信还需要其他端口。我建议在防火墙中一次性放行以下端口:
端口协议用途说明必须性
8848TCPNacos服务端对客户端提供服务的端口。必须
7848TCPNacos 2.0及以上版本新增的gRPC通信端口,用于集群间数据同步和分布式协调。必须(针对2.x)
9848TCPNacos 2.0及以上版本新增的,用于客户端gRPC请求的端口。必须(针对2.x)
9849TCPNacos 2.0及以上版本新增的,用于集群节点间gRPC通信的端口。必须(针对2.x)
9555TCPPrometheus等监控系统拉取Nacos metrics的端口。可选

注意:很多人在部署Nacos 2.x集群后,客户端连接不稳定,经常出现“Connection refused”或“no server available”,问题往往就出在只开了8848,而忽略了后面几个gRPC端口。这是从1.x升级到2.x的一个大坑。

2.2 软件版本选型与依赖安装

版本兼容性是另一个大坑。你需要关注Nacos版本、JDK版本以及你选择的持久化数据库(如MySQL)版本之间的匹配关系。

  1. Nacos版本选择:目前主流是2.x版本。强烈建议选择2.2.x或3.x的稳定版,例如2.2.33.2.3。1.x版本已停止重大更新,且2.x在性能和架构上有显著提升。从相关热词“nacos从2.4.1升级到3.2.3操作”也能看出,社区正在向3.x迁移。对于生产环境,我建议从2.2.3开始。
  2. JDK版本:Nacos 2.x/3.x需要JDK 1.8或更高版本。特别注意:有热词提到“nacos 2.5.2 jdk17 兼容”,这说明高版本JDK可能存在兼容性问题。经过实测,对于Nacos 2.2.x,使用JDK 8或JDK 11是最稳妥的选择。安装后务必检查环境变量。
    # 检查Java版本 java -version
  3. 持久化数据库(以MySQL为例):单机模式下Nacos默认使用内嵌的Derby数据库,但这在集群下不行,所有节点必须共享同一个外部数据库。你需要准备一个MySQL 5.7+的实例(可以部署在集群外的一台独立服务器上,确保三台Nacos节点都能访问)。先决操作:在MySQL中创建数据库(如nacos_config),并执行Nacos发行包conf目录下的mysql-schema.sql脚本初始化表结构。这是集群数据一致性的基础。

2.3 集群架构与IP规划

假设我们有三台服务器,IP分别为192.168.1.101192.168.1.102192.168.1.103。我们将在这三台机器上分别部署一个Nacos服务实例,构成一个集群。同时,我们假设MySQL数据库安装在192.168.1.100上。在规划时,最好在本地hosts文件或内部DNS中为它们设置好主机名映射,例如nacos-node1nacos-node2nacos-node3,这样配置时更清晰,也便于后期维护。

3. 分步实操:三节点Nacos集群搭建全记录

现在,我们进入具体的安装和配置环节。请在三台服务器上依次执行以下步骤。

3.1 步骤一:基础安装与单机模式验证

首先,我们需要在每台服务器上完成Nacos的单机安装,并确保它能独立运行。这是检验基础环境是否正确的关键一步。

  1. 下载与解压

    # 以2.2.3版本为例,进入一个工作目录,如 /opt cd /opt # 下载Nacos发行包(请从官网或GitHub Release获取最新稳定版链接) 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 # 重命名目录(可选,方便管理) mv nacos-server-2.2.3 nacos cd nacos
  2. 配置MySQL数据源(关键步骤): 默认配置使用内嵌Derby。我们需要修改conf/application.properties文件,启用MySQL。

    vim conf/application.properties

    找到数据库配置部分,取消注释并修改为你的MySQL信息:

    # 启用MySQL spring.datasource.platform=mysql # 数据库实例数量,通常为1 db.num=1 # 第一个数据库的连接信息 db.url.0=jdbc:mysql://192.168.1.100:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=你的数据库用户名 db.password.0=你的数据库密码

    注意serverTimezone=UTC这个参数非常重要,可以避免因时区问题导致的连接错误或时间数据异常。这也是一个常见坑点。

  3. 启动单机模式进行验证

    # 进入bin目录 cd bin # 以单机模式启动(standalone代表单机) sh startup.sh -m standalone

    查看日志,确认启动成功:

    tail -f ../logs/start.out

    当你看到“Nacos started successfully in stand alone mode”之类的日志时,说明单机模式启动成功。此时,你可以用浏览器访问http://<你的服务器IP>:8848/nacos,默认账号密码是nacos/nacos。如果能成功登录控制台,说明基础安装和数据库连接无误。请务必在三台机器上都完成此步骤的验证。验证成功后,关闭当前Nacos服务:sh shutdown.sh

3.2 步骤二:配置集群节点信息

单机模式验证通过后,我们来配置集群。核心文件是conf/cluster.conf。这个文件用于让每个Nacos实例知道集群中有哪些伙伴。

  1. 创建集群配置文件: Nacos解压后,conf目录下会有一个cluster.conf.example文件,我们需要复制它并命名为cluster.conf

    cd /opt/nacos/conf cp cluster.conf.example cluster.conf vim cluster.conf
  2. 编辑cluster.conf: 在文件中,每一行写一个集群节点的IP和端口。这里有一个至关重要的细节:必须使用IP地址,不能使用localhost或127.0.0.1,并且端口必须是8848。因为集群通信需要跨机器,使用localhost会导致节点间无法发现彼此。

    # 在三台服务器的 cluster.conf 中,都写入以下三行内容 192.168.1.101:8848 192.168.1.102:8848 192.168.1.103:8848

    保存并退出。这个操作在三台服务器上完全一致

3.3 步骤三:配置网络与启动参数(避坑关键)

这是将单机实例串联成集群的临门一脚,也是最容易出错的地方。我们需要确保每个实例在启动时,能正确标识自己并被其他实例访问。

  1. 修改启动脚本(可选但推荐): 默认情况下,Nacos启动脚本会获取本机的IP地址。但在某些复杂的网络环境(如多网卡、Docker容器内)下,它可能获取到错误的IP(如内网网卡IP)。为了绝对可靠,我们可以显式地指定每个节点的IP。编辑bin/startup.sh脚本,找到设置JAVA_OPT的地方,添加-Dnacos.server.ip参数。

    vim bin/startup.sh

    JAVA_OPT变量赋值的地方(大概在文件中部),添加如下行(以第一台机器192.168.1.101为例):

    # 找到类似这行 JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=false" # 在其后添加(注意,三台机器的IP值不同) JAVA_OPT="${JAVA_OPT} -Dnacos.server.ip=192.168.1.101"

    这样,节点101启动时就会明确告知集群:“我的地址是192.168.1.101”。对102和103号机器做同样操作,分别指定其对应的IP。

  2. 处理多网卡问题(如果遇到): 如果你没修改脚本,且日志中一直提示节点在尝试用172.xx192.168.xx等非预期IP注册,那就是获取到了错误网卡的IP。除了上述修改脚本的方法,还可以通过系统环境变量NACOS_SERVER_IP来指定。在启动前执行:export NACOS_SERVER_IP=192.168.1.101

3.4 步骤四:启动集群并验证

完成所有配置后,就可以启动集群了。

  1. 依次启动所有节点: 在三台服务器上,分别执行启动命令。注意,这次不要加-m standalone参数,不加参数默认就是集群模式。

    cd /opt/nacos/bin sh startup.sh
  2. 查看日志与监控状态: 分别查看各节点的logs/start.outlogs/nacos.log。关注几个关键日志:

    • “Nacos started successfully in cluster mode”:表示以集群模式启动成功。
    • “The leader node is ...”:表示集群内部正在进行领导者选举。
    • “ServerListManager”相关的日志,显示它从cluster.conf中成功获取到了其他节点的地址。 同时,你可以通过Nacos控制台查看集群状态。登录任意一个节点的控制台(如http://192.168.1.101:8848/nacos),进入“集群管理” -> “节点列表”。你应该能看到三行记录,它们的“节点状态”应该是“UP”,“角色”可能是“LEADER”或“FOLLOWER”。这表明集群已经成功组建并正常运行。

4. 集群部署后的关键验证与运维要点

集群启动成功,只是万里长征第一步。接下来,我们需要验证集群的数据一致性和高可用能力,并了解日常运维的注意事项。

4.1 数据一致性验证:读写测试

这是检验集群是否真正工作的核心。我们通过一个简单的配置发布和读取测试来完成。

  1. 在节点A发布配置:登录192.168.1.101的控制台,在“配置管理”中新建一个配置。例如,Data ID:test-cluster.properties, Group:DEFAULT_GROUP, 内容:server.name=TestFromNode101
  2. 在节点B和C读取配置:不退出节点A的页面,新开浏览器标签页,分别登录192.168.1.102192.168.1.103的控制台。在配置列表里,你应该能立刻看到刚刚创建的test-cluster.properties配置,并且内容完全一致。
  3. 在节点C修改配置:在节点103的控制台上,修改上述配置的内容为server.name=ModifiedFromNode103并发布。
  4. 在节点A和B检查更新:刷新节点101102的配置列表页面,确认配置内容都已同步更新为ModifiedFromNode103

如果以上步骤全部成功,恭喜你,你的Nacos集群数据同步功能完全正常。这背后是Nacos基于Raft协议实现的分布式数据一致性在起作用。

4.2 高可用验证:故障模拟

光有数据同步还不够,我们需要看看当一个节点挂掉时,集群是否依然坚挺。

  1. 观察正常状态:在“节点列表”页面,记下当前哪个节点是“LEADER”(领导者)。
  2. 模拟故障:手动停止当前Leader节点的Nacos进程(进入其bin目录,执行sh shutdown.sh)。
  3. 观察集群反应
    • 等待30-60秒,刷新另外两个存活节点的“节点列表”页面。你会看到故障节点的状态变为“DOWN”。
    • 同时,集群会重新选举,在剩下的两个节点中产生一个新的“LEADER”。整个选举过程对客户端应该是无感的。
  4. 验证服务连续性
    • 在故障期间,尝试通过客户端(或浏览器访问存活节点的控制台)进行配置查询和服务发现。操作应该依然能够成功,只是可能会感觉到一次短暂的重连(如果客户端刚好连到故障节点)。
    • 重新启动刚才关闭的节点,观察它是否能自动重新加入集群,并同步最新的数据,角色变为“FOLLOWER”。

通过这个测试,你就亲身体验了集群高可用的价值:单点故障不影响整体服务。

4.3 日常运维与监控建议

集群跑起来后,日常维护也不能松懈。

  1. 日志管理:Nacos的日志在logs/目录下,nacos.log是主日志,start.out是启动日志。建议配置日志轮转,避免磁盘被撑满。可以关注access_log来审计客户端访问。
  2. 监控集成:Nacos暴露了Metrics数据(端口9555),可以很方便地集成到Prometheus + Grafana中,监控节点状态、连接数、配置/服务数量、JVM内存等关键指标。这是保障线上稳定的重要手段。
  3. 备份与升级
    • 备份:定期备份MySQL中的nacos_config数据库。这是你所有配置和服务数据的最终存储地。
    • 升级:升级Nacos版本时,务必先仔细阅读官方Release Notes,特别是涉及数据结构和API变动的部分。升级流程应是:备份数据库 -> 逐个节点下线升级 -> 验证 -> 全部升级完成。严禁同时停止所有节点。热词中“nacos从2.4.1升级到3.2.3操作”就是一个需要谨慎对待的过程。
  4. 客户端配置:应用客户端连接集群时,不应只配置一个IP。在bootstrap.ymlapplication.properties中,应配置所有集群节点的地址,用逗号分隔。
    spring: cloud: nacos: discovery: server-addr: 192.168.1.101:8848,192.168.1.102:8848,192.168.1.103:8848 config: server-addr: ${spring.cloud.nacos.discovery.server-addr}
    这样,客户端SDK会内置负载均衡和故障转移机制,当一个节点不可用时,会自动尝试连接列表中的下一个。

5. 常见问题排查与深度优化指南

即使按照指南操作,你也可能会遇到一些问题。这里我总结几个最常见的“坑”及其解决方案。

5.1 节点无法组成集群,日志显示“Connection refused”

现象:节点日志中不断报错,提示无法连接到cluster.conf中其他节点的78489849端口。

排查思路

  1. 检查防火墙:这是最常见的原因。请务必确认三台服务器之间,上文提到的所有必要端口(8848,7848,9848,9849)都已双向放行。可以使用telnet <其他节点IP> <端口号>命令进行测试。
  2. 检查IP地址:确认cluster.conf中写的是其他节点的真实内网IP,且不是127.0.0.1。同时检查startup.sh中指定的-Dnacos.server.ip或环境变量NACOS_SERVER_IP是否正确。
  3. 检查网络策略:如果你使用的是云服务器(如阿里云ECS、腾讯云CVM),除了系统防火墙,还需要检查云平台的安全组规则,确保相关端口对集群内网开放。

5.2 客户端连接不稳定,时而报“no server available”

现象:服务应用启动时,偶尔会报错无法连接Nacos,但刷新或重启后又可能好。

排查思路

  1. 客户端配置:确保客户端配置的server-addr包含了所有集群节点地址,而不仅仅是一个。单个地址在对应节点宕机时必然失败。
  2. gRPC端口问题:这是Nacos 2.x的特有问题。确认Nacos服务器98489849端口已开放,并且客户端所在网络能访问这些端口。有些公司的网络策略会限制非标准高端口。
  3. 客户端版本与服务端版本兼容性:确保你使用的Spring Cloud Alibaba、Nacos Client SDK的版本与Nacos Server版本兼容。建议查阅官方文档的版本配套说明表。

5.3 启动失败:“failed to start database ‘/home/nacos/data/derby-data’”

现象:启动日志报错,提示Derby数据库启动失败。

原因与解决:这个错误明确指向了数据源问题。它说明Nacos试图启动内嵌的Derby数据库,但你的application.properties中配置的MySQL连接可能未生效,或者Nacos没有正确读取到MySQL配置。

  1. 检查conf/application.properties文件中的MySQL配置是否已正确取消注释并修改。
  2. 检查MySQL服务是否正常运行,Nacos服务器是否能通过网络连接到MySQL的3306端口。
  3. 检查nacos_config数据库是否已创建,且mysql-schema.sql脚本是否已成功执行。
  4. 彻底清理:如果之前以单机模式运行过,data目录下会生成Derby数据库文件。在切换到MySQL后,可以尝试清空data目录(注意:先备份!)和logs目录,再重新启动。

5.4 性能与稳定性优化建议

当你的微服务数量和配置项爆炸式增长后,可能需要考虑以下优化点:

  1. MySQL优化:Nacos的读写压力最终都落在MySQL上。建议对config_info等核心表建立合适的索引。根据数据量,考虑分库分表(社区企业版支持,开源版需要自行改造或评估容量)。
  2. JVM参数调整:编辑bin/startup.sh中的JAVA_OPT,根据服务器内存调整堆大小。例如,对于4G内存的机器,可以设置:JAVA_OPT="${JAVA_OPT} -Xms2g -Xmx2g -Xmn1g"
  3. 集群节点数:对于超大规模场景,3节点可能成为写入瓶颈(Raft协议要求多数节点确认)。可以考虑部署5节点集群,以提升写入吞吐量和容忍更多节点故障。当然,管理成本也会增加。
  4. 分离部署:在资源允许的情况下,可以将Nacos的配置中心(config)和服务发现(naming)模块部署到不同的集群,实现物理隔离,避免相互影响。这需要更复杂的部署架构。

搭建Nacos集群,从表面看是一系列配置文件的修改和命令的执行,但其内核是对分布式系统“共享数据”和“高可用”理念的一次实践。理解每一步操作背后的目的——比如为什么必须用MySQL替代Derby,为什么cluster.conf里不能写localhost,为什么2.x版本要开那么多端口——远比机械地复制命令更重要。这份指南希望能帮你绕过我当年踩过的那些坑,顺利搭建起一个健壮的Nacos集群,为你的微服务体系提供一个可靠的基础设施。记住,搭建完成只是开始,持续的监控、备份和版本升级规划,才是保障其长期稳定运行的护城河。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询