9.8.5 灾备与恢复演练

灾备与恢复演练面向配置中心与注册中心双角色,目标是验证在节点故障、数据损坏、网络隔离等场景下的可恢复性与业务连续性。需明确演练范围(单机、集群、跨机房)、RPO/RTO指标、演练频次与审批流程,并基于真实生产拓扑搭建演练环境或使用低峰时间窗口开展。

原理草图(数据、服务、访问三条链路):

文章图片

演练准备与环境搭建(示例)#

1)确认Nacos与MySQL版本、备份目录与权限。
2)准备演练脚本与回滚方案。
3)建立监控基线(成功率、延时、失败率)。

示例:Nacos集群使用外部MySQL,备份目录与权限准备

# 目录准备
sudo mkdir -p /data/nacos/backups
sudo chown -R nacos:nacos /data/nacos

# 校验MySQL连接
mysql -h 10.0.0.10 -u nacos -p'Passw0rd' -e "SELECT 1;"

示例:Nacos数据库全量备份与校验

# 全量备份
mysqldump -h 10.0.0.10 -u nacos -p'Passw0rd' nacos_config \
  --single-transaction --routines --triggers \
  > /data/nacos/backups/nacos_full_$(date +%F).sql

# 计算校验和并记录
sha256sum /data/nacos/backups/nacos_full_$(date +%F).sql \
  | tee /data/nacos/backups/nacos_full_$(date +%F).sha256

示例:配置MySQL增量备份(binlog)并标记时间点

# 查询当前binlog位置
mysql -h 10.0.0.10 -u nacos -p'Passw0rd' -e "SHOW MASTER STATUS\G"

# 增量备份提取(演练时指定起止位置)
mysqlbinlog --start-position=4 --stop-position=123456 \
  /var/lib/mysql/mysql-bin.000123 \
  > /data/nacos/backups/nacos_inc_$(date +%F_%H%M).sql

演练步骤(准备-切换-恢复-复盘)#

1)准备阶段#

  • 备份校验、监控基线记录、故障注入脚本与回滚方案确认。

监控基线采集示例(HTTP探测配置与服务注册)

# 探测Nacos健康接口
curl -s http://10.0.0.21:8848/nacos/actuator/health | jq .

# 验证配置读取(示例配置 dataId=test.yaml)
curl -s "http://10.0.0.21:8848/nacos/v1/cs/configs?dataId=test.yaml&group=DEFAULT_GROUP&tenant="

2)切换阶段(故障注入示例)#

场景A:节点宕机(单节点)

# 关闭节点服务(systemd)
sudo systemctl stop nacos

# 预期效果:客户端应切换到其他节点,注册列表保持可用

场景B:网络隔离(模拟网络分区)

# 使用iptables阻断节点与MySQL通信
sudo iptables -A OUTPUT -p tcp -d 10.0.0.10 --dport 3306 -j REJECT
sudo iptables -A INPUT  -p tcp -s 10.0.0.10 --sport 3306 -j REJECT

# 预期效果:节点出现读写失败告警,集群应剔除异常节点

场景C:磁盘满(影响快照/日志)

# 创建大文件占满目录(注意在演练环境进行)
fallocate -l 5G /data/nacos/logs/fill.disk
df -h /data/nacos/logs

# 预期效果:日志写入失败,触发告警;服务可能降级

3)恢复阶段(回放、重建、验证)#

示例:恢复数据到指定时间点

# 1. 恢复全量
mysql -h 10.0.0.10 -u nacos -p'Passw0rd' nacos_config \
  < /data/nacos/backups/nacos_full_2024-01-01.sql

# 2. 回放增量(binlog)
mysql -h 10.0.0.10 -u nacos -p'Passw0rd' nacos_config \
  < /data/nacos/backups/nacos_inc_2024-01-01_1030.sql

示例:重建节点并重新加入集群

# 修改配置指向可用数据库与集群节点列表
sed -i 's/10.0.0.10/10.0.0.11/g' /opt/nacos/conf/application.properties
sed -i 's/nacos.inetutils.preferred-networks=.*/nacos.inetutils.preferred-networks=10.0.0./' \
  /opt/nacos/conf/application.properties

# 启动Nacos
sudo systemctl start nacos

验证一致性与注册发现:

# 检查服务列表
curl -s "http://10.0.0.22:8848/nacos/v1/ns/service/list?pageNo=1&pageSize=10&namespaceId=" | jq .

# 检查某服务实例
curl -s "http://10.0.0.22:8848/nacos/v1/ns/instance/list?serviceName=order-service&namespaceId=" | jq .

4)复盘阶段(指标与行动项)#

建议量化指标:
- RPO/RTO是否达标
- 配置一致性成功率
- 客户端重连平均耗时
- 告警到响应时延

记录示例模板(Markdown):

- 演练日期:2024-01-01
- 故障类型:网络分区
- RPO:0 min
- RTO:3 min
- 问题清单:
  1. 告警未触发(原因:阈值设置过高)
  2. 客户端重连慢(原因:DNS TTL过长)
- 改进项:
  1. 调整告警阈值
  2. 降低DNS TTL到30s

常见故障与排错示例#

1)数据库不可用导致配置读取失败
排查:

# 检查MySQL连通性
nc -zv 10.0.0.10 3306

# 检查Nacos日志
tail -f /opt/nacos/logs/nacos.log | grep -i "SQLException"

修复:切换数据库或恢复网络,重启Nacos节点。

2)网络分区导致脑裂
排查:

# 检查集群成员状态
curl -s "http://10.0.0.21:8848/nacos/v1/ns/operator/servers" | jq .

# 检查RAFT/一致性异常日志
grep -i "leader" /opt/nacos/logs/nacos.log | tail -n 20

修复:恢复网络,必要时下线异常节点并重新加入。

3)磁盘满导致快照失败
排查:

df -h /data/nacos
grep -i "snapshot" /opt/nacos/logs/nacos.log | tail -n 20

修复:清理旧日志或扩容磁盘,重启服务。

命令解释要点(简明)#

  • mysqldump --single-transaction:保持一致性备份,避免锁表
  • mysqlbinlog:按位置回放增量数据
  • iptables REJECT:模拟网络不可达
  • curl /nacos/v1/ns/service/list:验证服务注册情况

练习题#

1)模拟单节点宕机并完成服务注册一致性验证,给出RTO统计。
2)执行一次“全量+增量”恢复,验证指定配置项是否回滚到目标时间点。
3)在演练环境中将DNS TTL从300s改为30s,观察客户端重连耗时变化并记录。