disaster-recovery
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chinese灾难恢复
灾难恢复
概述
概述
灾难恢复计划、RTO/RPO、故障切换技能。
灾难恢复计划、RTO/RPO、故障切换技能。
核心概念
核心概念
RTO 与 RPO
RTO 与 RPO
RPO (Recovery Point Objective)
- 可接受的数据丢失量
- 决定备份频率
RTO (Recovery Time Objective)
- 可接受的恢复时间
- 决定恢复策略
示例:
- RPO = 1小时 → 每小时备份
- RTO = 4小时 → 需要热备或快速恢复RPO (Recovery Point Objective)
- 可接受的数据丢失量
- 决定备份频率
RTO (Recovery Time Objective)
- 可接受的恢复时间
- 决定恢复策略
示例:
- RPO = 1小时 → 每小时备份
- RTO = 4小时 → 需要热备或快速恢复恢复策略
恢复策略
冷备 (Cold)
- 最低成本
- 最长 RTO
- 适合非关键系统
温备 (Warm)
- 中等成本
- 中等 RTO
- 定期同步数据
热备 (Hot)
- 最高成本
- 最短 RTO
- 实时同步冷备 (Cold)
- 最低成本
- 最长 RTO
- 适合非关键系统
温备 (Warm)
- 中等成本
- 中等 RTO
- 定期同步数据
热备 (Hot)
- 最高成本
- 最短 RTO
- 实时同步数据库恢复
数据库恢复
MySQL 恢复
MySQL 恢复
bash
undefinedbash
undefined从备份恢复
从备份恢复
mysql -u root -p < full_backup.sql
mysql -u root -p < full_backup.sql
应用 binlog
应用 binlog
mysqlbinlog mysql-bin.000001 | mysql -u root -p
mysqlbinlog mysql-bin.000001 | mysql -u root -p
时间点恢复
时间点恢复
mysqlbinlog --stop-datetime="2024-01-15 10:00:00" mysql-bin.* | mysql -u root -p
mysqlbinlog --stop-datetime="2024-01-15 10:00:00" mysql-bin.* | mysql -u root -p
主从切换
主从切换
在从库执行
在从库执行
STOP SLAVE;
RESET SLAVE ALL;
STOP SLAVE;
RESET SLAVE ALL;
应用程序切换连接
应用程序切换连接
undefinedundefinedPostgreSQL 恢复
PostgreSQL 恢复
bash
undefinedbash
undefined从备份恢复
从备份恢复
pg_restore -d database backup.dump
pg_restore -d database backup.dump
PITR 恢复
PITR 恢复
recovery.conf
recovery.conf
restore_command = 'cp /archive/%f %p'
recovery_target_time = '2024-01-15 10:00:00'
restore_command = 'cp /archive/%f %p'
recovery_target_time = '2024-01-15 10:00:00'
主从切换
主从切换
pg_ctl promote -D /var/lib/postgresql/data
undefinedpg_ctl promote -D /var/lib/postgresql/data
undefinedRedis 恢复
Redis 恢复
bash
undefinedbash
undefined从 RDB 恢复
从 RDB 恢复
cp backup.rdb /var/lib/redis/dump.rdb
systemctl restart redis
cp backup.rdb /var/lib/redis/dump.rdb
systemctl restart redis
从 AOF 恢复
从 AOF 恢复
cp backup.aof /var/lib/redis/appendonly.aof
redis-check-aof --fix appendonly.aof
systemctl restart redis
undefinedcp backup.aof /var/lib/redis/appendonly.aof
redis-check-aof --fix appendonly.aof
systemctl restart redis
undefined系统恢复
系统恢复
文件系统恢复
文件系统恢复
bash
undefinedbash
undefined从 tar 备份恢复
从 tar 备份恢复
tar -xzvf /backup/system.tar.gz -C /
tar -xzvf /backup/system.tar.gz -C /
从 rsync 备份恢复
从 rsync 备份恢复
rsync -avz /backup/system/ /
rsync -avz /backup/system/ /
恢复权限
恢复权限
restorecon -Rv /
undefinedrestorecon -Rv /
undefined引导修复
引导修复
bash
undefinedbash
undefined进入救援模式
进入救援模式
挂载根分区
挂载根分区
mount /dev/sda1 /mnt
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt
mount /dev/sda1 /mnt
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt
修复 GRUB
修复 GRUB
grub-install /dev/sda
update-grub
undefinedgrub-install /dev/sda
update-grub
undefined故障切换
故障切换
Keepalived 切换
Keepalived 切换
bash
undefinedbash
undefined检查状态
检查状态
systemctl status keepalived
ip addr show | grep -w inet
systemctl status keepalived
ip addr show | grep -w inet
手动切换
手动切换
降低主节点优先级
降低主节点优先级
/etc/keepalived/keepalived.conf
/etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
priority 50 # 降低
}
systemctl reload keepalived
undefinedvrrp_instance VI_1 {
priority 50 # 降低
}
systemctl reload keepalived
undefinedDNS 切换
DNS 切换
bash
undefinedbash
undefined修改 DNS 记录
修改 DNS 记录
降低 TTL(提前)
降低 TTL(提前)
切换 A 记录指向备用 IP
切换 A 记录指向备用 IP
验证
验证
dig +short example.com
nslookup example.com
undefineddig +short example.com
nslookup example.com
undefined常见场景
常见场景
场景 1:完整恢复流程
场景 1:完整恢复流程
bash
#!/bin/bashbash
#!/bin/bash1. 评估损失
1. 评估损失
echo "检查系统状态..."
echo "检查系统状态..."
2. 通知相关人员
2. 通知相关人员
send_alert "开始灾难恢复"
send_alert "开始灾难恢复"
3. 恢复基础设施
3. 恢复基础设施
echo "恢复网络配置..."
echo "恢复网络配置..."
4. 恢复数据
4. 恢复数据
echo "恢复数据库..."
mysql -u root -p < /backup/latest.sql
echo "恢复数据库..."
mysql -u root -p < /backup/latest.sql
5. 恢复应用
5. 恢复应用
echo "启动应用服务..."
systemctl start application
echo "启动应用服务..."
systemctl start application
6. 验证
6. 验证
echo "验证服务状态..."
curl -s http://localhost/health
echo "验证服务状态..."
curl -s http://localhost/health
7. 通知恢复完成
7. 通知恢复完成
send_alert "灾难恢复完成"
send_alert "灾难恢复完成"
undefinedundefined场景 2:DR 演练
场景 2:DR 演练
bash
#!/bin/bashbash
#!/bin/bashDR 演练脚本
DR 演练脚本
LOG="/var/log/dr-drill.log"
echo "$(date): 开始 DR 演练" >> $LOG
LOG="/var/log/dr-drill.log"
echo "$(date): 开始 DR 演练" >> $LOG
1. 切换到备用站点
1. 切换到备用站点
echo "切换 DNS..." >> $LOG
echo "切换 DNS..." >> $LOG
2. 验证服务
2. 验证服务
echo "验证服务可用性..." >> $LOG
curl -s http://dr-site/health >> $LOG
echo "验证服务可用性..." >> $LOG
curl -s http://dr-site/health >> $LOG
3. 测试数据一致性
3. 测试数据一致性
echo "验证数据一致性..." >> $LOG
echo "验证数据一致性..." >> $LOG
4. 记录 RTO
4. 记录 RTO
echo "实际 RTO: $(计算时间)" >> $LOG
echo "实际 RTO: $(计算时间)" >> $LOG
5. 切回主站点
5. 切回主站点
echo "切回主站点..." >> $LOG
undefinedecho "切回主站点..." >> $LOG
undefined场景 3:自动故障转移
场景 3:自动故障转移
bash
undefinedbash
undefinedKeepalived 配置
Keepalived 配置
vrrp_script chk_app {
script "/usr/local/bin/check_app.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
track_script {
chk_app
}
virtual_ipaddress {
192.168.1.100
}}
undefinedvrrp_script chk_app {
script "/usr/local/bin/check_app.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
track_script {
chk_app
}
virtual_ipaddress {
192.168.1.100
}}
undefinedDR 检查清单
DR 检查清单
| 项目 | 检查内容 |
|---|---|
| 备份 | 备份完整性、可恢复性 |
| 文档 | 恢复步骤、联系人 |
| 网络 | DNS、IP、防火墙 |
| 数据 | 数据一致性、同步状态 |
| 应用 | 配置、依赖、证书 |
| 项目 | 检查内容 |
|---|---|
| 备份 | 备份完整性、可恢复性 |
| 文档 | 恢复步骤、联系人 |
| 网络 | DNS、IP、防火墙 |
| 数据 | 数据一致性、同步状态 |
| 应用 | 配置、依赖、证书 |
故障排查
故障排查
bash
undefinedbash
undefined检查备份状态
检查备份状态
ls -la /backup/
md5sum /backup/latest.tar.gz
ls -la /backup/
md5sum /backup/latest.tar.gz
检查复制状态
检查复制状态
MySQL
MySQL
SHOW SLAVE STATUS\G
SHOW SLAVE STATUS\G
PostgreSQL
PostgreSQL
SELECT * FROM pg_stat_replication;
SELECT * FROM pg_stat_replication;
检查网络连通性
检查网络连通性
ping dr-site
traceroute dr-site
undefinedping dr-site
traceroute dr-site
undefined