backup-retention-policy
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseBackup 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=12bash
#!/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
undefinedecho "$(date): 轮换完成" >> /var/log/backup_rotation.log
undefinedPostgreSQL 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'
undefinedarchive_command = 'cp %p /var/backups/wal/%f'
undefinedMySQL 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"
--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"
--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
--host=localhost --user=$MYSQL_USER
--raw --stop-never mysql-bin.000001
undefinedmysqlbinlog --read-from-remote-server
--host=localhost --user=$MYSQL_USER
--raw --stop-never mysql-bin.000001
--host=localhost --user=$MYSQL_USER
--raw --stop-never mysql-bin.000001
undefinedCompliance Requirements
合规要求
| Стандарт | Требование |
|---|---|
| GDPR | Право на удаление, минимизация данных |
| SOX | 7 лет для финансовых записей |
| HIPAA | 6 лет для медицинских данных |
| PCI DSS | 1 год минимум для аудита |
| 标准 | 要求 |
|---|---|
| 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: warningyaml
告警:
backup_failed:
严重级别: critical
通知方式: [pagerduty, slack]
backup_size_anomaly:
阈值: 20%
严重级别: warning
retention_violation:
严重级别: high
操作: auto_remediate
storage_threshold:
阈值: 80%
严重级别: warningЛучшие практики
最佳实践
- Тестируйте восстановление — бэкап без теста = нет бэкапа
- Шифруйте данные — AES-256 для данных в покое
- Версионирование — храните несколько версий
- Географическое распределение — минимум 2 региона
- Immutable storage — защита от ransomware
- Документируйте процедуры — runbooks для DR
- 测试恢复 — 未测试的备份 = 没有备份
- 加密数据 — 静态数据使用AES-256加密
- 版本控制 — 保留多个版本
- 地理分布 — 至少2个区域
- Immutable storage — 防范勒索软件
- 记录流程 — DR运行手册