19.11.7 备份与灾备平台化实践案例
备份与灾备平台化实践案例围绕“可用、可控、可演练、可恢复”四个目标展开,覆盖数据、配置、镜像与平台状态的全栈保护。平台建设从业务分级与RPO/RTO定义入手,建立统一的备份策略库与资源编排规则,打通数据库、中间件、容器与虚拟化环境的备份链路,并形成标准化的灾备切换与回切流程。
平台原理草图如下,体现“作业编排—存储分层—审计可视化”的三层结构与多组件适配关系:
在策略设计上,按照核心业务、重要业务、一般业务进行分级,明确不同层级的备份频率、保留周期与加密要求。对MySQL采用全量+增量+binlog链路;对Redis采用RDB+AOF与主从复制叠加;对Kafka与ZooKeeper采用日志与快照双轨备份;对Nginx、Nacos等配置型组件进行Git化管理与配置快照存档,确保应用依赖可追溯。
一、安装与基础组件准备(示例)#
以备份调度端+对象存储为例,准备基础工具(Ubuntu 22.04):
# 1) 安装通用工具
sudo apt-get update
sudo apt-get install -y rsync jq unzip curl git
# 2) 安装 MinIO 作为对象存储(示例)
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio && sudo mv minio /usr/local/bin/
sudo useradd -r minio -s /sbin/nologin
sudo mkdir -p /data/minio
sudo chown -R minio:minio /data/minio
# 3) 启动 MinIO
sudo -u minio /usr/local/bin/minio server /data/minio --console-address ":9001"
# 预期效果:MinIO 控制台在 9001,API 在 9000
在控制台创建 bucket:backup-prod,后续示例写入对象存储。
二、MySQL 备份链路示例(全量 + binlog)#
1) 全量备份(xtrabackup)#
# 安装 Percona xtrabackup(Ubuntu 示例)
sudo apt-get install -y percona-xtrabackup-80
# 执行全量备份
sudo xtrabackup --backup \
--user=backup --password='Backup@123' \
--host=127.0.0.1 --port=3306 \
--target-dir=/backup/mysql/full/$(date +%F)
# 预期:生成备份目录与xtrabackup_checkpoints文件
2) binlog 归档与上传对象存储#
# MySQL 设置(/etc/mysql/mysql.conf.d/mysqld.cnf)
# log_bin = /var/log/mysql/mysql-bin
# binlog_expire_logs_seconds = 604800
# server_id = 1001
# 将 binlog 归档到对象存储(示例)
BINLOG_DIR=/var/log/mysql
ARCHIVE_DIR=/backup/mysql/binlog/$(date +%F)
mkdir -p $ARCHIVE_DIR
cp $BINLOG_DIR/mysql-bin.* $ARCHIVE_DIR
# 上传到 MinIO(使用 mc)
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc && sudo mv mc /usr/local/bin/
mc alias set myminio http://127.0.0.1:9000 minioadmin minioadmin
mc cp -r $ARCHIVE_DIR myminio/backup-prod/mysql/binlog/
3) 恢复演练(基于全量 + binlog)#
# 1) 准备恢复
sudo systemctl stop mysql
sudo rm -rf /var/lib/mysql/*
# 2) 准备备份
sudo xtrabackup --prepare --target-dir=/backup/mysql/full/2024-01-01
# 3) 恢复数据
sudo xtrabackup --copy-back --target-dir=/backup/mysql/full/2024-01-01
sudo chown -R mysql:mysql /var/lib/mysql
sudo systemctl start mysql
# 4) 应用 binlog
mysqlbinlog /backup/mysql/binlog/2024-01-01/mysql-bin.000123 | mysql -uroot -p
三、Redis 备份示例(RDB + AOF + 主从)#
1) 配置与持久化校验#
# /etc/redis/redis.conf
save 900 1
save 300 10
appendonly yes
appendfsync everysec
2) 备份并校验#
# 生成 RDB
redis-cli BGSAVE
# 复制快照与 AOF
cp /var/lib/redis/dump.rdb /backup/redis/
cp /var/lib/redis/appendonly.aof /backup/redis/
# 校验 RDB/AOF
redis-check-rdb /backup/redis/dump.rdb
redis-check-aof /backup/redis/appendonly.aof
四、Kafka + ZooKeeper 备份示例#
1) ZooKeeper 快照与事务日志#
# ZooKeeper 数据目录
# dataDir=/data/zk
# dataLogDir=/data/zk/log
tar -czf /backup/zk/zk-$(date +%F).tgz /data/zk /data/zk/log
2) Kafka 元数据与偏移备份(示例)#
# 备份 topic 与 ACL
kafka-topics.sh --bootstrap-server 127.0.0.1:9092 --list > /backup/kafka/topics.txt
kafka-acls.sh --bootstrap-server 127.0.0.1:9092 --list > /backup/kafka/acls.txt
# 备份 consumer group 偏移(示例)
kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 --list > /backup/kafka/groups.txt
五、Nginx / Nacos 配置 Git 化示例#
# Nginx 配置纳入 Git
cd /etc/nginx
git init
git add nginx.conf conf.d/
git commit -m "init nginx config snapshot"
# Nacos 配置导出(示例)
curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=app.yaml&group=DEFAULT_GROUP" \
-o /backup/nacos/app.yaml
六、Kubernetes 卷快照与镜像备份示例#
1) CSI 快照(以 VolumeSnapshot 为例)#
# /tmp/vs.yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: app-data-snap
spec:
volumeSnapshotClassName: csi-snapclass
source:
persistentVolumeClaimName: app-data-pvc
kubectl apply -f /tmp/vs.yaml
kubectl get volumesnapshot
2) 镜像仓库多副本同步(Harbor 示例)#
# 使用 Harbor replication policy(示例为 API 调用)
curl -u admin:Harbor12345 -X POST \
"https://harbor.local/api/v2.0/replication/executions" \
-H "Content-Type: application/json" \
-d '{"policy_id":1}'
七、灾备切换与回切示例(Keepalived + HAProxy)#
1) Keepalived 简化配置#
# /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
10.0.0.10
}
}
2) HAProxy 健康检查与切换#
# /etc/haproxy/haproxy.cfg
frontend fe_db
bind 10.0.0.10:3306
default_backend be_mysql
backend be_mysql
option tcp-check
server mysql1 10.0.0.11:3306 check
server mysql2 10.0.0.12:3306 check backup
3) 触发演练脚本(Jenkins/脚本示例)#
#!/bin/bash
# /opt/dr/trigger_failover.sh
set -e
echo "[DR] Start failover"
ssh root@10.0.0.12 "systemctl start mysql"
ssh root@10.0.0.11 "systemctl stop mysql"
echo "[DR] Failover done"
八、常见排错与定位(示例)#
1) MySQL 备份失败
# 查看 xtrabackup 日志
grep -i "error" /backup/mysql/full/*/xtrabackup_log
# 常见原因:权限不足或磁盘空间不足
df -h /backup
2) Redis 持久化报错
# 查看 Redis 日志
grep -i "AOF" /var/log/redis/redis-server.log
# 若AOF损坏,使用redis-check-aof修复
redis-check-aof --fix /backup/redis/appendonly.aof
3) K8s 快照卡住
kubectl describe volumesnapshot app-data-snap
# 检查 CSI 驱动与快照类
kubectl get volumesnapshotclass
4) 对象存储上传失败
mc ls myminio/backup-prod
# 检查网络/凭据
mc alias list
九、平台化治理指标与可观测#
关键指标:备份成功率、恢复成功率、备份窗口、恢复时间、数据一致性校验通过率。示例 Prometheus 监控(以备份任务成功数为例):
# /etc/prometheus/backup_rules.yml
groups:
- name: backup_rules
rules:
- record: backup_job_success_rate
expr: sum(backup_job_success_total) / sum(backup_job_total)
十、练习与实操任务#
1) MySQL 演练:完成一次全量备份+binlog恢复,验证数据一致性(对比行数)。
2) Redis 演练:创建 RDB+AOF 备份并在测试节点恢复。
3) K8s 演练:对 PVC 创建快照并恢复到新 PVC,挂载到新 Pod 验证数据。
4) 演练报告:记录 RPO/RTO 实测值、失败原因与改进措施。
通过“策略制定—自动化执行—监控审计—演练验证—持续优化”的闭环能力,保障多中间件、多平台环境下的稳定恢复与业务连续性。