灾备架构设计
灾备架构设计
RPO 与 RTO 指标
灾备设计的核心指标是 RPO(恢复点目标)和 RTO(恢复时间目标):
- RPO:可接受的数据丢失量。RPO=0 表示不允许数据丢失,RPO=1h 表示最多丢失 1 小时数据
- RTO:可接受的服务中断时间。RTO=0 表示零中断,RTO=4h 表示最多中断 4 小时
不同业务场景对 RPO/RTO 的要求差异很大,需要根据业务影响程度制定合理的灾备策略。
┌─────────────────────────────────────────────────────────────┐
│ 灾备策略矩阵 │
├─────────────┬─────────────┬─────────────┬─────────────────────┤
│ 策略 │ RPO │ RTO │ 成本 │
├─────────────┼─────────────┼─────────────┼─────────────────────┤
│ 冷备 │ 24h │ 数小时 │ 低 │
│ 温备 │ 数小时 │ 数十分钟 │ 中 │
│ 热备 │ 接近 0 │ 数秒 │ 高 │
│ 双活 │ 0 │ 0 │ 很高 │
└─────────────┴─────────────┴─────────────┴─────────────────────┘
冷备方案
冷备是最简单的灾备方案,定期将数据备份到异地存储,灾难发生时手动恢复服务。
#!/bin/bash
# 数据库冷备脚本示例
BACKUP_DIR="/backup/$(date +%Y%m%d)"
REMOTE_HOST="dr-backup.example.com"
# 创建本地备份
pg_dump -Fc -f "${BACKUP_DIR}/db.dump" mydb
# 压缩备份文件
tar -czf "${BACKUP_DIR}.tar.gz" "${BACKUP_DIR}"
# 传输到异地备份服务器
rsync -avz "${BACKUP_DIR}.tar.gz" "${REMOTE_HOST}:/backup/"
# 清理本地临时文件
rm -rf "${BACKUP_DIR}" "${BACKUP_DIR}.tar.gz"
热备与自动切换
热备方案需要实时同步数据,并在主系统故障时自动切换到备用系统。
// 热备自动切换控制器
@Component
public class FailoverController {
private volatile boolean primaryActive = true;
private final ConnectionPool primaryPool;
private final ConnectionPool standbyPool;
public Connection getConnection() {
if (primaryActive) {
try {
return primaryPool.getConnection();
} catch (Exception e) {
log.warn("主库连接失败,切换到备库");
primaryActive = false;
}
}
return standbyPool.getConnection();
}
@Scheduled(fixedRate = 5000)
public void healthCheck() {
boolean primaryHealthy = checkPrimaryHealth();
boolean standbyHealthy = checkStandbyHealth();
if (!primaryActive && primaryHealthy && standbyHealthy) {
// 主库恢复,考虑切回
log.info("主库恢复健康,准备切回");
primaryActive = true;
}
}
}
灾备演练
灾备方案的有效性需要通过定期演练验证。演练应覆盖数据恢复、服务切换、数据一致性验证等环节,并记录演练过程中发现的问题。