Nacos双机房独立部署容灾方案

3 阅读9分钟

一、方案概述

本方案针对双机房部署场景,结合“微服务不跨机房调用”的业务需求,采用“机房自治、物理隔离、故障隔离”的核心原则,部署两套完全独立的Nacos集群,每套集群对应本机房的微服务体系,彻底避免跨机房依赖,保障Nacos服务(注册中心+配置中心)的高可用,同时简化运维复杂度,降低故障扩散风险,适配业务不跨机房调用的核心诉求。

核心目标:实现单机房故障时,另一机房Nacos集群与微服务体系可独立正常运行,故障隔离无扩散,RTO(恢复时间目标)控制在5分钟内,保障服务注册与配置管理的连续性。

二、核心架构设计

2.1 整体架构

采用“双机房、双独立集群”架构,两套集群物理隔离、互不依赖,具体架构如下:

  • 机房A:1套Nacos集群(3个节点,奇数节点保障Raft协议正常选举)+ 1套独立MySQL数据库 + 内网SLB(Nginx/HAProxy)+ 机房A微服务集群
  • 机房B:1套Nacos集群(3个节点)+ 1套独立MySQL数据库 + 内网SLB(Nginx/HAProxy)+ 机房B微服务集群
  • 核心约束:微服务仅访问本机房Nacos集群,不跨机房进行服务注册、发现及调用;两套Nacos集群之间不进行任何数据同步,彻底实现故障隔离。

2.2 关键组件配置

2.2.1 Nacos集群部署(单机房内)

  • 节点要求:每个机房Nacos集群至少3个节点,采用对等节点架构,避免单点故障;节点部署在不同服务器,降低硬件故障影响。
  • 一致性协议:服务注册元数据采用Raft协议(选举Leader处理写操作,Follower同步数据并处理读请求);配置数据采用Distro协议(去中心化设计,提升读性能,支持水平扩展)。
  • 内网SLB配置:采用Nginx Stream或HAProxy做四层TCP代理,同时代理Nacos的8848端口(HTTP接口、控制台、配置拉取)和9848端口(gRPC接口,服务注册、心跳、推送),配置健康检查,自动剔除宕机节点;负载均衡策略推荐“最小连接”,适配微服务长连接场景。

2.2.2 数据存储配置(核心区分)

Nacos的配置数据与服务注册数据存储位置不同,需针对性配置,确保数据安全与隔离:

  • 配置数据:永久存储在各机房独立的MySQL数据库中(生产环境禁用内置Derby数据库),两套MySQL互不关联,物理隔离;配置namespace、group、dataId在两套集群中保持一致,通过CI/CD脚本或配置同步工具统一发布,避免手动修改导致的配置不一致。
  • 服务注册数据:默认采用临时实例(99%微服务场景适用),仅存储在Nacos节点内存中,不写入MySQL;集群内节点通过Distro协议异步同步内存数据,保障集群内数据一致;微服务通过心跳(默认30秒)保活,无心跳则自动剔除实例;Nacos节点重启后,微服务会自动重注册,无需手动干预。
  • 特殊说明:仅固定物理机、硬件设备等场景需使用持久化实例(写入MySQL),微服务场景不推荐,避免影响性能。

2.2.3 客户端配置

微服务客户端仅配置本机房Nacos集群的SLB地址,无需配置跨机房地址,确保不跨机房调用:

spring.cloud.nacos.discovery.server-addr=本机房SLBIP:8848
spring.cloud.nacos.config.server-addr=本机房SLBIP:8848
# 启用客户端本地容灾,提升故障时可用性
system.setProperty("nacos.client.failover.enabled", "true")

三、容灾核心机制

3.1 故障隔离机制

由于两套Nacos集群物理隔离、无数据同步,且微服务不跨机房调用,任一机房发生故障(如网络中断、集群崩溃、MySQL故障),均不会影响另一机房的正常运行,实现100%故障隔离。

3.2 故障应对策略

故障类型影响范围应对措施恢复时间
单Nacos节点宕机(机房内)机房内部分请求失败SLB自动剔除宕机节点,Raft协议重新选举Leader,Follower接管服务;微服务心跳自动切换至健康节点<30秒,业务无感知
机房内MySQL故障该机房Nacos配置写操作失败,读操作正常(依赖内存缓存)切换至MySQL从库(提前部署主从架构),更新Nacos数据库连接配置;配置回滚可通过Nacos历史版本实现1-5分钟,读服务不受影响
整个机房故障(如网络中断、集群崩溃)该机房所有Nacos及微服务不可用通过网关/DNS将流量切换至备用机房,备用机房Nacos集群与微服务独立运行,无需额外配置调整3-5分钟,业务短暂波动
Nacos集群整体崩溃(单机房)该机房微服务无法注册、发现服务重新部署Nacos集群,连接本机房MySQL恢复配置数据;微服务自动重注册至新集群10-30分钟,需提前演练部署流程

