メインコンテンツまでスキップ

RabbitMQ の手動 backup と restore

プラットフォームの backup は 2026年9月15日に RabbitMQ から削除されたため、cluster の設定を守るのはお客様自身の運用になりました。このページでは Management HTTP API で definitions を export し、ファイルが完全かを確認したうえで、新しい cluster へ import します。

警告

この方法で backup されるのは definitions だけ です。vhost、user、permission、exchange、queue、binding、policy が対象で、queue に残っているメッセージは含まれず、この方法では復旧できません。

対象は Erlang 26.x 上の RabbitMQ 3.13.x です。

definitions に含まれるもの​

構成要素内容
vhost仮想ホスト
user と permissionアカウントとアクセス権
exchangedirect、topic、fanout、headers
queuequeue の宣言と argument
bindingexchange と queue の結びつき
policyTTL、HA、max-length、dead-letter など

仕組み​

すべての操作は backup server から行います。これはお客様が管理する VM で、RabbitMQ の cluster へ port 15672 で到達できるものです。Management HTTP API を直接呼ぶため、cluster 側には何もインストールせず、ノードを停止することもありません。

フェーズ処理内容
Backupbackup server が元の cluster の GET /api/definitions を呼び、JSON を保存します
Restorebackup server が保存済みファイルを対象 cluster の POST /api/definitions へ送ります

restore の間、元の cluster にはまったくアクセスしません。

前提条件​

項目要件
ネットワークbackup server から cluster へ port 15672 で到達できること
アカウントadministrator タグを持つ user
対象バージョンrestore 時、対象 cluster の RabbitMQ バージョンが元の cluster 以上であること
Erlang バージョン元の cluster と揃えることを推奨します

以下のコマンドで使う placeholder は次のとおりです。<HOST> は元の cluster のアドレス、<TARGET_HOST> は対象 cluster、<USERNAME> と <PASSWORD> は administrator の認証情報、<VHOST_NAME> は vhost 名、<TIMESTAMP> は保存したファイル名に入る時刻、<RABBITMQ_HOST> はスケジュール実行するスクリプトが読み込むアドレスです。

definitions を backup する​

cluster 全体を export する​

curl -s \
-u '<USERNAME>:<PASSWORD>' \
http://<HOST>:15672/api/definitions \
-o /backup/rabbitmq/rabbitmq_definitions_$(date +%Y%m%d_%H%M%S).json

例:

curl -s \
-u 'admin:your_password' \
http://10.0.1.10:15672/api/definitions \
-o /backup/rabbitmq/rabbitmq_definitions_$(date +%Y%m%d_%H%M%S).json

vhost 単位で export する​

curl -s \
-u '<USERNAME>:<PASSWORD>' \
'http://<HOST>:15672/api/definitions/<VHOST_NAME>' \
-o /backup/rabbitmq/rabbitmq_vhost_<VHOST_NAME>_$(date +%Y%m%d_%H%M%S).json

例 — vhost app_production を backup する場合:

curl -s \
-u 'admin:your_password' \
'http://10.0.1.10:15672/api/definitions/app_production' \
-o /backup/rabbitmq/rabbitmq_vhost_production_$(date +%Y%m%d_%H%M%S).json
警告

vhost 単位の export には user と global parameter が含まれません。移行用のファイルとして使う場合は、cluster 全体の export を使ってください。

使う前にファイルを検証する​

エラーページが返ってきた場合もファイルとしてはディスクに残るため、中身の件数を数えて確認します。

python3 << 'EOF'
import json

with open("/backup/rabbitmq/rabbitmq_definitions_<TIMESTAMP>.json") as f:
d = json.load(f)

print(f"Vhosts: {len(d.get('vhosts', []))}")
print(f"Users: {len(d.get('users', []))}")
print(f"Exchanges: {len(d.get('exchanges', []))}")
print(f"Queues: {len(d.get('queues', []))}")
print(f"Bindings: {len(d.get('bindings', []))}")
print(f"Policies: {len(d.get('policies', []))}")
EOF

件数が元の cluster と一致していることを確認します。

Vhosts:      4
Users: 5
Exchanges: 5
Queues: 8
Bindings: 8
Policies: 3

新しい cluster へ restore する​

ファイルを import する​

curl -s -X POST \
-u '<USERNAME>:<PASSWORD>' \
-H "Content-Type: application/json" \
-d @/backup/rabbitmq/rabbitmq_definitions_<TIMESTAMP>.json \
http://<TARGET_HOST>:15672/api/definitions

例:

