强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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 增量备份注意事项

重要

  1. 不要手动修改或删除对象存储中的备份文件
  2. vmbackup 会维护一个 partitions.json 文件来跟踪已备份的 Part
  3. 如果备份目录被手动修改,可能导致恢复失败
  4. 建议定期做一次全量备份

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="ops@example.com"

# 日志函数
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 目标

级别RPORTO备份策略
基础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 脚本
验证定期执行恢复测试

扩展阅读