9.10.2 高可用与容灾设计

高可用与容灾设计应聚焦“无单点、快速恢复、数据一致性与可观测”。Nacos作为配置中心与注册中心,其可用性直接影响服务发现与配置下发,生产环境应采用多节点集群、数据库高可用与跨机房容灾,并通过监控与演练保障可用性。

原理与架构草图(典型双机房)

文章图片

1. 集群高可用架构(含安装与入口)
- 多节点集群:至少3节点,确保多数派与故障自动转移。
- 入口负载均衡:L4/L7 入口健康检查,异常自动摘除。
- 无状态与有状态分离:Nacos无状态,数据在外部DB。

安装与启动示例(3节点,Linux)

# 1) 准备JDK与目录
sudo yum -y install java-1.8.0-openjdk
mkdir -p /opt/nacos && cd /opt/nacos
tar -xf nacos-server-2.2.3.tar.gz

# 2) 修改每个节点的application.properties(/opt/nacos/nacos/conf)
# DB改为外置高可用MySQL
sed -i 's/^spring.datasource.platform=.*/spring.datasource.platform=mysql/' /opt/nacos/nacos/conf/application.properties
cat >> /opt/nacos/nacos/conf/application.properties <<'EOF'
db.num=1
db.url.0=jdbc:mysql://10.0.0.10:3306/nacos_config?useSSL=false&serverTimezone=Asia/Shanghai
db.user=nacos
db.password=YourPass
EOF

# 3) 设置集群节点列表(/opt/nacos/nacos/conf/cluster.conf)
cat > /opt/nacos/nacos/conf/cluster.conf <<'EOF'
10.0.0.11:8848
10.0.0.12:8848
10.0.0.13:8848
EOF

# 4) 生产模式启动
cd /opt/nacos/nacos/bin
bash startup.sh -m cluster

负载均衡入口示例(HAProxy)

# /etc/haproxy/haproxy.cfg
global
  maxconn 20000
defaults
  mode http
  timeout connect 5s
  timeout client  30s
  timeout server  30s

frontend nacos_front
  bind *:8848
  default_backend nacos_back

backend nacos_back
  balance roundrobin
  option httpchk GET /nacos/actuator/health
  server nacos1 10.0.0.11:8848 check
  server nacos2 10.0.0.12:8848 check
  server nacos3 10.0.0.13:8848 check

预期效果:任一节点宕机,HAProxy健康检查摘除,服务继续可用。


2. 数据库高可用与一致性(含备份)
- MySQL高可用:主从或MGR,避免单点。
- 读写一致性:Nacos以主库写为主,读写分离需谨慎。
- 备份与恢复:全量+增量,定期演练。

MySQL主从健康检查(示例)

# 查看主库复制状态
mysql -uroot -p -e "SHOW MASTER STATUS\G"

# 从库查看复制延迟
mysql -uroot -p -e "SHOW SLAVE STATUS\G" | egrep "Seconds_Behind_Master|Slave_IO_Running|Slave_SQL_Running"

备份示例(全量+校验)

# 全量备份
mysqldump -uroot -p nacos_config > /backup/nacos_config_$(date +%F).sql

# 校验可用性(导入到临时库)
mysql -uroot -p -e "CREATE DATABASE nacos_config_restore;"
mysql -uroot -p nacos_config_restore < /backup/nacos_config_2024-01-01.sql

3. 跨机房与容灾(切换演练)
- 同城双活:跨机房Nacos集群,数据库主备/双活。
- 异地容灾:冷备集群定期同步配置与数据库备份。
- 流量调度:DNS或全局调度控制流量切换。

DNS切换演练(示例)

# 记录当前健康机房
dig +short nacos.example.com

# 模拟切换:将DNS指向机房B入口
#(具体操作取决于DNS服务商或bind配置)

4. 节点故障与自动恢复(含命令)
- 健康检查:节点/数据库探针,异常自动摘除。
- 自动扩缩容:资源或请求量触发。
- 故障隔离:避免级联。

节点故障定位命令

# 查看Nacos进程与端口
ps -ef | grep nacos
ss -lntp | grep 8848

# 查看Nacos日志
tail -n 200 /opt/nacos/nacos/logs/nacos.log
tail -n 200 /opt/nacos/nacos/logs/cluster.log

5. 配置与服务降级(含示例)
- 本地缓存兜底:客户端缓存保证配置不可用时启动。
- 超时重试:避免瞬时故障导致注册异常。
- 限流熔断:入口或客户端层面保护。

Nacos客户端降级示例(Spring Cloud)

# application.yml
spring:
  cloud:
    nacos:
      config:
        server-addr: nacos.example.com:8848
        namespace: prod
        timeout: 3000
        maxRetry: 3
        refresh-enabled: true

6. 监控与告警(含指标示例)
- 关键指标:存活节点数、请求成功率、响应时间、DB延迟。
- 告警联动:异常阈值触发自动化。

HTTP健康检查与指标验证

# 节点健康状态
curl -s http://10.0.0.11:8848/nacos/actuator/health

# 统计请求延迟(简单方式)
time curl -s http://nacos.example.com:8848/nacos/actuator/health

7. 典型推荐架构
- 单机房:3~5节点Nacos + MySQL高可用 + 统一负载均衡
- 双机房:两地Nacos集群 + 数据库主备/双活 + DNS/全局调度
- 异地灾备:主集群 + 冷备集群 + 定期备份与切换预案


排错清单(最小闭环)
1. 服务不可达:检查LB健康检查、Nacos进程与端口。
2. 注册/配置异常:检查DB连接与主从延迟。
3. 节点不加入集群:检查cluster.conf、防火墙与端口互通。

排错命令示例

# 网络连通性
ping 10.0.0.12
telnet 10.0.0.12 8848

# 防火墙规则
sudo firewall-cmd --list-ports

# Nacos集群节点列表
curl -s "http://10.0.0.11:8848/nacos/v1/ns/operator/servers"

练习
1. 搭建3节点Nacos集群并通过HAProxy访问,模拟宕机验证自动摘除。
2. 搭建MySQL主从并测试复制延迟对Nacos配置读取的影响。
3. 编写脚本每天备份nacos_config并进行恢复演练。