Nacos集群搭建实战:从单机到高可用微服务架构核心部署指南

发布时间:2026/7/30 11:23:12

Nacos集群搭建实战:从单机到高可用微服务架构核心部署指南 1. 项目概述为什么我们需要Nacos集群在微服务架构里服务发现和配置管理是两块基石。想象一下你管理着一个由几十甚至上百个微服务组成的电商系统每个服务都需要知道其他服务的地址才能调用同时像数据库连接串、开关参数这类配置如果散落在每个服务里改起来就是一场灾难。NacosNaming and Configuration Service就是为解决这些问题而生的它集服务发现、配置管理、服务元数据管理于一体可以说是微服务架构的“神经中枢”。那么为什么单机版的Nacos不够用非得折腾集群呢原因很简单高可用。单点故障是生产环境的噩梦。如果你的Nacos服务器宕机了整个微服务体系就会瞬间“失明”——服务找不到彼此配置无法更新业务直接停摆。搭建Nacos集群就是为了将这个“神经中枢”从单点变成多点即使其中一台机器挂掉其他节点也能立刻顶上保证整个系统的持续稳定运行。这不仅仅是技术上的“锦上添花”而是保障业务连续性的“雪中送炭”。从你提供的热词来看大家关心的不仅仅是“怎么装”更是“怎么装得稳”。一主两从、k8s集群搭建、redis集群搭建这些词都指向了同一个核心诉求构建高可用的基础设施。本指南将聚焦于最经典、最稳定的部署模式基于内嵌Derby数据库的集群模式。这种模式部署简单适合中小型团队快速构建高可用环境。至于更复杂的、使用外部MySQL集群的模式我们会在后面提到其适用场景和切换方法。2. 环境准备与前置条件解析在动手之前把“战场”打扫干净准备好“弹药”能避免后面90%的坑。Nacos集群的搭建对运行环境有一些明确的要求不符合要求强行安装往往会遇到各种稀奇古怪的错误。2.1 系统与软件要求首先你需要准备至少三台服务器。为什么是三台这是分布式系统共识算法比如Nacos默认使用的Raft协议的基本要求以确保在有一台服务器故障时集群依然能达成多数派共识正常选举出Leader继续提供服务。两台服务器无法容忍任何一台宕机失去了高可用的意义。操作系统主流Linux发行版均可如CentOS 7、Ubuntu 18.04。生产环境强烈推荐使用Linux。Java环境这是Nacos运行的基石。你需要安装JDK 8或以上版本。这里有个关键点Nacos 2.x版本对JDK的版本有更严格的要求。从你搜索的nacos 2.5.2 jdk17 兼容可以看出社区在关注高版本JDK的适配。根据官方文档Nacos 2.0 需要 JDK 1.8但推荐使用 JDK 17 以获得更好的性能。我个人的经验是在JDK 8上运行Nacos 2.x基本没问题但如果追求极致稳定性和性能升级到JDK 17是更优选择。安装JDK后务必检查环境变量。打开终端执行java -version和javac -version确保输出正确的版本信息。一个常见的坑是服务器上安装了多个JDK但JAVA_HOME环境变量指向了错误的版本导致Nacos启动时报错。网络环境确保三台服务器之间网络互通并且需要开放一系列端口供Nacos内部通信和客户端访问。这是集群搭建成功与否的关键。2.2 网络与防火墙配置Nacos集群节点间需要通信客户端也需要能访问Nacos服务器。以下端口必须开放8848: Nacos服务端默认端口用于客户端你的微服务的HTTP API请求。9848: Nacos 2.0新增的gRPC端口用于客户端你的微服务的gRPC通信。这是Nacos 2.x与1.x的一个重要区别很多从1.x升级上来的同学会忽略这个端口导致客户端连接失败。9849: Nacos 2.0新增的gRPC端口用于服务器节点之间的Raft协议通信。这个端口仅在集群内部使用但必须开放。7848: Nacos服务器节点之间用于健康检查、选举等通信的端口。实操心得很多人在云服务器上搭建集群失败问题都出在安全组或防火墙。除了在服务器本身的防火墙如firewalld或iptables中放行这些端口如果你使用的是阿里云、腾讯云等云服务切记要去云控制台的安全组规则里同样添加这些端口的入方向允许规则。我曾经花了两个小时排查集群节点无法发现彼此的问题最后发现是云平台安全组只开了8848忘了开9848和9849。3. Nacos安装与单机模式启动在搭建集群之前我们先在单台机器上把Nacos跑起来验证基础环境是否OK。这个过程也是理解Nacos目录结构和配置项的好机会。3.1 下载与解压访问Nacos的GitHub Release页面选择稳定版本下载。对于生产环境建议选择最新的稳定版如2.2.x或2.3.x。你可以使用wget命令直接下载到服务器。# 示例下载 Nacos 2.2.3 wget https://github.com/alibaba/nacos/releases/download/2.2.3/nacos-server-2.2.3.tar.gz下载完成后解压到合适的目录比如/usr/local。tar -zxvf nacos-server-2.2.3.tar.gz -C /usr/local/ cd /usr/local/nacos解压后你会看到如下目录结构bin/: 启动和停止脚本。conf/: 配置文件目录核心都在这里。logs/: 日志文件目录出问题第一个要查的地方。data/: 数据目录单机模式下Derby数据库文件就存放在这里。target/: 存放编译后的可执行jar包。3.2 单机模式启动与验证进入bin目录你可以看到startup.shLinux/Mac和startup.cmdWindows。在Linux下以单机模式启动非常简单# 进入bin目录 cd /usr/local/nacos/bin # 以单机模式启动 sh startup.sh -m standalone启动成功后控制台会输出类似nacos is starting with standalone的日志并提示你查看日志文件。你可以通过tail -f /usr/local/nacos/logs/start.out来实时跟踪启动日志直到看到Nacos started successfully in stand alone mode.字样。此时打开浏览器访问http://你的服务器IP:8848/nacos。默认用户名和密码都是nacos。如果成功看到Nacos的控制台登录页面并登录进去说明单机版安装成功。注意事项第一次启动时可能会稍慢因为内嵌的Derby数据库需要初始化。如果长时间启动失败请务必检查logs目录下的nacos.log和start.out文件错误信息会非常清晰。常见错误包括端口被占用检查8848、9848等端口、JDK版本不兼容、或者JAVA_HOME环境变量未正确设置。4. 集群模式详细配置与搭建单机模式跑通后我们就可以开始集群的配置了。这是本指南的核心部分。我们将基于内嵌Derby模式进行配置这是最简单直接的集群化方式每个节点都有自己的数据存储通过Raft协议保证数据一致性。4.1 集群配置文件解读与修改集群配置的核心在于conf目录下的两个文件cluster.conf.example和application.properties。第一步配置集群节点列表首先将cluster.conf.example复制为cluster.conf。cp conf/cluster.conf.example conf/cluster.conf然后编辑cluster.conf文件。这个文件的作用是告诉Nacos集群里有哪些兄弟节点。你需要把三台服务器的IP和端口注意这里是服务器间通信的端口默认为8848按照如下格式写进去# 假设三台服务器IP为 192.168.1.101, 192.168.1.102, 192.168.1.103 192.168.1.101:8848 192.168.1.102:8848 192.168.1.103:8848关键点必须使用IP这里强烈建议使用IP地址而不是主机名如hostname。使用主机名常常会因DNS解析或/etc/hosts配置问题导致节点间无法识别这是集群组建失败的一个高频坑。端口一致这里的端口是Nacos服务端口默认为8848用于Jraft的通信。它需要和application.properties中的server.port保持一致。在所有节点上保持内容一致cluster.conf文件在三台服务器上的内容必须一模一样。你可以在一台机器上配置好然后用scp命令同步到其他两台机器。第二步调整核心应用配置接下来编辑application.properties文件。大部分配置可以保持默认但有几个关键项需要关注# 设置服务端口默认8848如果无冲突可不改 server.port8848 # 重要设置当前节点IP。 # 如果不设置Nacos可能会绑定到127.0.0.1或内网网卡导致其他节点或客户端无法访问。 nacos.inetutils.ip-address192.168.1.101 # 在第一台机器上设为它的IP第二台设为102第三台设为103 # 数据持久化方式。默认为embedded即使用内嵌Derby数据库。 # 如果你计划使用外置MySQL集群需要修改为mysql并配置下方的MySQL连接信息。 spring.datasource.platformembedded # 如果使用MySQL需要取消注释并修改以下配置并确保集群所有节点连接的是同一个MySQL集群。 # db.num1 # db.url.0jdbc:mysql://你的MySQL地址:3306/nacos_config?characterEncodingutf8connectTimeout1000socketTimeout3000autoReconnecttrueuseUnicodetrueuseSSLfalseserverTimezoneUTC # db.user.0nacos # db.password.0nacos密码关于nacos.inetutils.ip-address的深度解析这个配置项至关重要。Nacos在启动时需要知道自己在网络中的哪个地址上以便向集群其他成员和客户端宣告自己。在有多块网卡如eth0, eth1或复杂网络环境的服务器上Nacos自动选择的IP可能不是你期望的那个比如选到了docker0网桥的IP。手动指定可以彻底避免这个问题。我遇到过在Kubernetes宿主机上部署时因为没配这个参数Nacos注册到了宿主机的私有IP导致Pod内的服务无法访问排查了很久。4.2 多节点部署与启动现在将配置好的Nacos目录整个/usr/local/nacos复制到另外两台服务器上。可以使用scp或rsync命令。# 从101服务器复制到102服务器 scp -r /usr/local/nacos root192.168.1.102:/usr/local/ # 复制到103服务器 scp -r /usr/local/nacos root192.168.1.103:/usr/local/复制完成后务必登录到每台服务器检查并修改该服务器application.properties文件中的nacos.inetutils.ip-address将其改为本机IP。一切就绪后在三台服务器上分别启动Nacos。注意集群模式启动不需要-m standalone参数。cd /usr/local/nacos/bin sh startup.sh启动时观察日志 (tail -f ../logs/start.out)。你会看到类似以下的关键信息... Nacos is starting... ... Nacos started successfully in cluster mode. use external storage... ... The leader is 192.168.1.101:7848 ... # 显示当前集群的Leader节点 ... Current server ip is 192.168.1.101, voting for 192.168.1.101:7848 ... # 显示本节点投票情况 ... ServerListWatcher received new server list: [192.168.1.101:8848, 192.168.1.102:8848, 192.168.1.103:8848] ... # 成功识别集群成员看到Nacos started successfully in cluster mode并且集群成员列表正确就说明节点启动成功并加入了集群。4.3 集群状态验证启动完成后需要通过多种方式验证集群是否真正健康工作。方式一通过控制台查看任意访问一个节点的控制台如http://192.168.1.101:8848/nacos登录后在左侧菜单找到“集群管理” - “节点列表”。你会看到三台服务器的信息其中一台的“角色”会是“LEADER”另外两台是“FOLLOWER”。这证明Raft协议已经成功选举出领导者集群状态正常。方式二通过API接口检查Nacos提供了健康检查的API端点。在命令行使用curl工具检查# 检查任意一个节点的健康状态 curl -X GET http://192.168.1.101:8848/nacos/v1/ns/operator/health健康的状态会返回{status:UP,healths:[{key:naming_raft,status:UP},{key:naming_distro,status:UP}]}方式三模拟故障转移可选生产环境慎用这是最直接的验证。手动停止当前LEADER节点的Nacos服务进入其bin目录执行sh shutdown.sh。等待约30秒到1分钟刷新另外两个节点的“节点列表”页面。你会发现原来的一个FOLLOWER节点会自动升级为新的LEADER集群继续提供服务。然后再启动刚才停止的节点它会以FOLLOWER身份重新加入集群。这个过程完美演示了集群的高可用性。实操心得在启动集群时建议按顺序间隔10-15秒启动各个节点而不是同时启动。这可以给集群选举一个更稳定的环境。如果同时启动可能会遇到短暂的“脑裂”争议但Raft协议最终会达成一致只是日志里可能会多一些警告信息属于正常现象。5. 客户端接入与配置管理实战集群搭建好了但价值需要通过客户端你的微服务来体现。这里以Spring Cloud Alibaba项目为例演示如何将服务接入Nacos集群。5.1 Spring Cloud项目配置在你的Spring Boot项目的pom.xml中引入依赖dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId version2022.0.0.0/version !-- 请匹配你的Spring Cloud版本 -- /dependency dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-config/artifactId version2022.0.0.0/version /dependency在application.yml或bootstrap.yml如果你用了的话中配置Nacos服务器地址spring: application: name: your-service-name # 你的服务名 cloud: nacos: discovery: # 关键配置这里填写Nacos集群所有节点的地址用逗号分隔 server-addr: 192.168.1.101:8848,192.168.1.102:8848,192.168.1.103:8848 # 命名空间默认是public可用于环境隔离 namespace: public # 集群名称用于流量分区 cluster-name: DEFAULT config: server-addr: ${spring.cloud.nacos.discovery.server-addr} # 通常与discovery一致 file-extension: yaml # 配置文件的扩展名支持yaml, properties等 namespace: public group: DEFAULT_GROUPserver-addr配置的玄机这里填写集群所有节点的地址客户端SDK会获取这个列表。当它启动时会随机选择一个地址进行连接获取到最新的、完整的集群服务器列表。之后即使最初连接的节点宕机客户端也能自动切换到列表中的其他健康节点。所以你不需要在客户端前面再额外搭建一个负载均衡器如NginxNacos客户端自身就具备了负载均衡和故障转移的能力。5.2 动态配置中心使用示例Nacos作为配置中心的核心能力是动态刷新。创建一个配置在Nacos控制台“配置管理” - “配置列表” - 点击“”创建。Data ID格式通常为${spring.application.name}-${profile}.${file-extension}。例如你的服务名是user-service使用dev环境文件格式是yaml那么Data ID就填user-service-dev.yaml。Group保持DEFAULT_GROUP除非你有特殊分组需求。配置格式选择YAML。在配置内容里写入你的配置例如server: port: 8081 custom: config: hello-nacos在你的Spring Boot应用中使用Value注解或ConfigurationProperties来注入这个配置。并且为了支持动态刷新需要在需要刷新的Bean上添加RefreshScope注解。import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; RestController RefreshScope // 添加此注解这个Controller内的配置值就可以动态更新了 public class ConfigController { Value(${custom.config:default}) private String config; GetMapping(/config) public String getConfig() { return Current config is: config; } }启动你的应用。访问/config接口会返回hello-nacos。此时你回到Nacos控制台修改custom.config的值为hello-nacos-cluster并发布。稍等片刻通常2-3秒内刷新浏览器再次访问接口你会发现返回值已经变成了新值整个过程不需要重启应用。这就是配置热更新的威力。避坑指南很多同学反馈配置不刷新常见原因有1. 忘记在类上加RefreshScope注解2. 使用Value注解的地方是static字段或非Spring管理的对象3. 配置的Data ID、Group或命名空间与代码中读取的不匹配。务必仔细核对。6. 生产环境进阶考量与运维对于开发测试环境上述基于内嵌Derby的集群模式已经足够。但一旦上生产我们就必须考虑数据持久化的可靠性、监控和性能调优。6.1 持久化存储从Derby切换到MySQL集群内嵌Derby数据库虽然方便但它将数据存储在每台节点的本地data目录下。这意味着数据不一致风险虽然Raft协议保证了内存中元数据的一致性但真正的配置内容存在Derby里在极端故障场景下如整个节点磁盘损坏可能丢失。运维复杂备份、恢复、数据迁移都比较麻烦。因此生产环境强烈推荐使用外部MySQL数据库作为持久化存储。你需要一个高可用的MySQL集群主从或MGR并让所有Nacos节点连接它。切换步骤在你的MySQL集群中创建一个数据库例如nacos_config并执行Nacos提供的SQL脚本位于conf/mysql-schema.sql。修改所有Nacos节点conf/application.properties中的数据库配置取消注释并填写正确的信息如6.1节所示。将spring.datasource.platform的值从embedded改为mysql。重要切换前如果Derby中已有数据需要手动迁移到MySQL。Nacos官方没有提供自动迁移工具这是一个需要规划停机的操作。通常做法是在低峰期停止所有Nacos节点导出Derby数据可通过控制台逐个配置导出为文件切换为MySQL模式并启动集群再将配置数据通过控制台或API重新导入。6.2 监控与健康检查一个健康的集群需要被监控。除了查看控制台还有更自动化的方式。内置MetricsNacos 2.x 暴露了基于Micrometer的Metrics端点。你可以在application.properties中配置management.endpoints.web.exposure.include*来开启然后通过http://节点IP:8848/nacos/actuator/prometheus获取Prometheus格式的监控数据。关键指标包括nacos_monitor{namelongPolling}长连接数反映客户端负载。nacos_monitor{nameconfigCount}配置条数。system_cpu_usage系统CPU使用率。http_server_requests_seconds_countHTTP请求计数和耗时。日志监控定期检查logs/nacos.log关注ERROR和WARN级别的日志。可以配置日志收集系统如ELK进行集中分析和告警。定期健康检查脚本可以编写一个简单的Shell脚本定期调用Nacos的健康检查API/nacos/v1/ns/operator/health如果返回非UP状态或请求超时则触发告警。6.3 性能调优与安全加固随着接入服务增多你可能需要对Nacos进行调优。JVM参数调整编辑bin/startup.sh找到JAVA_OPT配置。根据服务器内存大小调整堆内存。例如对于8G内存的机器可以设置JAVA_OPT${JAVA_OPT} -Xms4g -Xmx4g -Xmn2g。还可以添加GC日志参数方便排查问题。数据库连接池在application.properties中可以调整MySQL连接池参数如db.pool.config.connectionTimeout、db.pool.config.validationTimeout等以适应高并发。安全加固修改默认密码第一时间在控制台修改nacos用户的默认密码。启用鉴权在application.properties中设置nacos.core.auth.enabledtrue并配置nacos.core.auth.server.identity.key和nacos.core.auth.server.identity.value。这样客户端连接就需要携带AccessKey和SecretKey在控制台“权限控制”-“用户管理”中创建。网络隔离将Nacos集群部署在内网通过API Gateway或内部负载均衡器对外暴露避免直接公网访问。7. 常见问题排查与解决方案实录即使按照指南操作在实际部署中也可能遇到各种问题。这里记录了几个我踩过或帮人解决过的高频坑。7.1 集群节点无法互相发现现象节点启动后日志里一直报错Server check fail, please check server 192.168.1.XXX is available或者在控制台“节点列表”里只能看到自己看不到其他节点。排查思路检查cluster.conf文件这是第一嫌疑犯。确保三台机器上的这个文件内容完全一致并且使用的是IP地址不是主机名。检查IP是否写错端口是否为8848。检查网络和防火墙这是第二高频区。在三台机器上互相ping一下IP确保网络通。然后使用telnet或nc命令检查端口是否开放。例如在101机器上执行telnet 192.168.1.102 8848和telnet 192.168.1.102 7848。如果不通检查服务器本地防火墙firewall-cmd --list-all和云服务商的安全组规则确保8848, 7848, 9848, 9849端口都已放行。检查nacos.inetutils.ip-address配置确认每台机器的application.properties中这个配置项的值就是本机对外的IP地址。可以执行hostname -I或ip addr来确认。检查启动模式确认启动命令是sh startup.sh而不是sh startup.sh -m standalone。7.2 客户端连接失败报错“Connection refused”或“no server available”现象微服务启动时日志报错无法连接Nacos服务器。排查思路检查客户端配置确认spring.cloud.nacos.discovery.server-addr配置的IP和端口是否正确。端口是否是8848HTTP端口。检查Nacos 2.x的gRPC端口这是Nacos 2.x特有的问题。确保客户端能访问到Nacos服务器的9848端口。很多运维同学只开了8848导致客户端通过gRPC方式连接时失败。用telnet测试一下。检查Nacos服务状态直接浏览器访问http://Nacos_IP:8848/nacos看控制台是否能打开。检查客户端与服务器网络确保客户端所在网络能与Nacos服务器网络互通没有网络策略拦截。7.3 配置变更不刷新现象在Nacos控制台修改了配置并发布但应用程序中的Value值没有更新。排查思路检查RefreshScope注解确保使用了Value的类上添加了RefreshScope注解。检查配置的Data ID和Group在Nacos控制台和代码的bootstrap.yml中仔细核对Data ID、Group和命名空间(namespace)是否完全一致。大小写、中划线、下划线都要注意。检查配置格式在Nacos中发布的配置内容其格式YAML/Properties是否与file-extension配置匹配内容是否是合法的YAML或Properties。查看客户端日志在应用日志中搜索Refresh关键字Nacos客户端在收到配置变更时会有日志输出。如果没有可能是配置监听没有成功注册。7.4 启动时报数据库错误现象启动Nacos时日志报错failed to start database /home/nacos/data/derby-data with class loader ...原因与解决这通常是Derby数据库文件损坏或权限问题导致的。权限问题检查Nacos的data目录默认在/home/nacos/data或解压目录下的data的读写权限确保运行Nacos的用户如nacos或root有权限读写该目录。可以尝试chmod -R 755 /usr/local/nacos/data。文件损坏如果是非生产环境的单机或集群测试可以尝试清空data目录下的derby-data文件夹注意这会丢失所有配置数据然后重启Nacos它会重新初始化数据库。生产环境如果使用Derby模式遇到此问题说明该模式已不适用应尽快规划迁移到MySQL模式。搭建和维护一个稳定的Nacos集群就像养护一个精密的仪表盘。初期按照步骤一步步来把网络、配置这些基础打牢后期则要关注监控、数据和安全。这个过程里多看日志、善用社区GitHub Issues、问答社区是解决问题的捷径。当你的微服务们都能稳定地从这套集群中发现彼此、获取配置时你会觉得这些折腾都是值得的。

相关新闻