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,观察客户端重连耗时变化并记录。