Skip to content

PostgreSQL 灾备演练计划

演练目标

主要目标

  1. 验证灾备系统的有效性:确保灾备系统能够按照预期工作
  2. 测试恢复时间目标(RTO):验证是否能够在预定时间内恢复服务
  3. 测试恢复点目标(RPO):验证数据丢失是否在可接受范围内
  4. 评估团队应急响应能力:测试团队在灾难情况下的协作和响应能力
  5. 发现并解决潜在问题:识别灾备系统中存在的隐患和问题
  6. 验证文档的准确性:确保灾备文档的准确性和可操作性

具体目标

目标类型具体目标衡量标准
技术目标验证主备切换功能主库故障后,备库能够在5分钟内接管服务
技术目标验证数据恢复完整性恢复后数据完整性100%,无丢失
技术目标验证应用切换功能应用能够自动或手动切换到备库,切换时间<3分钟
管理目标验证团队响应时间从故障发生到开始恢复的时间<5分钟
管理目标验证文档有效性按照文档执行,无需额外咨询即可完成恢复

演练范围

系统范围

  1. 数据库系统:PostgreSQL主库和备库
  2. 应用系统:依赖于PostgreSQL的核心业务应用
  3. 网络系统:数据库和应用之间的网络连接
  4. 存储系统:数据库存储和备份存储
  5. 监控系统:监控数据库和应用的状态

演练场景

演练场景描述优先级
主库硬件故障模拟主库服务器硬件故障,测试备库接管
主库软件故障模拟主库数据库软件崩溃,测试备库接管
网络故障模拟主库与备库之间的网络中断,测试故障切换
存储故障模拟主库存储故障,测试从备份恢复
人为误操作模拟误删除数据,测试从备份恢复到指定时间点

演练准备

人员准备

角色职责人员
演练负责人负责演练的整体协调和管理张三
数据库管理员负责数据库的故障模拟、恢复操作李四
应用管理员负责应用的切换和验证王五
网络管理员负责网络的配置和故障模拟赵六
监控管理员负责监控系统的配置和状态查看孙七
业务验证人员负责业务功能的验证周八

环境准备

生产环境准备

  • 确保主备数据库正常运行
  • 确认备份系统正常工作
  • 验证监控系统能够正常监控主备状态
  • 通知相关业务团队,避免影响正常业务

测试环境准备

  • 准备与生产环境类似的测试环境
  • 部署相同版本的PostgreSQL和应用
  • 准备测试数据和测试用例
  • 确保测试环境与生产环境隔离

文档准备

  1. 灾备架构文档:详细描述灾备系统的架构和组件
  2. 灾备操作手册:详细的故障切换和恢复步骤
  3. 演练脚本:自动化演练的脚本和工具
  4. 验证脚本:验证恢复结果的脚本和工具
  5. 回滚计划:演练失败时的回滚步骤

工具准备

工具类型具体工具用途
监控工具Prometheus + Grafana监控数据库和系统状态
备份工具pgBackRest执行数据库备份和恢复
切换工具repmgr管理PostgreSQL流复制和切换
测试工具pgbench测试数据库性能
日志工具pgBadger分析数据库日志
文档工具Markdown编写和维护演练文档

演练执行步骤

预演练准备

召开演练启动会议

  • 确认演练目标、范围和步骤
  • 分配演练角色和职责
  • 确认演练时间窗口
  • 制定沟通机制和应急联系人

检查演练环境

bash
# 检查主库状态
sudo -u postgres psql -c "SELECT pg_is_in_recovery();"
# 检查备库状态
sudo -u postgres psql -h standby-host -c "SELECT pg_is_in_recovery();"
# 检查复制状态
sudo -u postgres psql -c "SELECT * FROM pg_stat_replication;"

准备测试数据

sql
-- 创建测试表
CREATE TABLE test_dr (id serial PRIMARY KEY, name varchar(100), created_at timestamp default now());

-- 插入测试数据
INSERT INTO test_dr (name) VALUES ('dr-test-1'), ('dr-test-2'), ('dr-test-3');

-- 记录当前时间,用于后续验证
SELECT now() as current_time;

演练执行

场景1:主库硬件故障

