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并进行恢复演练。