第十三章:备份恢复

学习 MinIO 数据备份和恢复策略,包括本地备份、跨集群复制和灾难恢复方案。

最后更新: 2024-01-15
页面目录

第十三章:备份恢复

13.1 备份策略概述

13.1.1 备份类型

类型 说明 RPO RTO
全量备份 备份所有数据 24h 数小时
增量备份 备份新增数据 1h 数分钟
实时复制 实时同步 <1min <1min
快照 存储快照 <1min 分钟级

13.1.2 备份架构

┌─────────────────────────────────────────────────────────┐
│                    备份策略架构                           │
├─────────────────────────────────────────────────────────┤
│                                                          │
│  ┌───────────────┐                                      │
│  │  MinIO Cluster│  Primary                             │
│  │  (生产环境)    │                                      │
│  └───────┬───────┘                                      │
│          │                                               │
│          ├──► 本地快照                                   │
│          │                                               │
│          ├──► 定时备份                                   │
│          │                                               │
│          └──► 实时复制 ──────────────────────────────►   │
│                                      ┌───────────────┐   │
│                                      │  MinIO Cluster│   │
│                                      │  (灾备环境)    │   │
│                                      └───────────────┘   │
└─────────────────────────────────────────────────────────┘

13.2 mc mirror 备份

13.2.1 基本备份

# 备份单个存储桶
mc mirror myminio/production /backup/minio/production

# 备份所有存储桶
mc mirror myminio/ /backup/minio/

# 查看差异
mc diff myminio/production /backup/minio/production

# 示例输出
# upload:   file1.txt -> file1.txt (different size)
# missing:  file2.txt
# extra:    /backup/minio/production/file3.txt

13.2.2 增量备份脚本

#!/bin/bash
# incremental_backup.sh

MINIO_ALIAS="myminio"
BUCKET="production"
BACKUP_DIR="/backup/minio/${BUCKET}-$(date +%Y%m%d)"
LOG_FILE="/var/log/minio-backup.log"

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}

# 创建备份目录
mkdir -p $BACKUP_DIR

# 执行备份
log "Starting backup of ${MINIO_ALIAS}/${BUCKET}"
mc mirror --overwrite --remove $MINIO_ALIAS/$BUCKET $BACKUP_DIR
log "Backup completed: $BACKUP_DIR"

# 清理旧备份(保留 7 天)
find /backup/minio -type d -mtime +7 -exec rm -rf {} \; 2>/dev/null
log "Old backups cleaned"

13.3 版本控制备份

13.3.1 备份所有版本

# 列出所有版本
mc ls --versions myminio/production/

# 下载所有版本
mc cp --recursive --versions myminio/production/ /backup/minio/production/

# 恢复特定版本
mc cp --version-id <version-id> myminio/production/file.txt /restore/

13.3.2 版本化备份策略

#!/bin/bash
# versioned_backup.sh

# 备份保留版本历史
mc mirror --versions \
  --overwrite \
  myminio/versioned-bucket \
  /backup/minio/versioned-bucket-$(date +%Y%m%d)/

13.4 跨集群复制

13.4.1 配置复制

# 创建目标集群别名
mc alias set backup-minio http://backup-server:9000 admin password123

# 创建复制规则
mc replicate add myminio/production \
  --remote-bucket http://admin:password123@backup-minio:9000/backup-production \
  --replicate "delete,delete-marker"

# 查看复制状态
mc replicate status myminio/production

# 列出所有复制规则
mc replicate ls myminio/production

13.4.2 完整复制配置

# 配置带目标的复制
mc replicate add myminio/production \
  --remote-bucket http://user:pass@backup-minio:9000/backup \
  --replicate "delete,delete-marker,metadata"

# 禁用复制规则
mc replicate edit myminio/production --id RULE_ID --disable

# 删除复制规则
mc replicate rm myminio/production --id RULE_ID

13.5 存储快照

13.5.1 ZFS 快照

# 创建 ZFS 快照
zfs snapshot storagepool/minio@backup-$(date +%Y%m%d)

# 查看快照
zfs list -t snapshot

# 恢复快照
zfs rollback storagepool/minio@backup-20240115

# 克隆快照
zfs clone storagepool/minio@backup-20240115 storagepool/minio-restore

13.5.2 LVM 快照

# 创建 LVM 快照
lvcreate --size 10G --snapshot --name minio-snap /dev/vg00/lv_minio