3.3 备份与恢复策略

3.3.1 配置数据备份

  • MySQL备份:每个机房的MySQL采用“每日全量+增量备份”策略,备份文件上传至本地或对象存储,保留周期至少7天,重要环境保留30天。
  • 配置版本管理:利用Nacos内置版本记录功能(支持100个版本),关键配置永久保留历史版本,便于快速回滚错误配置。

3.3.2 服务注册数据恢复

服务注册数据默认存储在内存,无需额外备份;Nacos集群重启或恢复后,微服务会通过自动重注册机制,快速恢复服务列表,无需手动干预。

3.3.3 集群恢复流程

  1. MySQL故障恢复:切换至从库,更新Nacos数据库连接,重启Nacos节点即可同步数据。
  2. Nacos集群崩溃恢复:重新部署3节点集群,配置MySQL连接,启动后微服务自动重注册,配置数据从MySQL同步。
  3. 机房故障恢复:故障机房修复后,重新启动Nacos集群与微服务,通过配置同步工具同步最新配置,恢复正常流量。

四、流量切换策略

结合“微服务不跨机房调用”的需求,采用两种流量切换模式,适配不同业务场景:

4.1 主备模式(推荐)

  • 正常状态:所有业务流量均指向主机房(如机房A),备用机房(机房B)处于待命状态,微服务正常运行但无流量。
  • 故障切换:主机房发生故障时,通过网关/DNS快速将流量切换至备用机房,备用机房直接接管业务,无需修改Nacos及微服务配置。

4.2 双活模式

  • 正常状态:两个机房同时运行业务流量,按用户、区域或业务模块分流,各自使用本机房的Nacos集群。
  • 故障切换:任一机房故障时,停止该机房流量,将对应业务流量切换至另一机房,实现业务无中断。

五、生产环境运维注意事项

  1. 集群配置规范:每个机房Nacos集群节点数≥3,禁用内置Derby数据库,配置MySQL主从架构;SLB需启用健康检查,及时剔除异常节点。
  2. 配置同步管理:两套Nacos集群的配置需保持一致,通过CI/CD脚本或配置同步工具统一发布,禁止手动分别修改,避免配置不一致导致业务异常。
  3. 监控告警配置:实时监控Nacos集群状态(节点健康、内存使用率)、MySQL运行状态(连接数、备份完整性)、SLB转发状态,设置告警阈值,提前预警潜在故障。
  4. 故障演练:定期(每月)演练故障切换流程(如单节点宕机、MySQL故障、机房切换),确保恢复机制有效,缩短故障恢复时间。
  5. 客户端优化:微服务启用本地容灾机制,配置连接超时和重试策略;定期检查客户端与Nacos的连接状态,避免连接泄露。
  6. 安全配置:开启Nacos鉴权功能,设置自定义密钥,防止未授权访问;限制SLB访问权限,仅允许本机房微服务访问。

六、方案优势与适配性

6.1 核心优势

  • 故障隔离彻底:两套集群物理隔离,无跨机房依赖,任一机房故障不影响另一机房,风险可控。
  • 运维简单:无需配置跨机房数据同步,无需处理跨机房一致性问题,降低运维复杂度和出错概率。
  • 性能优异:服务注册数据存储在内存,结合Distro协议,支撑高并发注册与心跳;无跨机房网络延迟影响。
  • 可落地性强:贴合“微服务不跨机房调用”的业务场景,无需修改业务代码,仅需调整部署与配置。

6.2 适配场景

本方案适用于“双机房部署、微服务不跨机房调用”的所有场景,尤其适合对故障隔离要求高、运维资源有限、追求高可用且简化架构的企业,可直接落地执行。

七、总结

本方案以“机房自治、物理隔离”为核心,通过双机房独立Nacos集群部署,结合Nacos存储机制特性,完美适配“微服务不跨机房调用”的需求,实现了Nacos服务的高可用容灾。方案既避免了跨机房部署的复杂性和风险,又保障了故障时的业务连续性,同时简化运维,是该场景下最优的Nacos容灾解决方案。建议根据业务规模,完善MySQL主从架构、监控告警和故障演练流程,进一步提升容灾能力。