backup-retention-policy

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Backup Retention Policy Expert

备份保留策略专家

Эксперт по управлению жизненным циклом данных и восстановления после сбоев.
数据生命周期管理与灾难恢复专家。

Правило 3-2-1-1-0

3-2-1-1-0规则

  • 3 копии важных данных (1 основная + 2 резервные)
  • 2 различных типа носителей
  • 1 внешняя/облачная резервная копия
  • 1 автономная/неизменяемая резервная копия
  • 0 ошибок после тестирования
  • 3 份重要数据副本(1份主数据 + 2份备份)
  • 2 种不同类型的存储介质
  • 1 份外部/云备份
  • 1 份离线/不可变备份
  • 0 测试后错误

Уровни хранения

存储层级

УровеньДоступПериодСтоимость
ГорячийЧастый0-30 дней$$$
ТеплыйПериодический30-90 дней$$
ХолодныйРедкий90 дней-7 лет$
АрхивДолгосрочный7+ лет¢
层级访问频率周期成本
热存储频繁0-30天$$$
温存储定期30-90天$$
冷存储稀少90天-7年$
归档长期7年以上¢

AWS S3 Lifecycle Policy

AWS S3 Lifecycle Policy

json
{
  "Rules": [
    {
      "ID": "BackupLifecycle",
      "Status": "Enabled",
      "Filter": {
        "Prefix": "backups/"
      },
      "Transitions": [
        {
          "Days": 30,
          "StorageClass": "STANDARD_IA"
        },
        {
          "Days": 90,
          "StorageClass": "GLACIER"
        },
        {
          "Days": 365,
          "StorageClass": "DEEP_ARCHIVE"
        }
      ],
      "Expiration": {
        "Days": 2555
      },
      "NoncurrentVersionTransitions": [
        {
          "NoncurrentDays": 30,
          "StorageClass": "GLACIER"
        }
      ],
      "NoncurrentVersionExpiration": {
        "NoncurrentDays": 365
      }
    }
  ]
}
json
{
  "Rules": [
    {
      "ID": "BackupLifecycle",
      "Status": "Enabled",
      "Filter": {
        "Prefix": "backups/"
      },
      "Transitions": [
        {
          "Days": 30,
          "StorageClass": "STANDARD_IA"
        },
        {
          "Days": 90,
          "StorageClass": "GLACIER"
        },
        {
          "Days": 365,
          "StorageClass": "DEEP_ARCHIVE"
        }
      ],
      "Expiration": {
        "Days": 2555
      },
      "NoncurrentVersionTransitions": [
        {
          "NoncurrentDays": 30,
          "StorageClass": "GLACIER"
        }
      ],
      "NoncurrentVersionExpiration": {
        "NoncurrentDays": 365
      }
    }
  ]
}

Azure Blob Lifecycle

Azure Blob生命周期

json
{
  "rules": [
    {
      "name": "backupRetention",
      "type": "Lifecycle",
      "definition": {
        "actions": {
          "baseBlob": {
            "tierToCool": {"daysAfterModificationGreaterThan": 30},
            "tierToArchive": {"daysAfterModificationGreaterThan": 90},
            "delete": {"daysAfterModificationGreaterThan": 2555}
          },
          "snapshot": {
            "delete": {"daysAfterCreationGreaterThan": 90}
          }
        },
        "filters": {
          "blobTypes": ["blockBlob"],
          "prefixMatch": ["backups/"]
        }
      }
    }
  ]
}
json
{
  "rules": [
    {
      "name": "backupRetention",
      "type": "Lifecycle",
      "definition": {
        "actions": {
          "baseBlob": {
            "tierToCool": {"daysAfterModificationGreaterThan": 30},
            "tierToArchive": {"daysAfterModificationGreaterThan": 90},
            "delete": {"daysAfterModificationGreaterThan": 2555}
          },
          "snapshot": {
            "delete": {"daysAfterCreationGreaterThan": 90}
          }
        },
        "filters": {
          "blobTypes": ["blockBlob"],
          "prefixMatch": ["backups/"]
        }
      }
    }
  ]
}

Скрипт ротации бэкапов

备份轮换脚本

bash
#!/bin/bash
BACKUP_DIR="/var/backups"
DAILY_RETENTION=7
WEEKLY_RETENTION=4
MONTHLY_RETENTION=12
bash
#!/bin/bash
BACKUP_DIR="/var/backups"
DAILY_RETENTION=7
WEEKLY_RETENTION=4
MONTHLY_RETENTION=12

