rabbitmq の原因と対処

rabbitmq コンテナのログに記録されるエラーから、原因と対処を調べます。「全構成共通」のアラームと、「Swarmクラスタ構成固有」のクラスタ関連エラーに分けて示します。

全構成共通

ディスクリソース制限アラーム

主なエラーメッセージ

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 がディスクリソース制限アラームを発生させ、ディスクスペースが解放されるまでパブリッシャーをブロックします。

解決策

  1. RabbitMQ の Alarms ステータスを確認します。

    $ docker exec $(docker ps -q -f name=rabbitmq) rabbitmqctl status
    

    Alarms が残っている場合、Free disk space alarm on node rabbit@... のように表示されます。

  2. VM で利用可能なディスクスペースを確認します(df -h)。空きが不足している場合は不要なファイルを削除し、Alarms(none) になることを確認します。RabbitMQ は自動的に正常に戻るはずです。

  3. 正常に戻らない場合、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 のための十分なメモリが空いていない場合に発生します。

解決策

  1. RabbitMQ の Alarms ステータスを確認します(rabbitmqctl status)。Memory alarm on node rabbit@... のように表示されます。
  2. ホストサーバのメモリ使用率が高い場合は、ホストサーバのリソース状況の確認 を確認し、メモリを解放してください。Alarms(none) になれば RabbitMQ は正常に戻るはずです。
  3. 正常に戻らない場合、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 台あることを確認します。なければノード間通信(ネットワーク導通の確認)を確認します。AlarmsNetwork Partitions に項目が出ていないかもあわせて確認します。

Mnesia データベースが破損している

主なエラーメッセージ

  • Mnesia function failed 99 times. Possibly an infinite retry loop; trying one last time
  • reason: 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 データベースが破損した場合に発生することがあります。

解決策

  1. rabbitmq クラスタ状況を確認します(rabbitmqctl cluster_status)。Running Nodes が 3 台なければ ネットワーク導通の確認 を実施してください。

  2. 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
    
  3. 正常に戻らない場合、rabbitmq コンテナを再起動してください(docker restart <RABBITMQ_CONTAINER_ID>)。

  4. 解決できない場合は、各ノードの 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 クラスタ内で部分的なネットワーク分割(パーシャルパーティション)が検出されたために発生します。ネットワークの不具合や一部ノード間の通信断によりスプリットブレインの状態が引き起こされ、クラスタの一貫性が失われたことを意味します。

解決策

  1. ノード間通信を確認します(ネットワーク導通の確認)。

  2. 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 と表示されます。

  3. ネットワークパーティションが解消されたが少数派ノードの 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 left
  • Error 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 分)。多くは自動回復しますが、復旧しない場合は以下を進めてください。

  1. ノード間通信を確認します(ネットワーク導通の確認)。
  2. RabbitMQ のステータスを確認します(rabbitmq-diagnostics -q check_running)。
  3. 少数派ノードの 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.dump
  • BOOT 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)

解決策

  1. ノード間通信を確認します(ネットワーク導通の確認)。
  2. 正常に戻らない場合、rabbitmq コンテナを再起動してください(docker restart <CONTAINER_ID>)。それでも異常なら systemctl restart docker.service を実行してください。
  3. 解決できない場合は、各ノードの 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 のクラスタ設定が他のノードと同じ状態になっていない場合に発生する可能性があります。

解決策

  1. rabbitmq クラスタ状況を確認します(rabbitmqctl cluster_status)。Running Nodes が 3 台なければ ネットワーク導通の確認 を実施してください。
  2. 全てのノードの rabbitmq を再起動してください(docker service update --force ke2_rabbitmq)。
  3. 解決できない場合は、各ノードの RabbitMQ のボリュームを削除する必要があります。RabbitMQ のボリュームを削除する手順 を参照してください。