CentOS 上 RabbitMQ 的备份与恢复
一 关键目录与前置检查
二 备份策略与步骤
三 恢复方法与场景对照
| 场景 | 恢复步骤要点 |
|---|---|
| 仅元数据丢失/误删(队列/交换机/用户等) | 使用已导出的 definitions.json:先 rabbitmqctl stop_app → rabbitmqctl import_definitions /path/to/definitions.json → rabbitmqctl start_app;若通过 HTTP API 导入,确保 Basic Auth 与 Content-Type 正确。 |
| 节点数据目录损坏或磁盘故障 | 停止服务 → 备份当前 mnesia 目录(可选) → 将备份的 |
| 迁移到新机器/新节点名 | 在新机器安装同版本 RabbitMQ,先确保节点名一致(通过 /etc/rabbitmq/rabbitmq-env.conf 的 NODENAME 或主机名保持一致);若必须改名,先在旧节点使用 rabbitmqctl rename_cluster_node |
| Docker 部署 | 备份:docker exec <容器名> tar czf /backup/rabbitmq_backup.tar.gz -C /var/lib/rabbitmq .;恢复:先停容器,清理或覆盖挂载目录,再 docker exec <容器名> tar xzf /backup/rabbitmq_backup.tar.gz -C /;最后启动容器并校验。 |
四 实用脚本与定时任务
#!/usr/bin/env bash
set -e
BACKUP_DIR="/backup/rabbitmq"
DATE=$(date +%F)
NODE_NAME=$(rabbitmqctl eval 'node()' | sed 's/"//g')
mkdir -p "$BACKUP_DIR"
systemctl stop rabbitmq-server
tar czvf "$BACKUP_DIR/rabbitmq-mnesia-${NODE_NAME}-${DATE}.tar.gz" \
-C /var/lib/rabbitmq/mnesia "$NODE_NAME"
tar czvf "$BACKUP_DIR/rabbitmq-config-${DATE}.tar.gz" -C /etc rabbitmq
systemctl start rabbitmq-server
# 可选:同步到远端
# rsync -avz "$BACKUP_DIR/" user@remote:/backup/rabbitmq/
# 可选:清理30天前备份
# find "$BACKUP_DIR" -name "*.tar.gz" -mtime +30 -delete
0 2 * * * /usr/bin/flock -n /tmp/rabbitmq-backup.lock /path/to/backup.sh
# 备份
wget --user=admin --password=YourPass \
-O /backup/defs-$(date +%F).json \
http://127.0.0.1:15672/api/definitions
# 清理30天前
find /backup -name "defs-*.json" -mtime +30 -delete
rabbitmqctl stop_app
rabbitmqctl import_definitions /backup/defs-2026-01-01.json
rabbitmqctl start_app
systemctl stop rabbitmq-server
tar xzvf /backup/rabbitmq-mnesia-rabbit@host-2026-01-01.tar.gz -C /var/lib/rabbitmq/mnesia
chown -R rabbitmq:rabbitmq /var/lib/rabbitmq
systemctl start rabbitmq-server
说明:API 备份需为管理用户启用权限;脚本中的 NODE_NAME 与目录名需与实际一致;生产环境建议先演练并保留多份异地副本。
五 注意事项与常见问题