rabbitmq の原因と対処
rabbitmq コンテナのログに記録されるエラーから、原因と対処を調べます。「全構成共通」のアラームと、「Swarmクラスタ構成固有」のクラスタ関連エラーに分けて示します。
- 影響範囲: rabbitmq の役割と影響範囲
全構成共通
ディスクリソース制限アラーム
主なエラーメッセージ
disk resource limit alarm set on node 'rabbit@...' /
Free disk space is insufficient
ログのサンプルエントリ
2024-09-05 12:54:04.298460+09:00 [info] <0.476.0> Free disk space is insufficient. Free bytes: 647168. Limit: 50000000
2024-09-05 12:54:04.298588+09:00 [warning] <0.472.0> disk resource limit alarm set on node 'rabbit@mq-ke2-rhel89-swarm-1'.
2024-09-05 12:54:04.298588+09:00 [warning] <0.472.0> *** Publishers will be blocked until this alarm clears ***
原因
ノード上の空きディスクスペースが設定された threshold 値(デフォルト 50MB)を下回ると、RabbitMQ がディスクリソース制限アラームを発生させ、ディスクスペースが解放されるまでパブリッシャーをブロックします。
解決策
-
RabbitMQ の
Alarmsステータスを確認します。$ docker exec $(docker ps -q -f name=rabbitmq) rabbitmqctl statusAlarmsが残っている場合、Free disk space alarm on node rabbit@...のように表示されます。 -
VM で利用可能なディスクスペースを確認します(
df -h)。空きが不足している場合は不要なファイルを削除し、Alarmsが(none)になることを確認します。RabbitMQ は自動的に正常に戻るはずです。 -
正常に戻らない場合、rabbitmq コンテナを再起動してください(
docker ps -a -f name=rabbitmqで ID を取得しdocker restart <CONTAINER_ID>)。
解決しない場合
KE2 APP を再起動するを試してください。
メモリリソース制限アラーム
主なエラーメッセージ
memory resource limit alarm set on node 'rabbit@...'
ログのサンプルエントリ
2024-09-25 21:42:10.868015+09:00 [warning] <0.475.0> memory resource limit alarm set on node 'rabbit@mq-ke2-rhel89-swarm-1'.
2024-09-25 21:42:10.868015+09:00 [warning] <0.475.0> *** Publishers will be blocked until this alarm clears ***
原因
RabbitMQ のための十分なメモリが空いていない場合に発生します。
解決策
- RabbitMQ の
Alarmsステータスを確認します(rabbitmqctl status)。Memory alarm on node rabbit@...のように表示されます。 - ホストサーバのメモリ使用率が高い場合は、ホストサーバのリソース状況の確認
を確認し、メモリを解放してください。
Alarmsが(none)になれば RabbitMQ は正常に戻るはずです。 - 正常に戻らない場合、rabbitmq コンテナを再起動してください。
解決しない場合
KE2 APP を再起動するを試してください。
Swarmクラスタ構成固有
以下はクラスタ構成(rabbitmq 3 ノードクラスタ)で発生するエラーです。クラスタ状態の確認には次のコマンドを用います。
$ docker exec $(docker ps -q -f name=rabbitmq) rabbitmqctl cluster_status
Basics
Cluster name: rabbit@mq-ke2-rhel89-swarm-1
Disk Nodes
rabbit@mq-ke2-rhel89-swarm-1
rabbit@mq-ke2-rhel89-swarm-2
rabbit@mq-ke2-rhel89-swarm-3
Running Nodes
rabbit@mq-ke2-rhel89-swarm-1
rabbit@mq-ke2-rhel89-swarm-2
rabbit@mq-ke2-rhel89-swarm-3
Alarms
(none)
Network Partitions
(none)
(以下、Versions / CPU Cores / Listeners / Feature flags などは省略)
Cluster name が存在することと、Running Nodes に 3
台あることを確認します。なければノード間通信(ネットワーク導通の確認)を確認します。Alarms
や Network Partitions に項目が出ていないかもあわせて確認します。
Mnesia データベースが破損している
主なエラーメッセージ
Mnesia function failed 99 times. Possibly an infinite retry loop; trying one last timereason: reached_max_restart_intensity
ログのサンプルエントリ
[warning] Mnesia->Khepri fallback handling: Mnesia function failed 99 times. Possibly an infinite retry loop; trying one last time
[error] exception exit: {aborted,{no_exists,[rabbit_runtime_parameters,cluster_name]}}
[error] supervisor: {<0.34209.0>,rabbit_connection_sup} errorContext: shutdown reason: reached_max_restart_intensity
原因
長時間にわたるネットワーク分断やスプリットブレインにより、Mnesia データベースが破損した場合に発生することがあります。
解決策
-
rabbitmq クラスタ状況を確認します(
rabbitmqctl cluster_status)。Running Nodesが 3 台なければ ネットワーク導通の確認 を実施してください。 -
rabbitmq をリセットします。
$ docker exec $(docker ps -q -f name=rabbitmq) rabbitmqctl stop_app $ docker exec $(docker ps -q -f name=rabbitmq) rabbitmqctl reset $ docker exec $(docker ps -q -f name=rabbitmq) rabbitmqctl start_app -
正常に戻らない場合、rabbitmq コンテナを再起動してください(
docker restart <RABBITMQ_CONTAINER_ID>)。 -
解決できない場合は、各ノードの RabbitMQ のボリュームを削除する必要があります。RabbitMQ のボリュームを削除する手順 を参照してください。
Partial partition detected
主なエラーメッセージ
Partial partition detected /
Cluster minority/secondary status detected - awaiting recovery
ログのサンプルエントリ
[error] <0.514.0> Partial partition detected:
[error] <0.514.0> * We saw DOWN from rabbit@mq-ke2-rhel89-swarm-2
[error] <0.514.0> * We can still see rabbit@mq-ke2-rhel89-swarm-3 which can see rabbit@mq-ke2-rhel89-swarm-2
[error] <0.514.0> * pause_minority mode enabled
[warning] <0.514.0> Cluster minority/secondary status detected - awaiting recovery
原因
RabbitMQ クラスタ内で部分的なネットワーク分割(パーシャルパーティション)が検出されたために発生します。ネットワークの不具合や一部ノード間の通信断によりスプリットブレインの状態が引き起こされ、クラスタの一貫性が失われたことを意味します。
解決策
-
ノード間通信を確認します(ネットワーク導通の確認)。
-
RabbitMQ のステータスを確認します。
$ docker exec $(docker ps -q -f name=rabbitmq) rabbitmq-diagnostics -q check_running実行中なら
RabbitMQ on node rabbit@mq-<HOSTNAME> is fully booted and running、停止中なら... is not running or has not fully booted yetと表示されます。 -
ネットワークパーティションが解消されたが少数派ノードの RabbitMQ が一時停止状態の場合、停止したノードの rabbitmq を起動します(
rabbitmqctl start_app)。起動しても戻らない場合は rabbitmq コンテナを再起動(docker restart <CONTAINER_ID>)、それでも異常ならsystemctl restart docker.serviceを実行してください。
Waiting for Mnesia tables
主なエラーメッセージ
Waiting for Mnesia tables for 30000 ms, N retries leftError while waiting for Mnesia tables
ログのサンプルエントリ
[warning] <0.254.0> Error while waiting for Mnesia tables: {timeout_waiting_for_tables, ['rabbit@mq-ke2-rhel89-swarm-3','rabbit@mq-ke2-rhel89-swarm-2','rabbit@mq-ke2-rhel89-swarm-1'], ...}
[info] <0.254.0> Waiting for Mnesia tables for 30000 ms, 6 retries left
原因
ネットワークが 30 秒以上中断された、またはリモートの RabbitMQ ノードが 30 秒以上接続できない場合に発生します。
解決策
ノード間通信に一時的な問題があっても、RabbitMQ は内部的に再試行を行い自動回復する場合があります(約 9 回 × 30 秒 = 約 5 分)。多くは自動回復しますが、復旧しない場合は以下を進めてください。
- ノード間通信を確認します(ネットワーク導通の確認)。
- RabbitMQ のステータスを確認します(
rabbitmq-diagnostics -q check_running)。 - 少数派ノードの RabbitMQ が停止状態の場合、停止したノードの rabbitmq
を起動します(
rabbitmqctl start_app)。戻らない場合は rabbitmq コンテナを再起動、それでも異常なら全ノードの rabbitmq を再起動してください(docker service update --force ke2_rabbitmq)。
erl_crash / inconsistent_cluster(BOOT FAILED)
主なエラーメッセージ
Crash dump is being written to: /var/log/rabbitmq/erl_crash.dumpBOOT FAILED/inconsistent_cluster
ログのサンプルエントリ
Crash dump is being written to: /var/log/rabbitmq/erl_crash.dump...done
BOOT FAILED
===========
Error during startup: {error,
{inconsistent_cluster,
"Mnesia: node 'rabbit@mq-ke2-rhel89-swarm-1' thinks it's clustered with node 'rabbit@mq-ke2-rhel89-swarm-3', but 'rabbit@mq-ke2-rhel89-swarm-3' disagrees"}}
Runtime terminating during boot (terminating)
解決策
- ノード間通信を確認します(ネットワーク導通の確認)。
- 正常に戻らない場合、rabbitmq コンテナを再起動してください(
docker restart <CONTAINER_ID>)。それでも異常ならsystemctl restart docker.serviceを実行してください。 - 解決できない場合は、各ノードの RabbitMQ のボリュームを削除する必要があります。RabbitMQ のボリュームを削除する手順 を参照してください。
leader saw pre_vote_rpc for unknown peer
主なエラーメッセージ
leader saw pre_vote_rpc for unknown peer
ログのサンプルエントリ
[warning] <0.1454.0> queue 'default/rpc_queue' in vhost '/': leader saw pre_vote_rpc for unknown peer {'%2F_default/rpc_queue','rabbit@mq-ke2-rhel89-swarm-2'}
原因
RabbitMQ のクラスタ設定が他のノードと同じ状態になっていない場合に発生する可能性があります。
解決策
- rabbitmq クラスタ状況を確認します(
rabbitmqctl cluster_status)。Running Nodesが 3 台なければ ネットワーク導通の確認 を実施してください。 - 全てのノードの rabbitmq を再起動してください(
docker service update --force ke2_rabbitmq)。 - 解決できない場合は、各ノードの RabbitMQ のボリュームを削除する必要があります。RabbitMQ のボリュームを削除する手順 を参照してください。