第十三章:备份恢复
学习 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 的备份恢复策略,包括本地备份、跨集群复制、快照和灾难恢复方案。完善的备份策略是保障数据安全的关键措施。