外观
PostgreSQL 灾难恢复演练执行
演练前准备
1. 演练计划确认
- 演练目标:明确演练的具体目标,如验证RTO/RPO、测试恢复流程、检验团队响应能力等
- 演练范围:确定参与演练的系统、数据库和团队
- 演练场景:选择合适的演练场景,如主库故障、WAL文件损坏、磁盘故障等
- 演练时间:安排合适的演练时间,尽量减少对业务的影响
- 演练角色:明确演练团队成员的角色和职责
2. 环境准备
bash
# 检查演练环境硬件资源
free -h # 检查内存
df -h # 检查磁盘空间
# 检查 PostgreSQL 安装情况
dpkg -l | grep postgresql # Debian/Ubuntu
yum list installed | grep postgresql # CentOS/RHEL
# 确认备份文件存在
ls -la /backup/postgresql_full_*.sql
ls -la /archive/pg_wal/ # 检查 WAL 归档目录3. 工具和脚本准备
- 准备恢复脚本和工具
- 准备监控和记录工具
- 准备演练评估表格和模板
- 准备沟通工具和渠道
4. 风险评估和缓解
- 评估演练可能带来的风险
- 制定风险缓解措施
- 准备回滚计划
- 获得相关部门的批准
演练执行流程
1. 演练启动会议
- 确认演练目标和范围
- 复习演练流程和角色
- 检查环境和工具准备情况
- 确认沟通机制
- 获得演练开始的批准
2. 演练场景触发
根据选择的演练场景,触发相应的故障:
2.1 主库故障场景
bash
# 模拟主库故障(关闭主库服务)
systemctl stop postgresql@15-main
# 或断开主库网络
ifconfig eth0 down # 或使用 ip link set eth0 down2.2 WAL 文件损坏场景
bash
# 模拟 WAL 文件损坏
cp /dev/zero /var/lib/postgresql/15/main/pg_wal/000000010000000000000001 bs=1M count=12.3 磁盘故障场景
bash
# 模拟磁盘故障(卸载数据磁盘)
umount /var/lib/postgresql/15/main
# 或更改数据目录权限
chmod 000 /var/lib/postgresql/15/main3. 恢复操作执行
根据演练计划,执行相应的恢复操作:
3.1 主从切换恢复
bash
# 检查从库状态
psql -h slave-host -U postgres -c "SELECT * FROM pg_stat_replication;"
# 提升从库为主库
pg_ctl -D /var/lib/postgresql/15/main promote
# 验证新主库状态
psql -h slave-host -U postgres -c "SELECT pg_is_in_recovery();"3.2 从备份恢复
bash
# 停止 PostgreSQL 服务
systemctl stop postgresql@15-main
# 清理数据目录
rm -rf /var/lib/postgresql/15/main/*
# 从基础备份恢复
rsync -av /backup/pg_basebackup_20230101/ /var/lib/postgresql/15/main/
# 配置恢复参数
cat > /var/lib/postgresql/15/main/postgresql.auto.conf << EOF
restore_command = 'cp /archive/pg_wal/%f "%p"'
EOF
# 启动 PostgreSQL 服务
systemctl start postgresql@15-main3.3 时间点恢复(PITR)
bash
# 配置时间点恢复参数
cat > /var/lib/postgresql/15/main/postgresql.auto.conf << EOF
restore_command = 'cp /archive/pg_wal/%f "%p"'
recovery_target_time = '2023-01-01 12:00:00'
recovery_target_inclusive = false
recovery_target_action = 'promote'
EOF4. 演练监控和记录
4.1 监控恢复过程
bash
# 监控恢复日志
tail -f /var/log/postgresql/postgresql-15-main.log
# 监控系统资源
top -p $(pgrep -f postgres)
# 监控网络连接
netstat -an | grep 54324.2 记录演练过程
- 记录演练开始时间和结束时间
- 记录每个步骤的执行时间
- 记录遇到的问题和解决方案
- 记录恢复过程中的关键指标
- 记录团队响应时间和协作情况
演练后验证
1. 数据完整性验证
sql
-- 检查数据库对象数量
SELECT count(*) FROM pg_tables WHERE schemaname = 'public';
SELECT count(*) FROM pg_indexes WHERE schemaname = 'public';
-- 检查关键表的数据量
SELECT count(*) FROM users;
SELECT count(*) FROM orders;
-- 运行数据一致性检查
ANALYZE VERBOSE;2. 业务功能验证
sql
-- 运行业务验证查询
SELECT * FROM users WHERE user_id = 1;
SELECT * FROM orders WHERE order_date > '2023-01-01';
-- 测试业务流程
INSERT INTO test_table (col1, col2) VALUES ('test1', 'test2');
UPDATE test_table SET col1 = 'updated' WHERE col2 = 'test2';
DELETE FROM test_table WHERE col1 = 'updated';3. 性能验证
bash
# 检查系统性能
top -p $(pgrep -f postgres)
# 检查 PostgreSQL 性能指标
psql -h localhost -U postgres -c "SELECT * FROM pg_stat_bgwriter;"
psql -h localhost -U postgres -c "SELECT * FROM pg_stat_database;"4. 恢复目标验证
- 验证 RTO(恢复时间目标)是否达成
- 验证 RPO(恢复点目标)是否达成
- 验证恢复后的系统是否满足业务需求
不同场景的演练执行步骤
1. 主从复制故障演练
执行步骤
- 触发主库故障
- 监控从库状态变化
- 执行主从切换
- 验证新主库状态
- 重建原主库并配置为从库
- 验证复制状态
关键指标
- 主从切换时间
- 数据丢失量
- 业务中断时间
- 团队响应时间
2. 数据中心故障演练
执行步骤
- 触发主数据中心故障
- 启动灾备数据中心
- 验证灾备数据中心的数据库状态
- 切换业务流量到灾备数据中心
- 验证业务功能
- 评估 RTO/RPO 达成情况
关键指标
- 灾备数据中心启动时间
- 业务切换时间
- 数据一致性验证结果
- 灾备系统性能
3. 备份恢复演练
执行步骤
- 删除或损坏测试数据库
- 从备份恢复数据库
- 验证恢复后的数据完整性
- 验证业务功能
- 评估恢复时间和数据丢失量
关键指标
- 备份恢复时间
- 数据完整性验证结果
- 恢复后系统性能
演练监控和记录最佳实践
1. 实时监控
- 监控恢复过程中的关键指标
- 及时发现和解决问题
- 记录恢复时间和进度
2. 详细记录
- 记录演练的每个步骤和时间
- 记录遇到的问题和解决方案
- 记录团队协作情况
- 记录系统资源使用情况
3. 可视化展示
- 使用图表展示恢复进度和时间
- 可视化展示 RTO/RPO 达成情况
- 展示资源使用情况
4. 自动化记录
- 使用自动化工具记录演练过程
- 自动生成演练报告
- 自动分析演练结果
常见问题处理
1. 演练过程中出现意外故障
- 立即启动回滚计划
- 评估故障影响
- 采取相应的修复措施
- 记录事故并分析原因
2. 恢复时间超过预期
- 分析恢复时间过长的原因
- 采取优化措施
- 调整恢复策略
- 更新 RTO 预期
3. 数据恢复不完整
- 分析数据丢失的原因
- 采取补救措施
- 调整备份策略
- 更新 RPO 预期
4. 团队协作不畅
- 分析协作问题的原因
- 改进沟通机制
- 加强团队培训
- 优化角色和职责
常见问题(FAQ)
Q1:如何选择合适的演练场景?
A1:根据以下因素选择合适的演练场景:
- 业务需求和优先级
- 系统架构和风险点
- 团队技能和经验
- 可用的资源和时间
- 之前演练的结果和改进点
Q2:如何评估演练效果?
A2:从以下几个方面评估演练效果:
- RTO/RPO 达成情况
- 恢复流程的有效性
- 团队响应能力和协作情况
- 数据完整性验证结果
- 遇到的问题和解决方案
- 改进建议的可行性
Q3:如何提高演练的真实性?
A3:
- 选择贴近实际的演练场景
- 使用真实的生产数据(脱敏处理)
- 模拟真实的故障条件
- 限制演练前的准备时间
- 引入随机因素增加不确定性
Q4:如何确保演练的安全性?
A4:
- 进行充分的风险评估
- 制定详细的风险缓解措施
- 准备完善的回滚计划
- 获得相关部门的批准
- 在非生产或低峰时段进行演练
Q5:如何处理演练过程中的紧急情况?
A5:
- 建立明确的紧急情况处理流程
- 任命专门的紧急情况处理负责人
- 准备必要的紧急修复工具和资源
- 建立与相关部门的紧急沟通渠道
- 定期进行紧急情况处理培训
Q6:如何持续改进演练效果?
A6:
- 定期进行演练,验证改进效果
- 引入新的演练场景和技术
- 学习行业最佳实践
- 参与外部演练和交流活动
- 建立演练经验库,共享知识和经验
