VictoriaMetrics 完全指南 / 14 - 备份与恢复
14 · 备份与恢复
本章目标
- 了解 VictoriaMetrics 的备份机制
- 掌握 vmbackup 的使用方法
- 掌握 vmrestore 的恢复流程
- 配置自动化备份策略
- 了解对象存储备份方案
14.1 备份机制概述
14.1.1 备份原理
VictoriaMetrics 使用**快照(Snapshot)**机制进行备份:
┌──────────────────────────────────────────────┐
│ 备份流程 │
│ │
│ 1. 创建快照 ──▶ 一致性数据副本 │
│ 2. 上传快照 ──▶ 对象存储 / 本地目录 │
│ 3. 清理快照 ──▶ 释放临时空间 │
└──────────────────────────────────────────────┘
快照创建过程:
┌──────────────┐
│ 活跃数据 │
│ (写入中) │
└──────┬───────┘
│ 触发快照
▼
┌──────────────┐
│ 冻结当前 Part│ ← 新数据写入新的 Part
│ + 内存 Flush │
│ + 元数据快照 │
└──────┬───────┘
│
▼
┌──────────────┐
│ 快照目录 │ ← 可以安全上传
│ snapshots/ │
└──────────────┘
14.1.2 备份工具
| 工具 | 功能 | 说明 |
|---|
vmbackup | 备份 | 将快照上传到远程存储 |
vmrestore | 恢复 | 从远程存储下载并恢复 |
vmbackupmanager | 自动化管理 | 企业版工具,自动管理备份生命周期 |
14.2 安装备份工具
VM_VERSION="v1.106.0"
# 下载 vmbackup
curl -LO "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/${VM_VERSION}/vmbackup-linux-amd64-${VM_VERSION}.tar.gz"
tar xzf "vmbackup-linux-amd64-${VM_VERSION}.tar.gz"
sudo mv vmbackup-prod /usr/local/bin/vmbackup
# 下载 vmrestore
curl -LO "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/${VM_VERSION}/vmrestore-linux-amd64-${VM_VERSION}.tar.gz"
tar xzf "vmrestore-linux-amd64-${VM_VERSION}.tar.gz"
sudo mv vmrestore-prod /usr/local/bin/vmrestore
# 设置权限
chmod +x /usr/local/bin/vmbackup /usr/local/bin/vmrestore
14.3 备份到本地目录
14.3.1 创建快照
# 方法 1:通过 API 创建快照
curl -X POST 'http://localhost:8428/api/v1/admin/tsdb/snapshot'
# 返回示例:
# {"status":"success","data":{"name":"20240115T120000Z_abc123"}}
# 查看快照列表
curl -s 'http://localhost:8428/api/v1/admin/tsdb/snapshots'
# 方法 2:通过信号触发
# 注意:SIGUSR1 在某些版本中触发快照
kill -SIGUSR1 $(pgrep victoria-metrics)
14.3.2 使用 vmbackup
# 备份到本地目录
vmbackup \
-storageDataPath=/var/lib/victoria-metrics/data \
-snapshot.createURL=http://localhost:8428/api/v1/admin/tsdb/snapshot \
-dst=/data/backup/victoria-metrics/$(date +%Y%m%d)
# 备份到指定快照(不创建新的)
vmbackup \
-storageDataPath=/var/lib/victoria-metrics/data \
-snapshotName=20240115T120000Z_abc123 \
-dst=/data/backup/victoria-metrics/snapshot-20240115
14.3.3 查看备份
# 查看备份目录结构
ls -la /data/backup/victoria-metrics/20240115/
# 期望结构
# ├── data/
# │ ├── big/
# │ ├── small/
# │ └── indexdb/
# ├── metadata.json
# └── partitions.json
14.4 备份到对象存储
14.4.1 S3 兼容存储(AWS S3 / MinIO)
# 环境变量配置
export AWS_ACCESS_KEY_ID=your-access-key
export AWS_SECRET_ACCESS_KEY=your-secret-key
export AWS_REGION=us-east-1
# 备份到 S3
vmbackup \
-storageDataPath=/var/lib/victoria-metrics/data \
-snapshot.createURL=http://localhost:8428/api/v1/admin/tsdb/snapshot \
-dst=s3://my-victoria-metrics-backups/$(date +%Y%m%d)/
# 备份到 MinIO
vmbackup \
-storageDataPath=/var/lib/victoria-metrics/data \
-snapshot.createURL=http://localhost:8428/api/v1/admin/tsdb/snapshot \
-dst=s3://my-bucket/backup/ \
-customS3Endpoint=http://minio:9000
14.4.2 GCS(Google Cloud Storage)
# 使用 GCP 认证
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/credentials.json
# 备份到 GCS
vmbackup \
-storageDataPath=/var/lib/victoria-metrics/data \
-snapshot.createURL=http://localhost:8428/api/v1/admin/tsdb/snapshot \
-dst=gs://my-victoria-metrics-backups/$(date +%Y%m%d)/
14.4.3 Azure Blob Storage
# 环境变量
export AZURE_STORAGE_ACCOUNT=myaccount
export AZURE_STORAGE_ACCESS_KEY=mykey
# 备份到 Azure
vmbackup \
-storageDataPath=/var/lib/victoria-metrics/data \
-snapshot.createURL=http://localhost:8428/api/v1/admin/tsdb/snapshot \
-dst=azblob://my-container/backup/$(date +%Y%m%d)/
14.5 增量备份
14.5.1 增量备份原理
第一次备份(全量):
┌──────────────┐
│ 所有 Part │ ──▶ 完整上传
└──────────────┘
后续备份(增量):
┌──────────────┐
│ 新增 Part │ ──▶ 只上传变化的 Part
│ 修改的 Part │
└──────────────┘
(已备份的 Part 不再重复上传)
14.5.2 配置增量备份
# vmbackup 自动识别增量
# 只需要指定相同的 dst 路径即可
# 第一次:全量备份
vmbackup \
-storageDataPath=/var/lib/victoria-metrics/data \
-snapshot.createURL=http://localhost:8428/api/v1/admin/tsdb/snapshot \
-dst=s3://my-bucket/vm-backup/
# 第二次:自动增量
vmbackup \
-storageDataPath=/var/lib/victoria-metrics/data \
-snapshot.createURL=http://localhost:8428/api/v1/admin/tsdb/snapshot \
-dst=s3://my-bucket/vm-backup/
14.5.3 增量备份注意事项
重要:
- 不要手动修改或删除对象存储中的备份文件
- vmbackup 会维护一个
partitions.json 文件来跟踪已备份的 Part - 如果备份目录被手动修改,可能导致恢复失败
- 建议定期做一次全量备份
14.6 恢复操作
14.6.1 从本地备份恢复
# 1. 停止 VictoriaMetrics
sudo systemctl stop victoria-metrics
# 2. 清空旧数据(可选,推荐使用新目录)
# sudo rm -rf /var/lib/victoria-metrics/data/*
# 3. 恢复数据
vmrestore \
-src=/data/backup/victoria-metrics/20240115/ \
-storageDataPath=/var/lib/victoria-metrics/data
# 4. 启动 VictoriaMetrics
sudo systemctl start victoria-metrics
# 5. 验证
curl http://localhost:8428/health
curl -s 'http://localhost:8428/api/v1/status/tsdb' | python3 -c "
import json, sys
data = json.load(sys.stdin)
print(f\"Total series: {data['data']['totalSeries']}\")
"
14.6.2 从 S3 恢复
# 停止服务
sudo systemctl stop victoria-metrics
# 从 S3 恢复
vmrestore \
-src=s3://my-victoria-metrics-backups/20240115/ \
-storageDataPath=/var/lib/victoria-metrics/data
# 启动服务
sudo systemctl start victoria-metrics
14.6.3 恢复到新实例
# 在新服务器上恢复
# 1. 安装 VictoriaMetrics
# 2. 创建数据目录
sudo mkdir -p /var/lib/victoria-metrics/data
# 3. 恢复数据
vmrestore \
-src=s3://my-bucket/vm-backup/ \
-storageDataPath=/var/lib/victoria-metrics/data
# 4. 启动
victoria-metrics \
-storageDataPath=/var/lib/victoria-metrics/data \
-retentionPeriod=90d
14.7 自动化备份脚本
14.7.1 Cron 备份脚本
#!/bin/bash
# /usr/local/bin/vm-backup.sh
set -euo pipefail
# 配置
VM_URL="http://localhost:8428"
BACKUP_DST="s3://my-bucket/vm-backups/$(date +%Y%m%d)/"
STORAGE_PATH="/var/lib/victoria-metrics/data"
LOG_FILE="/var/log/victoria-metrics/backup.log"
ALERT_EMAIL="[email protected]"
# 日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}
# 检查 VictoriaMetrics 健康状态
check_health() {
local response
response=$(curl -s -o /dev/null -w "%{http_code}" "${VM_URL}/health")
if [ "$response" != "200" ]; then
log "ERROR: VictoriaMetrics health check failed (HTTP $response)"
return 1
fi
return 0
}
# 执行备份
do_backup() {
log "Starting backup..."
log "Source: $STORAGE_PATH"
log "Destination: $BACKUP_DST"
vmbackup \
-storageDataPath="$STORAGE_PATH" \
-snapshot.createURL="${VM_URL}/api/v1/admin/tsdb/snapshot" \
-dst="$BACKUP_DST" \
-maxBytesPerSecond=100MB \
2>&1 | tee -a "$LOG_FILE"
local exit_code=${PIPESTATUS[0]}
if [ $exit_code -eq 0 ]; then
log "Backup completed successfully"
else
log "ERROR: Backup failed with exit code $exit_code"
return 1
fi
return 0
}
# 清理旧快照
cleanup_snapshots() {
log "Cleaning up old snapshots..."
curl -s "${VM_URL}/api/v1/admin/tsdb/snapshots" | \
python3 -c "
import json, sys
from datetime import datetime, timedelta
data = json.load(sys.stdin)
cutoff = datetime.utcnow() - timedelta(days=7)
for snap in data.get('data', []):
name = snap.get('name', '')
if name:
print(name)
" | while read -r snap_name; do
log "Deleting snapshot: $snap_name"
curl -s -X POST "${VM_URL}/api/v1/admin/tsdb/snapshot/delete?snapshot=${snap_name}"
done
}
# 主流程
main() {
log "=== Starting VictoriaMetrics Backup ==="
if ! check_health; then
log "ABORT: Health check failed"
exit 1
fi
if ! do_backup; then
log "ABORT: Backup failed"
exit 1
fi
cleanup_snapshots
log "=== Backup Process Complete ==="
}
main "$@"
14.7.2 Cron 任务
# 添加执行权限
chmod +x /usr/local/bin/vm-backup.sh
# 每天凌晨 2 点执行备份
echo "0 2 * * * root /usr/local/bin/vm-backup.sh" | \
sudo tee /etc/cron.d/victoria-metrics-backup
# 查看备份日志
tail -f /var/log/victoria-metrics/backup.log
14.8 备份验证
14.8.1 验证脚本
#!/bin/bash
# /usr/local/bin/vm-backup-verify.sh
set -euo pipefail
BACKUP_SRC="s3://my-bucket/vm-backups/latest/"
VERIFY_DIR="/tmp/vm-verify-$(date +%s)"
mkdir -p "$VERIFY_DIR"
echo "Restoring backup to verify..."
vmrestore \
-src="$BACKUP_SRC" \
-storageDataPath="$VERIFY_DIR"
echo "Checking data integrity..."
ls -la "$VERIFY_DIR/data/"
echo "Data restored successfully. Series count:"
# 简单检查 Part 文件是否存在
find "$VERIFY_DIR/data" -name "*.bin" | wc -l
echo "Cleanup..."
rm -rf "$VERIFY_DIR"
echo "Verification complete!"
14.8.2 定期恢复测试
最佳实践:每月至少执行一次备份恢复测试,确保备份数据可用。
14.9 集群版备份
14.9.1 各组件备份
# vmstorage 备份(每个节点独立备份)
for i in 0 1 2; do
vmbackup \
-storageDataPath=/data/vmstorage${i} \
-snapshot.createURL=http://vmstorage${i}:8482/api/v1/admin/tsdb/snapshot \
-dst=s3://my-bucket/vmstorage-backup/${i}/$(date +%Y%m%d)/ &
done
wait
# vminsert / vmselect 无状态,无需备份
# 只需备份配置文件
14.9.2 备份调度建议
| 组件 | 备份频率 | 备份内容 |
|---|
| vmstorage | 每日 | 数据快照 |
| vminsert | 不需要 | 配置文件 |
| vmselect | 不需要 | 配置文件 + 缓存(可选) |
| vmalert | 每周 | 规则文件 |
| 配置文件 | 每次变更 | 全部配置 |
14.10 灾难恢复方案
14.10.1 RTO/RPO 目标
| 级别 | RPO | RTO | 备份策略 |
|---|
| 基础 | 24 小时 | 4 小时 | 每日备份 |
| 标准 | 4 小时 | 1 小时 | 每 4 小时增量备份 |
| 高级 | 1 小时 | 15 分钟 | 持续复制 + 快照备份 |
14.10.2 灾难恢复流程
灾难恢复流程:
1. 评估损失
├── 部分节点故障 → 从副本恢复(无需备份)
└── 完全数据丢失 → 从备份恢复
2. 准备新环境
├── 新服务器 / 容器
├── 安装 VictoriaMetrics
└── 配置网络 / 防火墙
3. 恢复数据
├── vmrestore 从备份恢复
└── 验证数据完整性
4. 启动服务
├── 启动 VictoriaMetrics
├── 启动采集代理
└── 配置监控和告警
5. 验证
├── 健康检查通过
├── 查询返回数据
├── Grafana 仪表盘正常
└── 告警恢复
本章小结
| 要点 | 内容 |
|---|
| 备份原理 | 基于快照的增量备份 |
| 备份目标 | 本地目录、S3、GCS、Azure |
| 恢复流程 | 停服务 → vmrestore → 启服务 → 验证 |
| 自动化 | Cron + Shell 脚本 |
| 验证 | 定期执行恢复测试 |
扩展阅读