1. 项目概述为什么Nacos集群部署是微服务架构的“定海神针”在微服务架构的实践中服务注册与发现、配置管理是两大基石。Nacos作为Spring Cloud Alibaba生态的核心组件集这两大功能于一身其稳定性和可用性直接决定了整个微服务体系的健康度。单机部署的Nacos在开发测试阶段尚可应付一旦进入生产环境任何单点故障都可能导致服务大面积“失联”或配置错乱引发雪崩效应。因此构建一个高可用的Nacos集群不是一道选择题而是一道必答题。这个项目就是要把Nacos从“单兵作战”升级为“协同作战”的集群模式。核心目标很明确通过多节点部署实现服务注册与配置数据的分布式存储与同步确保任意一个节点宕机整个Nacos服务依然能对外提供不间断的服务从而为上层微服务提供坚实、可靠的基础设施保障。这不仅仅是部署几台服务器那么简单它涉及到集群模式的选择、数据一致性的保证、负载均衡策略以及后续的监控运维是一个系统工程。如果你正在或即将将微服务架构投入生产那么深入理解并亲手搭建一套Nacos高可用集群是绕不开的关键一步。2. 集群架构设计与核心组件解析2.1 集群模式选型为什么选择“持久化模式”而非“临时模式”Nacos集群部署有两种核心模式临时实例模式AP强调可用性和持久化实例模式CP强调一致性。对于生产环境我们几乎无一例外地选择持久化模式。原因在于服务注册信息是微服务的“通讯录”必须保证强一致性。如果因为网络分区导致不同节点上的服务列表不一致就可能出现A服务调用了一个在B节点上已宕机但未及时同步下线的服务实例直接导致调用失败。在持久化模式下Nacos集群使用Raft一致性算法来选举Leader并同步数据。所有写操作如服务注册、配置发布必须经由Leader节点处理并同步到多数派Follower节点后才会返回成功。这牺牲了一点写入延迟但换来了数据的强一致性这对于配置中心一个配置必须全局一致和服务注册中心服务实例状态必须准确是至关重要的。注意很多初学者会混淆Nacos自身的集群模式和Nacos客户端注册服务的“临时/持久”实例属性。前者是服务端的数据存储模式后者是客户端实例的生命周期管理。我们这里讨论的是服务端的集群数据存储模式。2.2 核心架构组件拆解一个典型的Nacos高可用集群包含以下几个核心部分Nacos Server 集群节点至少3个节点推荐3或5个奇数个构成一个Raft集群。这是服务的大脑负责处理所有客户端请求。持久化存储这是集群数据的“保险柜”。默认Nacos使用内嵌的Derby数据库但这在集群下不行因为每个节点的Derby是独立的。必须使用外置的、共享的数据库通常是MySQL。所有节点连接同一个MySQL集群主从或高可用方案确保配置信息、用户权限等元数据有统一的存储。负载均衡器这是集群的“交通指挥”。客户端微服务不能写死连接某一个Nacos节点需要通过一个统一的入口访问。通常使用Nginx、HAProxy或云厂商的负载均衡服务如SLB将请求均匀分发到后端的Nacos Server节点。客户端即我们的各个微服务应用。它们通过配置负载均衡器的地址来与Nacos集群交互。它们之间的关系可以概括为客户端 - 负载均衡器 - Nacos Server集群 - 共享MySQL数据库。任何一个环节都需要考虑高可用。3. 部署前准备与环境规划3.1 服务器资源规划假设我们规划一个3节点的Nacos生产集群。服务器配置建议如下角色数量建议配置说明Nacos Server节点34核CPU8GB内存100GB SSD磁盘内存尤为重要Nacos比较吃内存尤其是服务实例多的时候。磁盘用于写日志。MySQL数据库1主1从 或 高可用集群按数据量评估生产环境切忌单点。可使用MySQL主从、MGR或云上RDS。负载均衡器 (Nginx)2主备2核CPU4GB内存采用Keepalived实现VIP漂移做高可用。也可直接用云SLB。网络规划上确保所有服务器在同一安全组或VPC内网络互通并开放相关端口Nacos默认8848MySQL 3306Nginx根据监听端口。3.2 软件版本与依赖检查选择稳定版本是关键。以当前主流为例Nacos Server: 2.2.x 或 2.3.x 稳定版。2.x版本在性能和稳定性上比1.x有显著提升。MySQL: 5.7或8.0版本。需要提前创建好数据库和用户。JDK: Nacos 2.x 需要JDK 1.8强烈推荐使用JDK 11或17性能更好。在每台服务器上使用java -version确认。Nginx: 1.18 稳定版即可。4. 分步实操构建Nacos高可用集群4.1 第一步初始化共享数据库这是集群搭建的基石必须先完成。在MySQL主库上执行以下操作-- 1. 创建数据库字符集使用utf8mb4 CREATE DATABASE IF NOT EXISTS nacos_cluster DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 2. 使用该数据库 USE nacos_cluster; -- 3. 执行Nacos提供的官方建表脚本 -- 脚本文件位于你下载的Nacos压缩包conf/nacos-mysql.sql -- 你可以通过 mysql -u root -p nacos_cluster nacos-mysql.sql 导入导入成功后会创建约十几张表核心表如config_info存储配置、tenant_info租户信息等。务必检查表是否创建成功。实操心得务必在MySQL从库或所有高可用节点上也同步这个数据库。Nacos服务端只连接一个MySQL地址通常是主库或读写分离的写地址数据库自身的高可用需要靠MySQL集群方案保证这是另一个层面的问题但同样重要。4.2 第二步部署与配置Nacos Server节点接下来在三台服务器假设IP为192.168.1.101 .102 .103上部署Nacos。1. 基础安装# 在每台服务器上操作 # 1. 下载并解压 wget https://github.com/alibaba/nacos/releases/download/2.2.0/nacos-server-2.2.0.tar.gz tar -zxvf nacos-server-2.2.0.tar.gz -C /opt/ cd /opt/nacos # 2. 配置数据库连接 cp conf/application.properties.example conf/application.properties vi conf/application.properties2. 关键配置修改 (conf/application.properties):找到并修改以下部分三台服务器配置基本相同除了server.ip# 数据库配置指向我们刚才搭建的MySQL spring.datasource.platformmysql db.num1 db.url.0jdbc:mysql://192.168.1.100:3306/nacos_cluster?useUnicodetruecharacterEncodingutf8connectTimeout1000socketTimeout3000autoReconnecttrueuseSSLfalse db.user.0nacos_user db.password.0YourStrongPassword123! # 集群配置模式 nacos.core.auth.enabledfalse # 生产环境建议开启鉴权此处为演示先关闭 nacos.core.auth.system.typenacos nacos.core.auth.plugin.nacos.token.secret.keySecretKey012345678901234567890123456789012345678901234567890123456789 # 重点指定当前节点IP。如果不设置Nacos可能会取到内网或docker网卡IP导致集群通信失败。 nacos.inetutils.ip-address192.168.1.101 # 在.102和.103机器上分别改为自己的IP3. 配置集群节点信息 (conf/cluster.conf):这个文件告诉Nacos集群里有哪些兄弟节点。在三台服务器上创建相同内容的cluster.confcp conf/cluster.conf.example conf/cluster.conf vi conf/cluster.conf内容如下格式为ip:port192.168.1.101:8848 192.168.1.102:8848 192.168.1.103:8848重要提示这里的IP必须是nacos.inetutils.ip-address配置的IP且端口是server.port默认8848。确保这些IP和端口在服务器之间可以互相访问防火墙开放。4.3 第三步搭建高可用负载均衡器Nginx Keepalived我们使用两台Nginx做负载均衡通过Keepalived实现虚拟IPVIP高可用。在Nginx服务器192.168.1.201 .202上操作1. 安装Nginx和Keepalived# CentOS示例 yum install -y nginx keepalived2. 配置Nginx负载均衡编辑/etc/nginx/nginx.conf的http块添加一个upstream和serverhttp { upstream nacos-cluster { # 配置负载均衡策略ip_hash可以保证同一客户端IP总是打到同一个后端对连接保持友好 ip_hash; server 192.168.1.101:8848; server 192.168.1.102:8848; server 192.168.1.103:8848; # 可以配置权重 weight3 等参数 } server { listen 80; # 生产环境建议用域名如 nacos.yourcompany.com server_name localhost; 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; # Nacos 2.x 需要支持gRPC长连接必须添加以下配置 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_connect_timeout 30s; proxy_read_timeout 600s; proxy_send_timeout 600s; } } }检查配置并重启Nginxnginx -t systemctl restart nginx3. 配置Keepalived实现VIP高可用假设我们使用的VIP是192.168.1.200。 在主节点(.201)上配置/etc/keepalived/keepalived.confglobal_defs { router_id nginx_master } vrrp_script chk_nginx { script /usr/bin/killall -0 nginx # 检查nginx进程是否存在 interval 2 weight -5 fall 2 rise 1 } vrrp_instance VI_1 { state MASTER interface eth0 # 改为你的网卡名 virtual_router_id 51 # 虚拟路由ID同一组集群必须相同 priority 100 # 主节点优先级更高 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.200/24 } track_script { chk_nginx } }在备节点(.202)上只需修改state为BACKUPpriority为90其他类似。启动Keepalivedsystemctl start keepalived systemctl enable keepalived。现在客户端可以通过http://192.168.1.200:80访问Nacos集群即使一台Nginx宕机VIP会自动漂移到另一台。4.4 第四步启动集群并验证1. 启动Nacos集群在三台Nacos服务器上分别进入/opt/nacos/bin目录以集群模式启动# 前台启动方便看日志 sh startup.sh -m cluster # 或者使用后台启动 sh startup.sh -m cluster 查看日志确认启动成功tail -f /opt/nacos/logs/start.out。你应该能看到类似“Nacos started successfully in cluster mode.”的日志并且日志中会显示与其他节点建立连接的信息。2. 验证集群状态通过VIP访问Nacos控制台http://192.168.1.200/nacos。默认账号密码是nacos/nacos。进入“集群管理” - “节点列表”。你应该能看到三个节点的IP和端口并且它们的状态都是“UP”角色中有一个是“LEADER”另外两个是“FOLLOWER”。这证明Raft集群选举成功节点间通信正常。进行功能测试服务注册在任意一个微服务中将spring.cloud.nacos.discovery.server-addr配置为192.168.1.200:80启动服务。在Nacos控制台“服务管理”中应能看到该服务。配置发布在“配置管理”中发布一个配置。然后分别直接访问三个Nacos节点的独立地址如http://192.168.1.101:8848/nacos检查配置是否都存在。这验证了数据通过Raft同步的一致性。5. 高可用保证的深层配置与优化5.1 开启鉴权与细粒度权限控制生产环境必须开启鉴权防止未授权访问。修改每个Nacos节点的application.propertiesnacos.core.auth.enabledtrue nacos.core.auth.system.typenacos # 这是一个Base64编码的密钥必须足够复杂且所有节点保持一致 nacos.core.auth.plugin.nacos.token.secret.keyVGhpc0lzQVZlcnlMb25nU2VjcmV0S2V5Rm9yTmFjb3NBdXRoS2V5MTIzNDU2Nzg5MA重启集群后登录控制台需要密码。还可以结合命名空间Namespace和配置分组Group实现环境隔离和权限划分。5.2 调整集群通信与数据同步参数在conf/application.properties中有一些关键参数影响集群性能和稳定性# 选举超时时间单位毫秒。网络不稳定时可适当调大。 nacos.core.protocol.raft.data.election_timeout_ms5000 # 心跳间隔。调小可以加快故障发现但增加网络开销。 nacos.core.protocol.raft.data.heartbeat_interval_ms2000 # 单个Raft日志文件大小默认64MB。如果配置变更极频繁可考虑调大。 nacos.core.protocol.raft.data.log_file_size64这些参数没有银弹需要根据实际网络环境和业务压力进行调整。改动任何参数前务必在测试环境充分验证。5.3 配置持久化的优化与监控MySQL优化建议为config_info等核心表建立合适的索引。定期清理历史数据Nacos会生成his_config_info配置历史等表需要定制定期清理任务或使用Nacos官方提供的清理脚本。监控MySQL连接数、慢查询。Nacos节点数增多时连接池压力会变大。Nacos JVM参数优化编辑bin/startup.sh找到JAVA_OPT配置。根据服务器内存调整例如8G内存的机器JAVA_OPT${JAVA_OPT} -Xms4g -Xmx4g -Xmn2g # 堆内存设为4G新生代2G JAVA_OPT${JAVA_OPT} -XX:MetaspaceSize256m -XX:MaxMetaspaceSize512m # 元空间 JAVA_OPT${JAVA_OPT} -XX:UseG1GC -XX:MaxGCPauseMillis200 # 使用G1垃圾回收器合理的JVM参数能有效减少Full GC避免服务注册发现出现延迟或超时。6. 常见生产问题排查与运维实录6.1 集群节点状态异常无法形成Leader现象在“节点列表”中节点状态一直为“DOWN”或始终没有LEADER选举出来。排查思路检查网络互通在三个节点上互相telnet 其他节点IP 8848检查端口是否通畅。最常见的问题就是防火墙或安全组未开放8848端口。Nacos 2.x版本还使用了7848端口用于Raft节点间RPC通信也必须开放。检查cluster.conf文件确认文件格式正确IP:PORT每行一个且IP地址与nacos.inetutils.ip-address配置完全一致。切忌使用localhost、127.0.0.1或主机名。检查日志查看logs/nacos.log搜索 “ERROR”、“vote”、“Leader” 等关键词。常见错误如Connection refused指向网络问题Invalid node address指向地址配置问题。确认启动模式确保启动命令是-m cluster而不是默认的standalone模式。6.2 客户端服务注册成功但其他服务无法发现现象服务A注册到Nacos VIP日志显示成功但服务B通过同一个VIP却找不到服务A。排查思路检查客户端配置确认服务B的namespace、group配置与服务A完全一致。不同命名空间的服务默认不可见。检查负载均衡策略如果你在Nginx中使用了ip_hash且服务A和服务B部署在同一台机器它们可能被Nginx转发到不同的Nacos后端节点。由于Nacos服务发现是客户端主动从服务端拉取列表如果客户端连接的后端节点因为Raft同步延迟尚未收到最新注册信息就会导致这个问题。临时解决方案可以尝试将Nginx的负载均衡策略改为least_conn最小连接或random随机但这不能根治。根治方案这通常指向Raft数据同步存在延迟或问题。检查Nacos集群节点日志是否有同步错误网络是否有高延迟或丢包。对于生产环境确保Nacos服务器节点位于低延迟、稳定的内网环境中至关重要。6.3 配置发布后客户端长时间未感知到变更现象在控制台修改了配置并发布但微服务需要等待几分钟甚至重启才能拿到新配置。排查思路检查客户端长轮询参数Nacos配置中心采用“长轮询”机制。检查客户端配置spring.cloud.nacos.config.refresh-enabledtrue以及spring.cloud.nacos.config.long-poll.timeout默认30000ms是否合理。网络不稳定时可以适当调小超时时间但会增加服务器压力。检查Nacos服务器端日志查看是否有处理配置监听请求的异常。检查共享MySQL压力配置信息存储在MySQL中如果MySQL性能瓶颈可能导致读写变慢影响配置同步和通知效率。监控MySQL的CPU、IO和慢查询日志。6.4 内存使用率持续升高最终OOM现象Nacos服务运行一段时间后内存占用不断增长直至崩溃。排查思路检查服务实例数Nacos会为每个注册的服务实例在内存中维护心跳和元数据。如果微服务实例数量巨大例如上千个默认的JVM堆内存可能不足。需要按实例数 * (约500KB ~ 1MB)来估算内存并相应调大JVM堆空间。检查客户端连接Nacos 2.x使用gRPC长连接每个客户端连接都会占用资源。检查是否有客户端异常未释放连接或者客户端数量过多。可以通过Nacos控制台“连接管理”查看。分析堆转储在JVM参数中添加-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/path/to/dump在OOM时生成堆转储文件使用MAT等工具分析看是什么对象占用了大量内存。启用访问日志并定期清理Nacos的访问日志可能快速增长。在application.properties中合理配置日志级别并设置日志滚动策略。7. 监控、告警与灾备演练7.1 关键监控指标一套没有监控的高可用集群是不完整的。需要监控以下核心指标监控类别具体指标告警阈值建议工具节点状态节点UP/DOWN状态、角色Leader/Follower任何节点DOWNPrometheus Grafana (通过Nacos暴露的/metrics端点)服务健康注册服务总数、健康实例数、不健康实例数不健康实例占比5%配置健康配置发布总数、监听查询QPSQPS突增或突降系统资源CPU使用率、内存使用率、JVM GC次数与时间CPU80%持续5分钟内存85%服务器基础监控数据库MySQL连接数、慢查询数、磁盘空间连接数接近最大限制MySQL监控网络与负载Nginx/VIP的请求量、延迟、错误率错误率1%延迟P991sNginx状态页或监控7.2 定期灾备演练高可用架构不能只停留在部署阶段必须定期验证。模拟节点故障在业务低峰期手动停止一个Follower节点的Nacos进程。观察控制台节点列表状态是否及时更新。客户端服务注册与发现是否受影响理论上应无感。Leader是否重新选举如果停的是Leader。模拟网络分区通过防火墙规则临时隔离一个Nacos节点与其他节点的网络。观察集群多数派是否还能正常工作被隔离的节点状态是否变为DOWN。模拟负载均衡器故障停止主Nginx/Keepalived观察VIP是否顺利漂移到备机客户端连接是否会短暂中断通常会有1-2次心跳超时但应自动恢复。通过这些演练你才能真正信任你的Nacos高可用集群并在真实故障发生时从容应对。记住架构的可靠性不仅在于设计更在于持续的验证和维护。
Nacos高可用集群部署实战:从架构设计到生产运维全解析
发布时间:2026/5/18 19:32:29
1. 项目概述为什么Nacos集群部署是微服务架构的“定海神针”在微服务架构的实践中服务注册与发现、配置管理是两大基石。Nacos作为Spring Cloud Alibaba生态的核心组件集这两大功能于一身其稳定性和可用性直接决定了整个微服务体系的健康度。单机部署的Nacos在开发测试阶段尚可应付一旦进入生产环境任何单点故障都可能导致服务大面积“失联”或配置错乱引发雪崩效应。因此构建一个高可用的Nacos集群不是一道选择题而是一道必答题。这个项目就是要把Nacos从“单兵作战”升级为“协同作战”的集群模式。核心目标很明确通过多节点部署实现服务注册与配置数据的分布式存储与同步确保任意一个节点宕机整个Nacos服务依然能对外提供不间断的服务从而为上层微服务提供坚实、可靠的基础设施保障。这不仅仅是部署几台服务器那么简单它涉及到集群模式的选择、数据一致性的保证、负载均衡策略以及后续的监控运维是一个系统工程。如果你正在或即将将微服务架构投入生产那么深入理解并亲手搭建一套Nacos高可用集群是绕不开的关键一步。2. 集群架构设计与核心组件解析2.1 集群模式选型为什么选择“持久化模式”而非“临时模式”Nacos集群部署有两种核心模式临时实例模式AP强调可用性和持久化实例模式CP强调一致性。对于生产环境我们几乎无一例外地选择持久化模式。原因在于服务注册信息是微服务的“通讯录”必须保证强一致性。如果因为网络分区导致不同节点上的服务列表不一致就可能出现A服务调用了一个在B节点上已宕机但未及时同步下线的服务实例直接导致调用失败。在持久化模式下Nacos集群使用Raft一致性算法来选举Leader并同步数据。所有写操作如服务注册、配置发布必须经由Leader节点处理并同步到多数派Follower节点后才会返回成功。这牺牲了一点写入延迟但换来了数据的强一致性这对于配置中心一个配置必须全局一致和服务注册中心服务实例状态必须准确是至关重要的。注意很多初学者会混淆Nacos自身的集群模式和Nacos客户端注册服务的“临时/持久”实例属性。前者是服务端的数据存储模式后者是客户端实例的生命周期管理。我们这里讨论的是服务端的集群数据存储模式。2.2 核心架构组件拆解一个典型的Nacos高可用集群包含以下几个核心部分Nacos Server 集群节点至少3个节点推荐3或5个奇数个构成一个Raft集群。这是服务的大脑负责处理所有客户端请求。持久化存储这是集群数据的“保险柜”。默认Nacos使用内嵌的Derby数据库但这在集群下不行因为每个节点的Derby是独立的。必须使用外置的、共享的数据库通常是MySQL。所有节点连接同一个MySQL集群主从或高可用方案确保配置信息、用户权限等元数据有统一的存储。负载均衡器这是集群的“交通指挥”。客户端微服务不能写死连接某一个Nacos节点需要通过一个统一的入口访问。通常使用Nginx、HAProxy或云厂商的负载均衡服务如SLB将请求均匀分发到后端的Nacos Server节点。客户端即我们的各个微服务应用。它们通过配置负载均衡器的地址来与Nacos集群交互。它们之间的关系可以概括为客户端 - 负载均衡器 - Nacos Server集群 - 共享MySQL数据库。任何一个环节都需要考虑高可用。3. 部署前准备与环境规划3.1 服务器资源规划假设我们规划一个3节点的Nacos生产集群。服务器配置建议如下角色数量建议配置说明Nacos Server节点34核CPU8GB内存100GB SSD磁盘内存尤为重要Nacos比较吃内存尤其是服务实例多的时候。磁盘用于写日志。MySQL数据库1主1从 或 高可用集群按数据量评估生产环境切忌单点。可使用MySQL主从、MGR或云上RDS。负载均衡器 (Nginx)2主备2核CPU4GB内存采用Keepalived实现VIP漂移做高可用。也可直接用云SLB。网络规划上确保所有服务器在同一安全组或VPC内网络互通并开放相关端口Nacos默认8848MySQL 3306Nginx根据监听端口。3.2 软件版本与依赖检查选择稳定版本是关键。以当前主流为例Nacos Server: 2.2.x 或 2.3.x 稳定版。2.x版本在性能和稳定性上比1.x有显著提升。MySQL: 5.7或8.0版本。需要提前创建好数据库和用户。JDK: Nacos 2.x 需要JDK 1.8强烈推荐使用JDK 11或17性能更好。在每台服务器上使用java -version确认。Nginx: 1.18 稳定版即可。4. 分步实操构建Nacos高可用集群4.1 第一步初始化共享数据库这是集群搭建的基石必须先完成。在MySQL主库上执行以下操作-- 1. 创建数据库字符集使用utf8mb4 CREATE DATABASE IF NOT EXISTS nacos_cluster DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 2. 使用该数据库 USE nacos_cluster; -- 3. 执行Nacos提供的官方建表脚本 -- 脚本文件位于你下载的Nacos压缩包conf/nacos-mysql.sql -- 你可以通过 mysql -u root -p nacos_cluster nacos-mysql.sql 导入导入成功后会创建约十几张表核心表如config_info存储配置、tenant_info租户信息等。务必检查表是否创建成功。实操心得务必在MySQL从库或所有高可用节点上也同步这个数据库。Nacos服务端只连接一个MySQL地址通常是主库或读写分离的写地址数据库自身的高可用需要靠MySQL集群方案保证这是另一个层面的问题但同样重要。4.2 第二步部署与配置Nacos Server节点接下来在三台服务器假设IP为192.168.1.101 .102 .103上部署Nacos。1. 基础安装# 在每台服务器上操作 # 1. 下载并解压 wget https://github.com/alibaba/nacos/releases/download/2.2.0/nacos-server-2.2.0.tar.gz tar -zxvf nacos-server-2.2.0.tar.gz -C /opt/ cd /opt/nacos # 2. 配置数据库连接 cp conf/application.properties.example conf/application.properties vi conf/application.properties2. 关键配置修改 (conf/application.properties):找到并修改以下部分三台服务器配置基本相同除了server.ip# 数据库配置指向我们刚才搭建的MySQL spring.datasource.platformmysql db.num1 db.url.0jdbc:mysql://192.168.1.100:3306/nacos_cluster?useUnicodetruecharacterEncodingutf8connectTimeout1000socketTimeout3000autoReconnecttrueuseSSLfalse db.user.0nacos_user db.password.0YourStrongPassword123! # 集群配置模式 nacos.core.auth.enabledfalse # 生产环境建议开启鉴权此处为演示先关闭 nacos.core.auth.system.typenacos nacos.core.auth.plugin.nacos.token.secret.keySecretKey012345678901234567890123456789012345678901234567890123456789 # 重点指定当前节点IP。如果不设置Nacos可能会取到内网或docker网卡IP导致集群通信失败。 nacos.inetutils.ip-address192.168.1.101 # 在.102和.103机器上分别改为自己的IP3. 配置集群节点信息 (conf/cluster.conf):这个文件告诉Nacos集群里有哪些兄弟节点。在三台服务器上创建相同内容的cluster.confcp conf/cluster.conf.example conf/cluster.conf vi conf/cluster.conf内容如下格式为ip:port192.168.1.101:8848 192.168.1.102:8848 192.168.1.103:8848重要提示这里的IP必须是nacos.inetutils.ip-address配置的IP且端口是server.port默认8848。确保这些IP和端口在服务器之间可以互相访问防火墙开放。4.3 第三步搭建高可用负载均衡器Nginx Keepalived我们使用两台Nginx做负载均衡通过Keepalived实现虚拟IPVIP高可用。在Nginx服务器192.168.1.201 .202上操作1. 安装Nginx和Keepalived# CentOS示例 yum install -y nginx keepalived2. 配置Nginx负载均衡编辑/etc/nginx/nginx.conf的http块添加一个upstream和serverhttp { upstream nacos-cluster { # 配置负载均衡策略ip_hash可以保证同一客户端IP总是打到同一个后端对连接保持友好 ip_hash; server 192.168.1.101:8848; server 192.168.1.102:8848; server 192.168.1.103:8848; # 可以配置权重 weight3 等参数 } server { listen 80; # 生产环境建议用域名如 nacos.yourcompany.com server_name localhost; 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; # Nacos 2.x 需要支持gRPC长连接必须添加以下配置 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_connect_timeout 30s; proxy_read_timeout 600s; proxy_send_timeout 600s; } } }检查配置并重启Nginxnginx -t systemctl restart nginx3. 配置Keepalived实现VIP高可用假设我们使用的VIP是192.168.1.200。 在主节点(.201)上配置/etc/keepalived/keepalived.confglobal_defs { router_id nginx_master } vrrp_script chk_nginx { script /usr/bin/killall -0 nginx # 检查nginx进程是否存在 interval 2 weight -5 fall 2 rise 1 } vrrp_instance VI_1 { state MASTER interface eth0 # 改为你的网卡名 virtual_router_id 51 # 虚拟路由ID同一组集群必须相同 priority 100 # 主节点优先级更高 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.200/24 } track_script { chk_nginx } }在备节点(.202)上只需修改state为BACKUPpriority为90其他类似。启动Keepalivedsystemctl start keepalived systemctl enable keepalived。现在客户端可以通过http://192.168.1.200:80访问Nacos集群即使一台Nginx宕机VIP会自动漂移到另一台。4.4 第四步启动集群并验证1. 启动Nacos集群在三台Nacos服务器上分别进入/opt/nacos/bin目录以集群模式启动# 前台启动方便看日志 sh startup.sh -m cluster # 或者使用后台启动 sh startup.sh -m cluster 查看日志确认启动成功tail -f /opt/nacos/logs/start.out。你应该能看到类似“Nacos started successfully in cluster mode.”的日志并且日志中会显示与其他节点建立连接的信息。2. 验证集群状态通过VIP访问Nacos控制台http://192.168.1.200/nacos。默认账号密码是nacos/nacos。进入“集群管理” - “节点列表”。你应该能看到三个节点的IP和端口并且它们的状态都是“UP”角色中有一个是“LEADER”另外两个是“FOLLOWER”。这证明Raft集群选举成功节点间通信正常。进行功能测试服务注册在任意一个微服务中将spring.cloud.nacos.discovery.server-addr配置为192.168.1.200:80启动服务。在Nacos控制台“服务管理”中应能看到该服务。配置发布在“配置管理”中发布一个配置。然后分别直接访问三个Nacos节点的独立地址如http://192.168.1.101:8848/nacos检查配置是否都存在。这验证了数据通过Raft同步的一致性。5. 高可用保证的深层配置与优化5.1 开启鉴权与细粒度权限控制生产环境必须开启鉴权防止未授权访问。修改每个Nacos节点的application.propertiesnacos.core.auth.enabledtrue nacos.core.auth.system.typenacos # 这是一个Base64编码的密钥必须足够复杂且所有节点保持一致 nacos.core.auth.plugin.nacos.token.secret.keyVGhpc0lzQVZlcnlMb25nU2VjcmV0S2V5Rm9yTmFjb3NBdXRoS2V5MTIzNDU2Nzg5MA重启集群后登录控制台需要密码。还可以结合命名空间Namespace和配置分组Group实现环境隔离和权限划分。5.2 调整集群通信与数据同步参数在conf/application.properties中有一些关键参数影响集群性能和稳定性# 选举超时时间单位毫秒。网络不稳定时可适当调大。 nacos.core.protocol.raft.data.election_timeout_ms5000 # 心跳间隔。调小可以加快故障发现但增加网络开销。 nacos.core.protocol.raft.data.heartbeat_interval_ms2000 # 单个Raft日志文件大小默认64MB。如果配置变更极频繁可考虑调大。 nacos.core.protocol.raft.data.log_file_size64这些参数没有银弹需要根据实际网络环境和业务压力进行调整。改动任何参数前务必在测试环境充分验证。5.3 配置持久化的优化与监控MySQL优化建议为config_info等核心表建立合适的索引。定期清理历史数据Nacos会生成his_config_info配置历史等表需要定制定期清理任务或使用Nacos官方提供的清理脚本。监控MySQL连接数、慢查询。Nacos节点数增多时连接池压力会变大。Nacos JVM参数优化编辑bin/startup.sh找到JAVA_OPT配置。根据服务器内存调整例如8G内存的机器JAVA_OPT${JAVA_OPT} -Xms4g -Xmx4g -Xmn2g # 堆内存设为4G新生代2G JAVA_OPT${JAVA_OPT} -XX:MetaspaceSize256m -XX:MaxMetaspaceSize512m # 元空间 JAVA_OPT${JAVA_OPT} -XX:UseG1GC -XX:MaxGCPauseMillis200 # 使用G1垃圾回收器合理的JVM参数能有效减少Full GC避免服务注册发现出现延迟或超时。6. 常见生产问题排查与运维实录6.1 集群节点状态异常无法形成Leader现象在“节点列表”中节点状态一直为“DOWN”或始终没有LEADER选举出来。排查思路检查网络互通在三个节点上互相telnet 其他节点IP 8848检查端口是否通畅。最常见的问题就是防火墙或安全组未开放8848端口。Nacos 2.x版本还使用了7848端口用于Raft节点间RPC通信也必须开放。检查cluster.conf文件确认文件格式正确IP:PORT每行一个且IP地址与nacos.inetutils.ip-address配置完全一致。切忌使用localhost、127.0.0.1或主机名。检查日志查看logs/nacos.log搜索 “ERROR”、“vote”、“Leader” 等关键词。常见错误如Connection refused指向网络问题Invalid node address指向地址配置问题。确认启动模式确保启动命令是-m cluster而不是默认的standalone模式。6.2 客户端服务注册成功但其他服务无法发现现象服务A注册到Nacos VIP日志显示成功但服务B通过同一个VIP却找不到服务A。排查思路检查客户端配置确认服务B的namespace、group配置与服务A完全一致。不同命名空间的服务默认不可见。检查负载均衡策略如果你在Nginx中使用了ip_hash且服务A和服务B部署在同一台机器它们可能被Nginx转发到不同的Nacos后端节点。由于Nacos服务发现是客户端主动从服务端拉取列表如果客户端连接的后端节点因为Raft同步延迟尚未收到最新注册信息就会导致这个问题。临时解决方案可以尝试将Nginx的负载均衡策略改为least_conn最小连接或random随机但这不能根治。根治方案这通常指向Raft数据同步存在延迟或问题。检查Nacos集群节点日志是否有同步错误网络是否有高延迟或丢包。对于生产环境确保Nacos服务器节点位于低延迟、稳定的内网环境中至关重要。6.3 配置发布后客户端长时间未感知到变更现象在控制台修改了配置并发布但微服务需要等待几分钟甚至重启才能拿到新配置。排查思路检查客户端长轮询参数Nacos配置中心采用“长轮询”机制。检查客户端配置spring.cloud.nacos.config.refresh-enabledtrue以及spring.cloud.nacos.config.long-poll.timeout默认30000ms是否合理。网络不稳定时可以适当调小超时时间但会增加服务器压力。检查Nacos服务器端日志查看是否有处理配置监听请求的异常。检查共享MySQL压力配置信息存储在MySQL中如果MySQL性能瓶颈可能导致读写变慢影响配置同步和通知效率。监控MySQL的CPU、IO和慢查询日志。6.4 内存使用率持续升高最终OOM现象Nacos服务运行一段时间后内存占用不断增长直至崩溃。排查思路检查服务实例数Nacos会为每个注册的服务实例在内存中维护心跳和元数据。如果微服务实例数量巨大例如上千个默认的JVM堆内存可能不足。需要按实例数 * (约500KB ~ 1MB)来估算内存并相应调大JVM堆空间。检查客户端连接Nacos 2.x使用gRPC长连接每个客户端连接都会占用资源。检查是否有客户端异常未释放连接或者客户端数量过多。可以通过Nacos控制台“连接管理”查看。分析堆转储在JVM参数中添加-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/path/to/dump在OOM时生成堆转储文件使用MAT等工具分析看是什么对象占用了大量内存。启用访问日志并定期清理Nacos的访问日志可能快速增长。在application.properties中合理配置日志级别并设置日志滚动策略。7. 监控、告警与灾备演练7.1 关键监控指标一套没有监控的高可用集群是不完整的。需要监控以下核心指标监控类别具体指标告警阈值建议工具节点状态节点UP/DOWN状态、角色Leader/Follower任何节点DOWNPrometheus Grafana (通过Nacos暴露的/metrics端点)服务健康注册服务总数、健康实例数、不健康实例数不健康实例占比5%配置健康配置发布总数、监听查询QPSQPS突增或突降系统资源CPU使用率、内存使用率、JVM GC次数与时间CPU80%持续5分钟内存85%服务器基础监控数据库MySQL连接数、慢查询数、磁盘空间连接数接近最大限制MySQL监控网络与负载Nginx/VIP的请求量、延迟、错误率错误率1%延迟P991sNginx状态页或监控7.2 定期灾备演练高可用架构不能只停留在部署阶段必须定期验证。模拟节点故障在业务低峰期手动停止一个Follower节点的Nacos进程。观察控制台节点列表状态是否及时更新。客户端服务注册与发现是否受影响理论上应无感。Leader是否重新选举如果停的是Leader。模拟网络分区通过防火墙规则临时隔离一个Nacos节点与其他节点的网络。观察集群多数派是否还能正常工作被隔离的节点状态是否变为DOWN。模拟负载均衡器故障停止主Nginx/Keepalived观察VIP是否顺利漂移到备机客户端连接是否会短暂中断通常会有1-2次心跳超时但应自动恢复。通过这些演练你才能真正信任你的Nacos高可用集群并在真实故障发生时从容应对。记住架构的可靠性不仅在于设计更在于持续的验证和维护。