备份架构设计
备份架构设计
备份策略对比
不同的备份策略在恢复时间、存储成本和备份速度之间有权衡。
全量备份 vs 增量备份 vs 差异备份
时间线:
Day1: [全量备份] ---- 全量
Day2: [增量] ---- 只备份Day2变化
Day3: [增量] ---- 只备份Day3变化
Day4: [增量] ---- 只备份Day4变化
恢复时需要:
全量 + 所有增量 → 恢复Day4数据
差异备份:
Day1: [全量备份] ---- 全量
Day2: [差异备份] ---- 备份Day1到Day2的变化
Day3: [差异备份] ---- 备份Day1到Day3的变化
Day4: [差异备份] ---- 备份Day1到Day4的变化
恢复时需要:
全量 + 最新差异 → 恢复Day4数据
全量备份实现
#!/bin/bash
# PostgreSQL 全量备份脚本
BACKUP_DIR="/backup/full/$(date +%Y%m%d_%H%M%S)"
RETENTION_DAYS=30
# 创建备份目录
mkdir -p "${BACKUP_DIR}"
# 执行全量备份
pg_dumpall -Fc -f "${BACKUP_DIR}/full.dump" -h localhost -U postgres
# 计算校验和
md5sum "${BACKUP_DIR}/full.dump" > "${BACKUP_DIR}/checksum.md5"
# 记录备份元数据
cat > "${BACKUP_DIR}/metadata.json" << EOF
{
"type": "full",
"timestamp": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
"size": $(stat -c%s "${BACKUP_DIR}/full.dump"),
"database": "all"
}
EOF
# 清理过期备份
find /backup/full -maxdepth 1 -type d -mtime +${RETENTION_DAYS} -exec rm -rf {} \;
增量备份实现
#!/bin/bash
# PostgreSQL WAL 增量备份
WAL_ARCHIVE="/backup/wal"
LATEST_FULL=$(ls -td /backup/full/* | head -1)
# 归档 WAL 文件
archive_wal() {
pg_archivecleanup "${WAL_ARCHIVE}" $(pg_walfile_name_bin)
}
# 增量备份基于 WAL 日志
backup_incremental() {
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
# 记录当前 WAL 位置
psql -c "SELECT pg_switch_wal();" -h localhost -U postgres
# 复制新的 WAL 文件
rsync -av ${PGDATA}/pg_wal/ "${WAL_ARCHIVE}/${TIMESTAMP}/"
# 记录备份信息
echo "${TIMESTAMP}" >> "${WAL_ARCHIVE}/backup_history"
}
# 定时执行增量备份
while true; do
backup_incremental
sleep 3600 # 每小时执行一次
done
恢复策略
恢复时需要根据备份类型和数据丢失情况选择恢复策略。
# 恢复决策逻辑
class RecoveryManager:
def __init__(self, backup_catalog):
self.catalog = backup_catalog
def plan_recovery(self, target_time):
"""规划恢复方案"""
# 找到目标时间点之前的全量备份
full_backup = self.catalog.find_latest_full_before(target_time)
# 找到全量备份之后的所有增量
incrementals = self.catalog.find_increments_after(
full_backup.timestamp, target_time)
return RecoveryPlan(
full_backup=full_backup,
incrementals=incrementals,
estimated_time=self.estimate_recovery_time(full_backup, incrementals)
)
def execute_recovery(self, plan, target_dir):
"""执行恢复"""
# 1. 恢复全量备份
self.restore_full(plan.full_backup, target_dir)
# 2. 应用增量备份
for incremental in plan.incrementals:
self.apply_incremental(incremental, target_dir)
# 3. 验证恢复结果
if self.verify_recovery(target_dir):
return RecoveryResult(success=True)
else:
return RecoveryResult(success=False, error="验证失败")
备份策略需要根据数据重要性、恢复时间要求和存储成本综合考虑,并定期进行恢复演练验证。