← 返回首页
🛡️

备份架构设计

📂 architecture ⏱ 2 min 225 words

备份架构设计

备份策略对比

不同的备份策略在恢复时间、存储成本和备份速度之间有权衡。

全量备份 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="验证失败")

备份策略需要根据数据重要性、恢复时间要求和存储成本综合考虑,并定期进行恢复演练验证。