步骤1:模拟主库故障
bash
# 在主库服务器上模拟硬件故障
sudo poweroff
步骤2:检测故障
bash
# 监控系统检测到主库故障,发出告警
# 查看监控告警
步骤3:执行故障切换
bash
# 在备库上执行故障切换
repmgr standby promote
步骤4:验证切换结果
sql
-- 检查备库是否已提升为主库
SELECT pg_is_in_recovery();

-- 检查复制状态
SELECT * FROM pg_stat_replication;

-- 验证测试数据完整性
SELECT * FROM test_dr;

场景2:主库软件故障

步骤1:模拟主库软件故障
bash
# 强制终止主库进程
sudo pkill -9 postgres
步骤2:检测故障
bash
# 监控系统检测到主库故障,发出告警
# 查看监控告警
步骤3:执行故障切换
bash
# 在备库上执行故障切换
repmgr standby promote
步骤4:验证切换结果
sql
-- 检查备库是否已提升为主库
SELECT pg_is_in_recovery();

-- 检查复制状态
SELECT * FROM pg_stat_replication;

-- 验证测试数据完整性
SELECT * FROM test_dr;

应用切换

配置应用连接

bash
# 修改应用配置,将数据库连接指向新的主库
# 以Java应用为例
vi application.properties
# 修改spring.datasource.url为新主库的连接地址

重启应用服务

bash
# 重启应用服务
sudo systemctl restart myapp

验证应用功能

bash
# 访问应用的健康检查接口
curl http://localhost:8080/health

# 执行业务功能测试
curl http://localhost:8080/api/test

演练回滚

恢复原主库

bash
# 修复原主库的故障
# 重新启动原主库
sudo systemctl start postgresql@15-main

# 将原主库配置为新主库的备库
repmgr standby clone -h new-primary-host -U repmgr -d repmgr

# 启动复制
repmgr service start

切换回原主库(可选)

bash
# 如果需要切换回原主库,执行以下步骤
# 1. 确保原主库已同步新主库的数据
# 2. 在原主库上执行切换
repmgr standby promote

演练验证

技术验证

数据库验证

sql
-- 验证数据库状态
SELECT pg_is_in_recovery();

-- 验证数据完整性
SELECT * FROM test_dr;

-- 验证复制状态
SELECT * FROM pg_stat_replication;

-- 验证数据库性能
pgbench -i -h new-primary-host -U postgres -d mydb
pgbench -h new-primary-host -U postgres -d mydb -c 10 -j 2 -T 60

应用验证

验证项验证方法预期结果
应用连接访问应用健康检查接口返回200 OK
业务功能执行核心业务操作操作成功,无错误
性能指标测试应用响应时间响应时间<500ms
并发能力模拟多用户并发访问支持1000并发用户

管理验证

验证项验证方法预期结果
响应时间记录从故障到恢复的时间<30分钟
团队协作评估团队成员的协作情况沟通顺畅,职责明确
文档准确性对比文档与实际操作文档准确,可操作
问题处理记录演练中遇到的问题问题得到及时解决

演练评估与改进

演练评估

技术评估

评估项实际结果目标结果差距改进建议
RTO25分钟30分钟达标保持当前配置
RPO0数据丢失0数据丢失达标保持当前备份策略
数据完整性100%完整100%完整达标保持当前验证方法
应用可用性99.9%99.9%达标保持当前监控策略

管理评估

评估项评估结果改进建议
团队响应响应及时,协作良好定期组织培训,提高团队技能
文档质量文档准确,可操作定期更新文档,确保与实际环境一致
沟通机制沟通顺畅,信息及时保持当前沟通机制

改进计划

短期改进(1-2周)

  • 修复演练中发现的配置问题
  • 更新灾备文档,补充遗漏的步骤
  • 优化监控告警规则,提高告警准确性

中期改进(1-2个月)

  • 自动化演练流程,减少手动操作
  • 优化灾备架构,提高RTO和RPO指标
  • 组织团队培训,提高应急响应能力

长期改进(3-6个月)

  • 建立灾备演练的定期机制
  • 引入混沌工程,提高系统的韧性
  • 优化灾备成本,提高ROI

演练报告

