外观
PostgreSQL 灾备演练计划
演练目标
主要目标
- 验证灾备系统的有效性:确保灾备系统能够按照预期工作
- 测试恢复时间目标(RTO):验证是否能够在预定时间内恢复服务
- 测试恢复点目标(RPO):验证数据丢失是否在可接受范围内
- 评估团队应急响应能力:测试团队在灾难情况下的协作和响应能力
- 发现并解决潜在问题:识别灾备系统中存在的隐患和问题
- 验证文档的准确性:确保灾备文档的准确性和可操作性
具体目标
| 目标类型 | 具体目标 | 衡量标准 |
|---|---|---|
| 技术目标 | 验证主备切换功能 | 主库故障后,备库能够在5分钟内接管服务 |
| 技术目标 | 验证数据恢复完整性 | 恢复后数据完整性100%,无丢失 |
| 技术目标 | 验证应用切换功能 | 应用能够自动或手动切换到备库,切换时间<3分钟 |
| 管理目标 | 验证团队响应时间 | 从故障发生到开始恢复的时间<5分钟 |
| 管理目标 | 验证文档有效性 | 按照文档执行,无需额外咨询即可完成恢复 |
演练范围
系统范围
- 数据库系统:PostgreSQL主库和备库
- 应用系统:依赖于PostgreSQL的核心业务应用
- 网络系统:数据库和应用之间的网络连接
- 存储系统:数据库存储和备份存储
- 监控系统:监控数据库和应用的状态
演练场景
| 演练场景 | 描述 | 优先级 |
|---|---|---|
| 主库硬件故障 | 模拟主库服务器硬件故障,测试备库接管 | 高 |
| 主库软件故障 | 模拟主库数据库软件崩溃,测试备库接管 | 高 |
| 网络故障 | 模拟主库与备库之间的网络中断,测试故障切换 | 中 |
| 存储故障 | 模拟主库存储故障,测试从备份恢复 | 中 |
| 人为误操作 | 模拟误删除数据,测试从备份恢复到指定时间点 | 中 |
演练准备
人员准备
| 角色 | 职责 | 人员 |
|---|---|---|
| 演练负责人 | 负责演练的整体协调和管理 | 张三 |
| 数据库管理员 | 负责数据库的故障模拟、恢复操作 | 李四 |
| 应用管理员 | 负责应用的切换和验证 | 王五 |
| 网络管理员 | 负责网络的配置和故障模拟 | 赵六 |
| 监控管理员 | 负责监控系统的配置和状态查看 | 孙七 |
| 业务验证人员 | 负责业务功能的验证 | 周八 |
环境准备
生产环境准备
- 确保主备数据库正常运行
- 确认备份系统正常工作
- 验证监控系统能够正常监控主备状态
- 通知相关业务团队,避免影响正常业务
测试环境准备
- 准备与生产环境类似的测试环境
- 部署相同版本的PostgreSQL和应用
- 准备测试数据和测试用例
- 确保测试环境与生产环境隔离
文档准备
- 灾备架构文档:详细描述灾备系统的架构和组件
- 灾备操作手册:详细的故障切换和恢复步骤
- 演练脚本:自动化演练的脚本和工具
- 验证脚本:验证恢复结果的脚本和工具
- 回滚计划:演练失败时的回滚步骤
工具准备
| 工具类型 | 具体工具 | 用途 |
|---|---|---|
| 监控工具 | 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分钟 |
| 团队协作 | 评估团队成员的协作情况 | 沟通顺畅,职责明确 |
| 文档准确性 | 对比文档与实际操作 | 文档准确,可操作 |
| 问题处理 | 记录演练中遇到的问题 | 问题得到及时解决 |
演练评估与改进
演练评估
技术评估
| 评估项 | 实际结果 | 目标结果 | 差距 | 改进建议 |
|---|---|---|---|---|
| RTO | 25分钟 | 30分钟 | 达标 | 保持当前配置 |
| RPO | 0数据丢失 | 0数据丢失 | 达标 | 保持当前备份策略 |
| 数据完整性 | 100%完整 | 100%完整 | 达标 | 保持当前验证方法 |
| 应用可用性 | 99.9% | 99.9% | 达标 | 保持当前监控策略 |
管理评估
| 评估项 | 评估结果 | 改进建议 |
|---|---|---|
| 团队响应 | 响应及时,协作良好 | 定期组织培训,提高团队技能 |
| 文档质量 | 文档准确,可操作 | 定期更新文档,确保与实际环境一致 |
| 沟通机制 | 沟通顺畅,信息及时 | 保持当前沟通机制 |
改进计划
短期改进(1-2周)
- 修复演练中发现的配置问题
- 更新灾备文档,补充遗漏的步骤
- 优化监控告警规则,提高告警准确性
中期改进(1-2个月)
- 自动化演练流程,减少手动操作
- 优化灾备架构,提高RTO和RPO指标
- 组织团队培训,提高应急响应能力
长期改进(3-6个月)
- 建立灾备演练的定期机制
- 引入混沌工程,提高系统的韧性
- 优化灾备成本,提高ROI
演练报告
报告结构
- 基本信息:演练的背景和基本情况
- 演练目标:演练的主要目标和具体目标
- 演练范围:演练涉及的系统和场景
- 演练执行:演练的具体步骤和执行情况
- 验证结果:演练的验证结果和评估
- 问题和改进:演练中发现的问题和改进建议
- 后续建议:演练的总结和后续行动计划
报告示例
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:合理规划的灾备演练不会影响生产业务:
- 选择业务低峰期执行演练
- 使用独立的测试环境进行演练
- 对生产环境的演练采用无损演练方式
- 提前通知相关业务团队
Q3:如何评估灾备演练的效果?
A3:可以从以下几个维度评估灾备演练的效果:
- 技术维度:RTO、RPO、数据完整性、系统可用性
- 管理维度:团队响应时间、协作效率、文档准确性
- 业务维度:业务连续性、用户体验、业务影响
Q4:灾备演练失败了怎么办?
A4:如果灾备演练失败,应该:
- 立即执行回滚计划,确保系统恢复正常
- 分析失败原因,记录问题和解决方案
- 修复问题后重新执行演练
- 更新文档,防止类似问题再次发生
- 通知相关团队,评估对业务的影响
Q5:如何自动化灾备演练?
A5:可以通过以下方式自动化灾备演练:
- 使用脚本自动模拟故障场景
- 使用工具自动执行切换和恢复操作
- 使用监控工具自动验证恢复结果
- 使用CI/CD工具定期触发演练
- 使用报告工具自动生成演练报告
Q6:灾备演练需要哪些文档支持?
A6:灾备演练需要以下文档支持:
- 灾备架构文档:描述灾备系统的架构和组件
- 灾备操作手册:详细的故障切换和恢复步骤
- 演练计划文档:演练的目标、范围和执行步骤
- 验证脚本文档:验证恢复结果的脚本和工具
- 回滚计划文档:演练失败时的回滚步骤
- 演练报告文档:演练的结果和评估