Удаление ежедневных старше 7 дней

删除7天以上的每日备份

find "$BACKUP_DIR/daily" -type f -mtime +$DAILY_RETENTION -delete
find "$BACKUP_DIR/daily" -type f -mtime +$DAILY_RETENTION -delete

Удаление еженедельных старше 4 недель

删除4周以上的每周备份

find "$BACKUP_DIR/weekly" -type f -mtime +$((WEEKLY_RETENTION * 7)) -delete
find "$BACKUP_DIR/weekly" -type f -mtime +$((WEEKLY_RETENTION * 7)) -delete

Удаление ежемесячных старше 12 месяцев

删除12个月以上的每月备份

find "$BACKUP_DIR/monthly" -type f -mtime +$((MONTHLY_RETENTION * 30)) -delete
find "$BACKUP_DIR/monthly" -type f -mtime +$((MONTHLY_RETENTION * 30)) -delete

Логирование

日志记录

echo "$(date): Rotation completed" >> /var/log/backup_rotation.log
undefined
echo "$(date): 轮换完成" >> /var/log/backup_rotation.log
undefined

PostgreSQL Backup

PostgreSQL Backup

bash
#!/bin/bash
DB_NAME="production"
BACKUP_DIR="/var/backups/postgres"
DATE=$(date +%Y%m%d_%H%M%S)
bash
#!/bin/bash
DB_NAME="production"
BACKUP_DIR="/var/backups/postgres"
DATE=$(date +%Y%m%d_%H%M%S)

Полный бэкап

完整备份

pg_dump -Fc -f "$BACKUP_DIR/full_$DATE.dump" $DB_NAME
pg_dump -Fc -f "$BACKUP_DIR/full_$DATE.dump" $DB_NAME

Инкрементальный с WAL

带WAL的增量备份

pg_basebackup -D "$BACKUP_DIR/base_$DATE" -Ft -z -P
pg_basebackup -D "$BACKUP_DIR/base_$DATE" -Ft -z -P

Архивация WAL логов

WAL日志归档

archive_command = 'cp %p /var/backups/wal/%f'
undefined
archive_command = 'cp %p /var/backups/wal/%f'
undefined

MySQL Backup

MySQL Backup

bash
#!/bin/bash
MYSQL_USER="backup_user"
MYSQL_PASS="secure_password"
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
bash
#!/bin/bash
MYSQL_USER="backup_user"
MYSQL_PASS="secure_password"
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y%m%d_%H%M%S)

Полный бэкап

完整备份

mysqldump --user=$MYSQL_USER --password=$MYSQL_PASS
--all-databases --single-transaction
--routines --triggers --events
| gzip > "$BACKUP_DIR/full_$DATE.sql.gz"
mysqldump --user=$MYSQL_USER --password=$MYSQL_PASS
--all-databases --single-transaction
--routines --triggers --events
| gzip > "$BACKUP_DIR/full_$DATE.sql.gz"

Инкрементальный с binlog

带binlog的增量备份

mysqlbinlog --read-from-remote-server
--host=localhost --user=$MYSQL_USER
--raw --stop-never mysql-bin.000001
undefined
mysqlbinlog --read-from-remote-server
--host=localhost --user=$MYSQL_USER
--raw --stop-never mysql-bin.000001
undefined

Compliance Requirements

合规要求

СтандартТребование
GDPRПраво на удаление, минимизация данных
SOX7 лет для финансовых записей
HIPAA6 лет для медицинских данных
PCI DSS1 год минимум для аудита
标准要求
GDPR删除权、数据最小化
SOX财务记录保留7年
HIPAA医疗数据保留6年
PCI DSS审计记录至少保留1年

RTO/RPO Planning

RTO/RPO规划

yaml
Критические системы:
  RPO: 1 час
  RTO: 4 часа
  Стратегия: Синхронная репликация + горячий standby

Бизнес-системы:
  RPO: 4 часа
  RTO: 24 часа
  Стратегия: Асинхронная репликация + теплый standby

Архивные системы:
  RPO: 24 часа
  RTO: 72 часа
  Стратегия: Ежедневные бэкапы + холодное хранение
yaml
关键系统:
  RPO: 1小时
  RTO: 4小时
  策略: 同步复制 + 热备用

业务系统:
  RPO: 4小时
  RTO: 24小时
  策略: 异步复制 + 温备用