# 挂载快照
mount /dev/vg00/minio-snap /mnt/snapshot

# 恢复数据
rsync -av /mnt/snapshot/minio-data/ /restore/

# 删除快照
lvremove /dev/vg00/minio-snap

13.6 灾难恢复

13.6.1 恢复计划

灾难恢复流程
┌─────────────────────────────────────────────────────────┐
│  1. 发现故障                                            │
│      │                                                 │
│      ▼                                                 │
│  2. 评估影响                                            │
│      │                                                 │
│      ▼                                                 │
│  3. 启动灾备环境                                        │
│      │                                                 │
│      ▼                                                 │
│  4. 数据恢复                                            │
│      │                                                 │
│      ▼                                                 │
│  5. 验证数据                                            │
│      │                                                 │
│      ▼                                                 │
│  6. 切换流量                                            │
└─────────────────────────────────────────────────────────┘

13.6.2 快速恢复脚本

#!/bin/bash
# disaster_recovery.sh

BACKUP_SERVER="backup-minio"
BACKUP_BUCKET="backup-production"
RESTORE_BUCKET="production"
LOG_FILE="/var/log/disaster-recovery.log"

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}

log "Starting disaster recovery..."

# 1. 检查备份状态
mc admin info $BACKUP_SERVER

# 2. 创建临时恢复存储桶
mc mb $BACKUP_SERVER/temp-restore 2>/dev/null || true

# 3. 恢复数据
log "Restoring data from backup..."
mc mirror --overwrite $BACKUP_SERVER/$BACKUP_BUCKET $BACKUP_SERVER/temp-restore/

# 4. 验证数据
OBJECT_COUNT=$(mc ls --json $BACKUP_SERVER/temp-restore/ | jq length)
log "Restored objects: $OBJECT_COUNT"

# 5. 切换存储桶
mc mv $BACKUP_SERVER/$BACKUP_BUCKET $BACKUP_SERVER/$BACKUP_BUCKET-old-$(date +%Y%m%d)
mc mv $BACKUP_SERVER/temp-restore $BACKUP_SERVER/$BACKUP_BUCKET

log "Disaster recovery completed"

13.7 备份工具

13.7.1 rclone 备份

# 安装 rclone
curl https://rclone.org/install.sh | sudo bash

# 配置 rclone
rclone config
# 选择 S3 类型
# 输入 MinIO 配置

# 备份到 MinIO
rclone copy /local/path minio:bucket --progress

# 同步备份
rclone sync /local/path minio:bucket --progress

# 列出文件
rclone ls minio:bucket

13.7.2 rclone 配置

# ~/.config/rclone/rclone.conf
[minio]
type = s3
provider = MinIO
env_auth = false
access_key_id = admin
secret_access_key = password123
endpoint = http://localhost:9000
region = us-east-1

13.8 数据验证

13.8.1 MD5 校验

# 比较 MD5
md5sum /local/file.txt
mc cat myminio/bucket/file.txt | md5sum

# 使用 mc 比较
mc diff myminio/bucket1 /local/path

13.8.2 完整性检查

#!/bin/bash
# verify_backup.sh

BUCKET="production"
BACKUP_DIR="/backup/minio/${BUCKET}"

# 统计比较
ORIGINAL_COUNT=$(mc ls --json myminio/$BUCKET/ | jq length)
BACKUP_COUNT=$(find $BACKUP_DIR -type f | wc -l)

echo "Original: $ORIGINAL_COUNT objects"
echo "Backup: $BACKUP_COUNT files"

if [ "$ORIGINAL_COUNT" -eq "$BACKUP_COUNT" ]; then
    echo "Object count matches"
else
    echo "WARNING: Object count mismatch!"
fi

13.9 最佳实践

13.9.1 备份策略

□ 每日全量备份
□ 每小时增量备份
□ 实时复制到灾备站点
□ 定期测试恢复流程
□ 备份加密存储
□ 定期清理过期备份
□ 记录备份日志
□ 监控备份任务

13.9.2 RTO/RPO 目标

场景 RPO RTO
单节点故障 < 1 分钟 < 15 分钟
存储桶误删 < 1 小时 < 1 小时
灾难故障 < 1 分钟 < 4 小时

13.10 总结

本章介绍了 MinIO 的备份恢复策略,包括本地备份、跨集群复制、快照和灾难恢复方案。完善的备份策略是保障数据安全的关键措施。