17.8.5 数据备份、恢复与容灾演练

本节聚焦 Prometheus 高可用与长期存储场景下的数据备份、恢复与容灾演练,目标是在多副本与远端存储并存的体系中实现可验证、可重复的恢复能力,并确保告警与数据链路在故障中可控。

原理草图(备份/恢复链路)#

文章图片

备份对象与范围界定#

  1. Prometheus 本地数据:TSDB 目录(blocks、wal、chunks)、配置文件、规则文件与告警规则。
  2. 远端存储:Thanos/Cortex/VictoriaMetrics 的对象存储(S3/OSS/MinIO)与索引元数据。
  3. 告警与通知链路:Alertmanager 配置与静默规则、Webhook 目标端配置。
  4. Grafana 侧数据:仪表盘、数据源、告警策略(如启用)。
  5. 依赖组件:服务发现配置、证书、密钥、访问控制策略。

备份策略与实施(含安装、示例与命令解释)#

1) 安装备份工具(MinIO/S3 兼容)#

# 以 Linux 安装 mc (MinIO Client) 为例
curl -O https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/mc

# 配置对象存储别名(示例为 MinIO)
mc alias set minio http://minio.example.com:9000 minioadmin minioadmin
# 解释:alias set 用于保存访问端点与凭证

2) Prometheus TSDB 快照备份(推荐)#

Prometheus 提供 /-/snapshot 接口生成一致性快照,避免直接复制 WAL。

# 触发快照(Prometheus 开启 --web.enable-admin-api)
curl -XPOST http://prom.example.com:9090/-/snapshot
# 预期效果:TSDB 目录下生成 snapshots/2024-xx-xx... 的快照目录
# 示例目录结构
ls /var/lib/prometheus/snapshots
# 2024-07-01T02-00-00Z
# 打包并上传到对象存储
SNAP=/var/lib/prometheus/snapshots/2024-07-01T02-00-00Z
tar -czf /tmp/prom_snap_2024-07-01.tar.gz -C "$SNAP" .
mc cp /tmp/prom_snap_2024-07-01.tar.gz minio/backup/prometheus/
# 解释:mc cp 将快照包上传至对象存储备份桶

3) 远端存储备份(Thanos/Cortex/VM)#

以 Thanos + S3 为例,使用对象存储版本控制/生命周期策略。

# 启用桶版本控制(示例:MinIO)
mc version enable minio/thanos-bucket
# 解释:启用版本控制防误删
# 备份索引与元数据(可按前缀)
mc mirror minio/thanos-bucket minio/backup/thanos-bucket
# 解释:mirror 将桶中对象镜像到备份桶

4) Alertmanager 备份#

# 导出 Alertmanager 配置
cp /etc/alertmanager/alertmanager.yml /backup/alertmanager/
# 导出静默规则(v0.27+ 提供 API)
curl -s http://am.example.com:9093/api/v2/silences > /backup/alertmanager/silences.json
# 解释:silences.json 用于恢复静默规则

5) Grafana 备份#

# 备份 Grafana 数据库(SQLite示例)
cp /var/lib/grafana/grafana.db /backup/grafana/grafana.db

# 导出 Dashboard JSON(示例调用 API)
curl -s -H "Authorization: Bearer $GRAFANA_TOKEN" \
  http://grafana.example.com/api/search?type=dash-db > /backup/grafana/dash_list.json
# 解释:获取面板列表,后续逐个导出

恢复流程设计(含示例与验证)#

1) 恢复 Prometheus 本地数据#

# 停止 Prometheus
systemctl stop prometheus