归档系统:
  RPO: 24小时
  RTO: 72小时
  策略: 每日备份 + 冷存储

Валидация политик на Python

策略验证(Python)

python
from datetime import datetime, timedelta
from typing import List, Dict

class BackupRetentionValidator:
    def __init__(self, retention_policy: Dict):
        self.policy = retention_policy

    def validate_backup(self, backup_date: datetime, backup_type: str) -> bool:
        """Проверка соответствия бэкапа политике хранения"""
        retention_days = self.policy.get(backup_type, {}).get('retention_days', 0)
        expiry_date = backup_date + timedelta(days=retention_days)
        return datetime.now() < expiry_date

    def get_expired_backups(self, backups: List[Dict]) -> List[Dict]:
        """Получить список просроченных бэкапов"""
        expired = []
        for backup in backups:
            if not self.validate_backup(backup['date'], backup['type']):
                expired.append(backup)
        return expired

    def calculate_storage_forecast(self, daily_backup_size_gb: float) -> Dict:
        """Прогноз использования хранилища"""
        total_storage = 0
        for backup_type, config in self.policy.items():
            retention = config.get('retention_days', 0)
            frequency = config.get('frequency_days', 1)
            copies = retention // frequency
            total_storage += copies * daily_backup_size_gb

        return {
            'total_gb': total_storage,
            'monthly_cost_estimate': total_storage * 0.023  # S3 Standard pricing
        }
python
from datetime import datetime, timedelta
from typing import List, Dict

class BackupRetentionValidator:
    def __init__(self, retention_policy: Dict):
        self.policy = retention_policy

    def validate_backup(self, backup_date: datetime, backup_type: str) -> bool:
        """验证备份是否符合存储策略"""
        retention_days = self.policy.get(backup_type, {}).get('retention_days', 0)
        expiry_date = backup_date + timedelta(days=retention_days)
        return datetime.now() < expiry_date

    def get_expired_backups(self, backups: List[Dict]) -> List[Dict]:
        """获取过期备份列表"""
        expired = []
        for backup in backups:
            if not self.validate_backup(backup['date'], backup['type']):
                expired.append(backup)
        return expired

    def calculate_storage_forecast(self, daily_backup_size_gb: float) -> Dict:
        """计算存储使用预测"""
        total_storage = 0
        for backup_type, config in self.policy.items():
            retention = config.get('retention_days', 0)
            frequency = config.get('frequency_days', 1)
            copies = retention // frequency
            total_storage += copies * daily_backup_size_gb

        return {
            'total_gb': total_storage,
            'monthly_cost_estimate': total_storage * 0.023  # S3 Standard定价
        }

График тестирования

测试计划

Тип тестаЧастотаОхват
Выборочное восстановлениеЕжемесячно10% данных
Полное восстановлениеЕжеквартальноКритические системы
DR ученияЕжегодноПолный сценарий
Аудит политикЕжегодноВсе политики
测试类型频率覆盖范围
选择性恢复每月10%数据
完整恢复每季度关键系统
DR演练每年完整场景
策略审计每年所有策略

Мониторинг и алерты

监控与告警

yaml
Алерты:
  backup_failed:
    severity: critical
    notification: [pagerduty, slack]

  backup_size_anomaly:
    threshold: 20%
    severity: warning

  retention_violation:
    severity: high
    action: auto_remediate

  storage_threshold:
    threshold: 80%
    severity: warning
yaml
告警:
  backup_failed:
    严重级别: critical
    通知方式: [pagerduty, slack]

  backup_size_anomaly:
    阈值: 20%
    严重级别: warning

  retention_violation:
    严重级别: high
    操作: auto_remediate

  storage_threshold:
    阈值: 80%
    严重级别: warning

Лучшие практики

最佳实践

  1. Тестируйте восстановление — бэкап без теста = нет бэкапа
  2. Шифруйте данные — AES-256 для данных в покое
  3. Версионирование — храните несколько версий
  4. Географическое распределение — минимум 2 региона
  5. Immutable storage — защита от ransomware
  6. Документируйте процедуры — runbooks для DR
  1. 测试恢复 — 未测试的备份 = 没有备份
  2. 加密数据 — 静态数据使用AES-256加密
  3. 版本控制 — 保留多个版本
  4. 地理分布 — 至少2个区域
  5. Immutable storage — 防范勒索软件
  6. 记录流程 — DR运行手册