深色模式
中间件备份
摘要:中间件备份的重点不是数据文件本身,而是"配置 + 元数据 + 拓扑"——丢了大不了重灌数据,丢了配置就无从恢复。本文给出各组件的备份清单、脚本化备份方式与恢复演练步骤。
适用环境
bash
# 明确各组件的配置与数据目录
sudo nginx -V 2>&1 | tr ' ' '\n' | grep 'conf-path'
ls /opt/kafka/config /data/kafka-logs
sudo rabbitmqctl status | grep -i 'config files\|data dir'
ls /opt/zookeeper/conf /data/zookeeper
# 备份目标目录(应与生产机隔离)
df -h /backup1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
操作步骤
1. 建立备份清单
| 组件 | 必备份内容 | 位置 |
|---|---|---|
| Nginx | 全部 conf、证书、日志格式 | /etc/nginx/ |
| Kafka | broker 配置、Topic 定义、消费者组位点 | config/、kafka-topics.sh 导出 |
| RabbitMQ | 定义导出(exchange/queue/binding/policy/user) | rabbitmqctl export_definitions |
| ZooKeeper | zoo.cfg、myid、快照与事务日志 | conf/、dataDir/ |
| Elasticsearch | 索引模板、ILM 策略、快照仓库配置 | SLM 快照 |
2. 备份 Nginx 配置与证书
bash
sudo tar -czf /backup/nginx-$(date +%F).tar.gz /etc/nginx1
3. 导出 RabbitMQ 定义
bash
sudo rabbitmqctl export_definitions /backup/rabbitmq-defs-$(date +%F).json
# 或只导出用户与权限
sudo rabbitmqctl list_users -q > /backup/rabbitmq-users-$(date +%F).txt1
2
3
2
3
4. 导出 Kafka 元数据
bash
# Topic 列表与分区副本分布
/opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe \
> /backup/kafka-topics-$(date +%F).txt
# 消费者组位点(恢复后可精确接着消费)
/opt/kafka/bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--all-groups --describe > /backup/kafka-offsets-$(date +%F).txt 2>/dev/null1
2
3
4
5
6
7
2
3
4
5
6
7
5. 备份 ZooKeeper 元数据
bash
sudo tar -czf /backup/zookeeper-conf-$(date +%F).tar.gz /opt/zookeeper/conf /data/zookeeper/data/myid
# 快照可热拷贝(ZooKeeper 快照文件本身是自洽的)
cp /data/zookeeper/data/version-2/snapshot.* /backup/ 2>/dev/null || true1
2
3
2
3
6. Elasticsearch 快照仓库
bash
# 注册共享文件系统仓库(所有节点必须挂载同一路径)
curl -k -u elastic:'密码' -X PUT 'https://127.0.0.1:9200/_snapshot/backup_repo' \
-H 'Content-Type: application/json' -d '
{ "type": "fs", "settings": { "location": "/mnt/es-backup", "compress": true } }'
# 创建快照
curl -k -u elastic:'密码' -X PUT 'https://127.0.0.1:9200/_snapshot/backup_repo/snap-2026-10-09?wait_for_completion=true'1
2
3
4
5
6
7
2
3
4
5
6
7
7. 定时备份脚本 + 远程留存
bash
cat > /usr/local/bin/mw_backup.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
D=/backup/$(date +%F); mkdir -p "$D"
tar -czf "$D/nginx.tar.gz" /etc/nginx
sudo rabbitmqctl export_definitions "$D/rabbitmq.json"
/opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe > "$D/kafka-topics.txt"
# 同步到远端对象存储/备份机
rsync -az --delete "$D/" backup@10.0.0.9:/backup/middleware/$(date +%F)/
# 保留本地 14 天
find /backup -maxdepth 1 -type d -mtime +14 -exec rm -rf {} +
EOF
chmod +x /usr/local/bin/mw_backup.sh
echo "0 3 * * * /usr/local/bin/mw_backup.sh >> /var/log/mw_backup.log 2>&1" | sudo tee /etc/cron.d/mw_backup1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
DANGER
备份脚本里的 find ... -mtime +14 -exec rm -rf 是破坏性操作。请先用 echo 或 -print 试运行确认匹配范围,避免路径写错误删生产目录。
8. 恢复演练(每季度一次)
bash
# Nginx:解压到临时目录,nginx -t -c 验证可用
tar -xzf /backup/nginx.tar.gz -C /tmp/restore && nginx -t -c /tmp/restore/etc/nginx/nginx.conf
# RabbitMQ:导入定义到测试集群
sudo rabbitmqctl import_definitions /backup/rabbitmq-defs.json
# ES:从快照恢复到临时索引验证
curl -k -u elastic:'密码' -X POST 'https://127.0.0.1:9200/_snapshot/backup_repo/snap-2026-10-09/_restore' \
-H 'Content-Type: application/json' -d '{"indices":"logs-*","rename_pattern":"(.+)","rename_replacement":"restored-$1"}'1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
验证
bash
# 1) 备份文件是否生成且非空
ls -lh /backup/$(date +%F)/ && find /backup -type f -size -1k
# 2) 归档完整性
tar -tzf /backup/$(date +%F)/nginx.tar.gz >/dev/null && echo "archive OK"
# 3) 快照状态
curl -k -u elastic:'密码' 'https://127.0.0.1:9200/_snapshot/backup_repo/_all?pretty' | head -20
# 4) 定时任务是否触发过
sudo grep -c mw_backup /var/log/cron 2>/dev/null || tail -5 /var/log/mw_backup.log1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
常见坑
WARNING
只在本地生成备份文件不算备份。机器宕机或磁盘损坏时本地备份一起丢失,务必 rsync/对象存储做异地留存。
WARNING
Kafka 的"备份"常被误解为备份消息数据。实际上消息本身由多副本保障,真正要备份的是 Topic 结构、配置与消费位点,否则重建后无法找回消费进度。
DANGER
从未验证过的备份等于没有备份。归档损坏、权限丢失、版本不兼容等问题只有在恢复时才会暴露,必须定期做真实恢复演练并记录结果。