9.10.7 故障演练与应急响应

故障演练与应急响应围绕 Nacos 可用性与服务治理稳定性展开,目标是验证架构韧性、提升故障发现与恢复效率、降低配置与注册中心异常对业务的影响。

原理草图:故障注入—监控—处置闭环

flowchart LR
A[客户端] -->|心跳/拉取| B[Nacos集群]
B --> C[(MySQL)]
B --> D[监控/告警]
D --> E[应急指挥]
E --> F[处置脚本/回滚]
F --> B

演练目标与范围
- 验证注册发现、配置管理、持久化、集群选主在故障下的可用性。
- 覆盖网络抖动、节点宕机、存储异常、配置误操作、权限异常、客户端异常。
- 明确 RTO/RPO 与 SLA 阈值,建立演练基线与验收标准。

演练场景与实施示例(含命令)

1) 节点故障演练:单节点宕机
目标:验证集群容错与客户端自动切换
前置:3 节点集群,开启健康检查与监控

  • 故障注入
# 在 nacos-node-1 上停止服务
sudo systemctl stop nacos
# 期望:客户端能在 30s 内切换到其他节点
  • 观测验证
# 观察集群健康(示例接口/页面)
curl -s http://nacos-node-2:8848/nacos/v1/ns/operator/metrics | head -n 20
# 期望:healthyInstanceCount 不下降为 0,心跳成功率保持 >99%
  • 排错要点
  • 若客户端大量断连,检查客户端配置的 server-addr 是否包含多节点;
  • 检查 nacos-client 日志中是否反复重试同一节点。

2) 网络抖动演练:客户端与 Nacos 间高延迟
目标:验证超时与重试策略
- 故障注入(Linux tc)

# 在客户端机器上模拟 300ms 延迟与 2% 丢包
sudo tc qdisc add dev eth0 root netem delay 300ms loss 2%
# 恢复
sudo tc qdisc del dev eth0 root netem
  • 观测验证
  • 监控配置推送耗时、心跳成功率、客户端重试次数。

3) 存储故障演练:数据库连接池耗尽
目标:验证 Nacos 持久化异常处理
- 故障注入(限制 MySQL 连接数)

# MySQL 侧临时调整连接数(需要权限)
mysql -uroot -p -e "SET GLOBAL max_connections=50;"
  • 观测验证
  • Nacos 日志出现获取连接超时;
  • 服务注册/配置发布失败率上升。
  • 应急处置
  • 临时提升连接池、排查慢查询与锁等待。

4) 配置误操作演练:错误配置下发
目标:验证灰度与回滚机制
- 演练步骤(示例配置)

# 错误配置(模拟上线)
# dataId: app.yaml
app:
  feature_x: "true"
  timeout_ms: 5   # 过低导致超时

# 回滚配置(恢复)
app:
  feature_x: "false"
  timeout_ms: 2000
  • 观测验证
  • 配置推送耗时、客户端错误日志是否增加。
  • 回滚命令(示例,使用 nacos-cli)
# 发布回滚配置(示例命令)
nacos-cli config publish \
  --serverAddr=127.0.0.1:8848 \
  --dataId=app.yaml --group=DEFAULT_GROUP \
  --type=yaml --content="$(cat /opt/conf/app-rollback.yaml)"

5) 权限异常演练:token 过期
目标:验证认证失败告警与恢复流程
- 故障注入
- 手动更换服务端 token 或密钥,导致客户端鉴权失败。
- 排错要点
- 客户端日志出现 403/401;
- 检查 nacos.auth.system.type 与 jwt.secret。

演练实施流程(可直接执行)
1. 预演准备:冻结变更窗口、备份数据、确认回滚脚本与告警接入。
2. 故障注入:按场景控制注入,记录注入时间与影响面。
3. 观察验证:监控指标、日志、告警是否准确触发。
4. 应急处置:隔离、切换、回滚与降级。
5. 复盘总结:输出影响评估、恢复时长与修复措施。

应急响应分级与职责
- P0:核心业务不可用,立即启动应急指挥,负责人到场处理。
- P1:关键功能异常,30 分钟内完成定位与缓解。
- P2:非核心异常,4 小时内恢复。
- 明确指挥、执行、沟通、回滚、验证角色与备份人选。

关键恢复手段(含脚本示例)

  • 集群侧:故障节点摘除与恢复
# 将节点从负载均衡中摘除(示例:Nginx upstream)
sed -i 's/server nacos-node-1:8848;/# &/g' /etc/nginx/conf.d/nacos_upstream.conf
nginx -s reload
# 期望:请求不再打到故障节点
  • 存储侧:慢查询排查
# 查看慢查询
mysql -uroot -p -e "SHOW VARIABLES LIKE 'slow_query%';"
mysql -uroot -p -e "SHOW GLOBAL STATUS LIKE 'Slow_queries';"
# 期望:慢查询数量可控,耗时 SQL 可定位
  • 配置侧:配置快照恢复(本地备份示例)
# 备份配置文件(客户端缓存)
cp -a /opt/nacos/config-cache /opt/backup/config-cache-$(date +%F)
# 期望:客户端可在服务端异常时使用本地缓存
  • 客户端侧:降级与本地配置
# 启用本地配置兜底(示例:application.yml)
spring:
  cloud:
    nacos:
      config:
        enabled: true
        refresh-enabled: true
        # 本地文件兜底路径
        file-extension: yaml

监控与告警(关键指标与阈值示例)
- 请求延迟 p95 < 200ms
- 心跳成功率 > 99.5%
- 配置推送耗时 p95 < 1s
- DB 连接池使用率 < 80%

排错清单(常用命令)

# Nacos 服务状态
systemctl status nacos

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

# Nacos 日志定位
tail -n 200 /opt/nacos/logs/nacos.log
grep -n "ERROR" /opt/nacos/logs/nacos.log | tail -n 20

练习(可重复执行)
1) 通过 tc 注入 200ms 延迟,记录心跳成功率变化,恢复后观察指标回落。
2) 停止单节点服务,验证客户端是否自动切换;恢复后观察健康实例数。
3) 发布错误配置并回滚,记录推送耗时与业务错误日志数量。

演练输出与持续改进
- 输出应急手册、演练记录、指标对比与改进计划。
- 定期评估预案有效性,完善自动化演练与故障注入机制。
- 形成标准化应急流程模板,纳入日常运维与变更管理。