# 清理旧数据(谨慎操作)
rm -rf /var/lib/prometheus/*

# 解包快照到 TSDB 目录
tar -xzf /backup/prom_snap_2024-07-01.tar.gz -C /var/lib/prometheus

# 启动 Prometheus
systemctl start prometheus

一致性校验示例:

# 查询一个固定时间范围的样本数量
curl -G 'http://prom.example.com:9090/api/v1/query_range' \
  --data-urlencode 'query=up' \
  --data-urlencode 'start=1719792000' \
  --data-urlencode 'end=1719795600' \
  --data-urlencode 'step=60'
# 解释:检查恢复后查询是否正常返回数据

2) 远端存储恢复#

# 将备份桶镜像回目标桶
mc mirror minio/backup/thanos-bucket minio/thanos-bucket
# 解释:恢复对象存储数据块与索引
# 重启 Thanos Store Gateway 以重新加载索引
kubectl rollout restart deploy/thanos-store -n monitoring
# 解释:触发重新加载元数据

3) 告警链路恢复#

# 恢复 Alertmanager 配置
cp /backup/alertmanager/alertmanager.yml /etc/alertmanager/alertmanager.yml
systemctl restart alertmanager
# 恢复静默规则
curl -XPOST -H "Content-Type: application/json" \
  --data @/backup/alertmanager/silences.json \
  http://am.example.com:9093/api/v2/silences

4) Grafana 恢复#

# 恢复数据库并重启
cp /backup/grafana/grafana.db /var/lib/grafana/grafana.db
systemctl restart grafana-server

容灾演练方案(步骤化示例)#

1) 单点故障演练(Prometheus 主实例)#

# 模拟主实例宕机
systemctl stop prometheus-main

# 验证备副本是否正常采集(查询任意 target)
curl -s http://prom-b.example.com:9090/api/v1/targets | grep -E '"health":"up"'

2) 对象存储不可用演练#

# 临时阻断对象存储访问(示例 iptables)
iptables -A OUTPUT -d 10.0.0.50 -j REJECT
# 解释:模拟对象存储断联
# 验证查询是否降级(如本地仍可查询近实时)
curl -G 'http://prom.example.com:9090/api/v1/query' \
  --data-urlencode 'query=rate(node_cpu_seconds_total[5m])'

3) 全链路演练#

# 触发测试告警(pushgateway 或自定义规则)
curl -XPOST http://pushgateway:9091/metrics/job/test \
  --data-binary $'test_alert 1'
# 解释:触发告警以验证告警链路

关键校验指标与命令#

  • 数据完整性
# 统计 block 数量
find /var/lib/prometheus -maxdepth 1 -type d -name "01*" | wc -l
  • 告警一致性
# 检查 Alertmanager 接收告警数
curl -s http://am.example.com:9093/api/v2/alerts | jq length
  • 性能影响
# 观察 IO/CPU 峰值
iostat -xm 1 5
top -b -n1 | head -20

典型故障与排错清单#

  1. 恢复后 Prometheus 无法启动
    - 排查命令:
    bash journalctl -u prometheus -n 100 --no-pager promtool check tsdb /var/lib/prometheus
    - 常见原因:快照不完整、目录权限错误。
  2. 查询无数据
    - 排查命令:
    bash promtool tsdb analyze /var/lib/prometheus | head -50 curl -s http://prom.example.com:9090/api/v1/targets
  3. 远端存储查询异常
    - 排查命令:
    bash kubectl logs deploy/thanos-store -n monitoring | tail -100 mc ls minio/thanos-bucket | head

练习题(含目标与验收)#

  1. 练习一:快照备份与恢复
    - 目标:完成 Prometheus 快照备份并恢复到新目录。
    - 验收:up 查询返回与原集群一致的时间范围数据。
  2. 练习二:对象存储镜像恢复
    - 目标:将 Thanos 桶从备份桶镜像回生产桶。
    - 验收:Thanos Query 可检索到 7 天历史数据。
  3. 练习三:告警链路演练
    - 目标:触发测试告警,验证 Alertmanager 路由与静默规则恢复。
    - 验收:通知渠道收到一次告警且静默规则可生效。

建议实践#

  • 演练频率:至少季度级全链路演练,月度单点演练。
  • 自动化:将备份、恢复、校验流程编排进 CI/CD 或运维平台。
  • 记录与复盘:每次演练记录 RPO/RTO、故障点与改进项,形成闭环。

本节完成后,应具备在高可用与长期存储场景下的可靠备份体系、可验证的恢复流程以及可执行的容灾演练方案。