11.10.7 备份恢复与灾备演练规范
围绕 ZooKeeper 集群的数据安全与业务连续性,建立“备份—校验—恢复—演练—复盘”的闭环规范,确保在误删、磁盘故障、网络分区、机房级故障等场景下可快速恢复并降低一致性风险。
备份策略与周期(含安装与示例)
- 备份目标:数据目录(dataDir、dataLogDir)、配置文件(zoo.cfg)、证书与密钥、ACL/认证配置、审计日志。
- 分层备份:日常增量 + 周期全量;变更前手工快照。
- 保留策略:至少 7–14 天滚动备份,关键业务保留月度快照。
- 备份介质:本地 + 异地对象存储/灾备机房双写。
安装与目录确认示例(以 3.7.x 为例):
# 1) 安装(示例使用 tar 包方式)
mkdir -p /opt/zookeeper && cd /opt/zookeeper
tar -zxvf apache-zookeeper-3.7.2-bin.tar.gz
ln -s apache-zookeeper-3.7.2-bin current
# 2) 配置文件与数据目录(检查)
grep -E 'dataDir|dataLogDir' /opt/zookeeper/current/conf/zoo.cfg
# 期望输出类似:
# dataDir=/data/zk/data
# dataLogDir=/data/zk/datalog
# 3) 查看运行状态(确认 Leader/Follower)
/opt/zookeeper/current/bin/zkServer.sh status
# 期望输出:Mode: leader 或 Mode: follower
手工备份脚本(快照+日志+配置+校验):
cat >/usr/local/bin/zk_backup.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
ZK_HOME=/opt/zookeeper/current
DATA_DIR=/data/zk/data
LOG_DIR=/data/zk/datalog
CONF_DIR=$ZK_HOME/conf
BACKUP_BASE=/backup/zk
TS=$(date +%F_%H%M%S)
BK_DIR=$BACKUP_BASE/$TS
mkdir -p "$BK_DIR"
# 1) 备份快照与事务日志
rsync -a "$DATA_DIR"/ "$BK_DIR/data/"
rsync -a "$LOG_DIR"/ "$BK_DIR/datalog/"
# 2) 备份配置与证书(按实际路径调整)
rsync -a "$CONF_DIR"/ "$BK_DIR/conf/"
rsync -a /etc/ssl/zk/ "$BK_DIR/ssl/" 2>/dev/null || true
# 3) 校验和
( cd "$BK_DIR" && find . -type f -exec sha256sum {} \; > SHA256SUMS )
# 4) 元数据记录
{
echo "time=$TS"
echo "host=$(hostname)"
echo "mode=$($ZK_HOME/bin/zkServer.sh status 2>/dev/null | tail -1)"
echo "dataDir=$DATA_DIR"
echo "dataLogDir=$LOG_DIR"
} > "$BK_DIR/metadata.txt"
EOF
chmod +x /usr/local/bin/zk_backup.sh
# 执行一次备份
/usr/local/bin/zk_backup.sh
# 期望结果:/backup/zk/2024-..../ 生成 data/ datalog/ conf/ SHA256SUMS metadata.txt
备份一致性与完整性(校验示例)
- 快照与事务日志需成对保存,避免仅快照导致回放不完整。
- 使用校验和与抽样查询验证关键路径。
校验示例:
# 校验备份文件完整性
cd /backup/zk/2024-01-01_020000
sha256sum -c SHA256SUMS
# 期望输出:所有文件 OK
# 抽样验证(恢复前也建议做)
/opt/zookeeper/current/bin/zkCli.sh -server 127.0.0.1:2181 <<'EOF'
ls /
get /config
EOF
# 期望:关键节点存在且可读
恢复流程规范(单节点与集群)
- 恢复前评估 RPO/RTO,明确恢复点。
- 单节点恢复:停止服务→清空数据目录→恢复快照与日志→启动并观察选主与同步。
- 集群恢复:
- 轻度故障:逐节点恢复,保持多数派存活。
- 重度故障:重建集群后导入备份。
单节点恢复示例:
# 1) 停止服务
/opt/zookeeper/current/bin/zkServer.sh stop
# 2) 清空旧数据(谨慎)
rm -rf /data/zk/data/* /data/zk/datalog/*
# 3) 恢复备份
rsync -a /backup/zk/2024-01-01_020000/data/ /data/zk/data/
rsync -a /backup/zk/2024-01-01_020000/datalog/ /data/zk/datalog/
# 4) 启动服务
/opt/zookeeper/current/bin/zkServer.sh start
# 5) 验证状态与同步
/opt/zookeeper/current/bin/zkServer.sh status
# 期望输出:Mode: follower 或 leader
# 6) 验证关键节点
/opt/zookeeper/current/bin/zkCli.sh -server 127.0.0.1:2181 <<'EOF'
ls /
get /config
EOF
集群逐节点恢复参考(保持多数派):
# 在 follower 节点依次执行,避免一次性全停
for host in zk2 zk3; do
ssh $host '/opt/zookeeper/current/bin/zkServer.sh stop'
ssh $host 'rm -rf /data/zk/data/* /data/zk/datalog/*'
ssh $host 'rsync -a /backup/zk/2024-01-01_020000/data/ /data/zk/data/'
ssh $host 'rsync -a /backup/zk/2024-01-01_020000/datalog/ /data/zk/datalog/'
ssh $host '/opt/zookeeper/current/bin/zkServer.sh start'
ssh $host '/opt/zookeeper/current/bin/zkServer.sh status'
done
灾备架构与演练要求(架构草图与演练脚本)
- 跨机房部署与投票权分布,保证多数派可选主。
- 定义冷备/温备/热备,明确切换触发与审批流程。
演练脚本示例(网络隔离模拟):
# 在 zk1 上模拟与 zk3 隔离(仅示例,按网络实际调整)
iptables -A OUTPUT -d 10.0.2.3 -p tcp --dport 2888:3888 -j DROP
sleep 10
/opt/zookeeper/current/bin/zkServer.sh status
# 期望:集群仍能选主,多数派存活
# 回滚
iptables -D OUTPUT -d 10.0.2.3 -p tcp --dport 2888:3888 -j DROP
排错要点(含命令解释)
- zkServer.sh status:查看节点角色与运行状态。
- 日志定位:/data/zk/datalog 与 zookeeper.out。
- 常见问题:
- 启动失败:检查 dataDir/dataLogDir 权限与残留文件。
- 选主失败:检查 server.X 配置与 myid 一致性。
- 数据不一致:确认快照与事务日志是否成对恢复。
排错命令示例:
# 查看最近 200 行日志
tail -n 200 /opt/zookeeper/current/zookeeper.out
# 检查 myid
cat /data/zk/data/myid
# 校验配置一致性(集群中所有节点一致)
grep -E '^server\.' /opt/zookeeper/current/conf/zoo.cfg
变更与权限控制
- 备份与恢复需审批与双人复核,全程审计。
- 恢复介质与密钥使用最小权限原则。
标准化文档与复盘
- 输出 SOP 与应急预案,包含清单、步骤、验证点与回滚点。
- 每次演练/故障恢复后更新 RPO/RTO 与自动化脚本。
练习题
1. 编写一个定时备份脚本,要求:每日 02:00 执行、保留 14 天、上传到对象存储。
2. 模拟单节点磁盘故障,完成单节点恢复并验证关键节点数据一致性。
3. 设计并演练“机房A网络隔离”的切换流程,记录 RTO 与业务影响。