curl -s -X POST \
-u 'admin:your_password' \
-H "Content-Type: application/json" \
-d @/backup/rabbitmq/rabbitmq_definitions_20260519_020001.json \
http://10.0.2.10:15672/api/definitions

レスポンスコードを確認する​

import が成功すると何も出力されないため、ステータスコードを明示的に取得します。

curl -s -o /dev/null -w "%{http_code}\n" -X POST \
-u 'admin:your_password' \
-H "Content-Type: application/json" \
-d @/backup/rabbitmq/rabbitmq_definitions_20260519_020001.json \
http://10.0.2.10:15672/api/definitions
コード意味
200import 成功
400JSON ファイルが不正
401ユーザー名またはパスワードが誤り
403user に administrator タグがない

2 つの cluster を突き合わせる​

import が完全に終わったと決めつけず、両側の件数を比較します。

python3 << 'EOF'
import json, urllib.request, base64

def get_definitions(host, user, password):
url = f"http://{host}:15672/api/definitions"
req = urllib.request.Request(url)
token = base64.b64encode(f"{user}:{password}".encode()).decode()
req.add_header("Authorization", f"Basic {token}")
with urllib.request.urlopen(req) as r:
return json.load(r)

SOURCE = get_definitions("10.0.1.10", "admin", "your_password")
DEST = get_definitions("10.0.2.10", "admin", "your_password")

keys = ["vhosts", "users", "exchanges", "queues", "bindings", "policies"]

print(f"{'Thành phần':<15} {'Nguồn':>8} {'Đích':>8} {'Khớp':>8}")
print("-" * 45)
for k in keys:
src = len(SOURCE.get(k, []))
dst = len(DEST.get(k, []))
match = "OK" if src == dst else "LỆCH"
print(f"{k:<15} {src:>8} {dst:>8} {match:>8}")
EOF

期待される結果:

Thành phần      Nguồn     Đích     Khớp
---------------------------------------------
vhosts 4 4 OK
users 5 5 OK
exchanges 5 5 OK
queues 8 8 OK
bindings 8 8 OK
policies 3 3 OK

import で押さえておくこと​

パスワードはそのまま引き継がれます。 definitions ファイルは平文ではなくハッシュを保持しており、そのハッシュがそのまま import されます。対象 cluster でも user は従来のパスワードのまま使えます。

HA policy はノード数が揃って初めて効きます。 ha-mode: all の policy はどの cluster にも import できますが、実際に効くのはノードが 3 つ以上ある場合です。対象 cluster には元と同等の構成を用意してください。

2 回 import しても安全です。 この操作は冪等です。すでに存在する resource は更新されるか、そのまま残るだけで、削除されることはありません。失敗した import をやり直しても問題ありません。

cluster 名は上書きされません。 ファイル内の cluster_name は参考情報にすぎません。対象 cluster は自身の名前を保持します。

自動化する​

backup スクリプト​

/opt/backup/rabbitmq_backup.sh を作成します。

#!/bin/bash

# ---- Configuration ----
HOST="<RABBITMQ_HOST>"
USER="admin"
PASS='your_password'
BACKUP_DIR="/backup/rabbitmq"
RETENTION_DAYS=30
# ------------------

mkdir -p "$BACKUP_DIR"

FILENAME="rabbitmq_definitions_$(date +%Y%m%d_%H%M%S).json"
FILEPATH="${BACKUP_DIR}/${FILENAME}"

curl -s \
-u "${USER}:${PASS}" \
"http://${HOST}:15672/api/definitions" \
-o "$FILEPATH"

if [ $? -eq 0 ] && [ -s "$FILEPATH" ]; then
echo "[OK] Backup thành công: ${FILENAME}"
find "$BACKUP_DIR" -name "rabbitmq_definitions_*.json" \
-mtime +${RETENTION_DAYS} -delete
else
echo "[FAIL] Backup thất bại!"
rm -f "$FILEPATH"
exit 1
fi

実行権限を付与します。

chmod +x /opt/backup/rabbitmq_backup.sh
ヒント

PASS はシングルクォートで囲んでください。! を含むパスワードをダブルクォートで囲むと bash の history 展開が働き、スクリプトが誤った認証情報を送信します。

スケジュール設定と確認​

crontab -e

毎日 02:00 に実行する行を追加します。

0 2 * * * /opt/backup/rabbitmq_backup.sh >> /var/log/rabbitmq_backup.log 2>&1

最初のスケジュール実行のあとにログを確認します。

tail -f /var/log/rabbitmq_backup.log

成功した実行ごとの出力:

[OK] Backup thành công: rabbitmq_definitions_20260519_020001.json

次のステップ​