报告结构

  1. 基本信息:演练的背景和基本情况
  2. 演练目标:演练的主要目标和具体目标
  3. 演练范围:演练涉及的系统和场景
  4. 演练执行:演练的具体步骤和执行情况
  5. 验证结果:演练的验证结果和评估
  6. 问题和改进:演练中发现的问题和改进建议
  7. 后续建议:演练的总结和后续行动计划

报告示例

markdown
# PostgreSQL 灾备演练报告

## 基本信息
- 演练日期:2023-12-01
- 演练时间:14:00-16:30
- 演练场景:主库硬件故障和主库软件故障
- 参与人员:张三、李四、王五、赵六、孙七、周八

## 演练目标
- 验证主备切换功能
- 测试RTO和RPO指标
- 评估团队响应能力

## 演练执行情况
### 场景1:主库硬件故障
- 故障模拟:14:10
- 故障检测:14:12(监控告警)
- 切换开始:14:15
- 切换完成:14:20
- 应用切换:14:25
- 验证完成:14:30

### 场景2:主库软件故障
- 故障模拟:15:00
- 故障检测:15:01(监控告警)
- 切换开始:15:03
- 切换完成:15:06
- 应用切换:15:10
- 验证完成:15:15

## 验证结果
### 技术验证
- RTO:20分钟(达标)
- RPO:0数据丢失(达标)
- 数据完整性:100%(达标)
- 应用可用性:99.9%(达标)

### 管理验证
- 团队响应时间:5分钟(达标)
- 文档准确性:95%(基本达标,需补充部分步骤)
- 沟通机制:良好(达标)

## 问题和改进
### 发现的问题
1. 监控告警延迟2分钟
2. 应用切换需要手动修改配置
3. 演练文档中缺少部分回滚步骤

### 改进建议
1. 优化监控告警配置,减少延迟
2. 实现应用连接的自动切换
3. 更新演练文档,补充回滚步骤

## 后续建议
- 本次演练达到了预期目标
- 灾备系统整体运行正常
- 团队响应及时,协作良好
- 建议定期组织类似演练,提高系统韧性

常见问题(FAQ)

Q1:灾备演练应该多久执行一次?

A1:灾备演练的频率取决于业务的重要程度和风险容忍度:

  • 核心业务系统:每季度至少执行一次完整演练
  • 重要业务系统:每半年至少执行一次完整演练
  • 一般业务系统:每年至少执行一次完整演练

此外,还应该根据系统变更情况(如架构变更、版本升级等)增加演练频率。

Q2:灾备演练会影响生产业务吗?

A2:合理规划的灾备演练不会影响生产业务:

  1. 选择业务低峰期执行演练
  2. 使用独立的测试环境进行演练
  3. 对生产环境的演练采用无损演练方式
  4. 提前通知相关业务团队

Q3:如何评估灾备演练的效果?

A3:可以从以下几个维度评估灾备演练的效果:

  • 技术维度:RTO、RPO、数据完整性、系统可用性
  • 管理维度:团队响应时间、协作效率、文档准确性
  • 业务维度:业务连续性、用户体验、业务影响

Q4:灾备演练失败了怎么办?

A4:如果灾备演练失败,应该:

  1. 立即执行回滚计划,确保系统恢复正常
  2. 分析失败原因,记录问题和解决方案
  3. 修复问题后重新执行演练
  4. 更新文档,防止类似问题再次发生
  5. 通知相关团队,评估对业务的影响

Q5:如何自动化灾备演练?

A5:可以通过以下方式自动化灾备演练:

  1. 使用脚本自动模拟故障场景
  2. 使用工具自动执行切换和恢复操作
  3. 使用监控工具自动验证恢复结果
  4. 使用CI/CD工具定期触发演练
  5. 使用报告工具自动生成演练报告

Q6:灾备演练需要哪些文档支持?

A6:灾备演练需要以下文档支持:

  • 灾备架构文档:描述灾备系统的架构和组件
  • 灾备操作手册:详细的故障切换和恢复步骤
  • 演练计划文档:演练的目标、范围和执行步骤
  • 验证脚本文档:验证恢复结果的脚本和工具
  • 回滚计划文档:演练失败时的回滚步骤
  • 演练报告文档:演练的结果和评估