web-dev-qa-db-ja.com

RabbitMQ-クラスターノード障害後の予期しない空の非同期キュー

WindowsのクラスターにRabbitMQをダウンロードしてインストールしました。

  • eRLANGとRABBITMQを2つのサーバー(AlphaとBravoなど)にダウンロードしてインストールしました
  • インストールされた管理プラグイン、カスタムtcp_listenerポートを設定し(セキュリティを強化するため)、デフォルトのguest:guestログインの代わりにカスタム管理者ログインを追加します
  • 両方のマシンに同じCookieを設定します(両方のフォルダーC:\ Windows \およびC:\ Users\username)
  • windowsサービスとしてRabbitMQをインストールしました
  • bravoノードをAlphaノードに結合してクラスター化
  • 両方のすべてのキューをミラーリングするポリシーを追加しました(Pattern = ""、Definition = "ha-mode:all")
  • 耐久性のあるミラーリングされたキューを作成し、それにメッセージを公開しました-両方のノード間で同期されます(期待どおりに正常に動作します)

しかし、1つのノードをオフにするとどうなるかをテストしようとしました。

  • ノードブラボーをオフにしました
  • アルファノードにメッセージを追加しました
  • ノードブラボーをオンに戻しました
  • 欠落しているメッセージはBravoノードに同期されましたが、管理コンソールでこのノードは「非同期」としてマークされました

このキューの何が問題になっていますか?しかし、他にも問題があります。例えば:

  • ノードブラボーをオフにしました
  • アルファノードにメッセージを追加しました
  • ノードBravoをオンに戻し、メッセージの同期を待ちました
  • アルファノードをオフにしました
  • Bravoノードにメッセージを追加しました
  • アルファノードをオンに戻しました
  • キューに追加されたすべてのメッセージが魔法のように消えました

これは本当に奇妙です。誰かが何が起こったのか考えていますか?

また、3番目のテストケースがあります。

  • Alphaノードをオフにし、Bravoにメッセージを追加し、Bravoノードもオフにしました
  • 次に、Alphaノードをオンにすると、「timeout_waiting_for_tables」というメッセージが表示されました。何度も試しました。アルファノードもオンに戻したときにのみ機能し始めました

たぶん、RabbitMQでクラスタリングがどのように機能するのかわからなかったのかもしれません。誰かが私を助けて、何が起こっているのか教えてもらえますか?

1
Tomáš Jecha

同じ問題ですが、実行すべき理解が少しあり、落とし穴もあります。

まず、vhostをコマンドに渡さなかったという事実にだまされました。

rabbitmqctl set_policy -p myvhost HA '*' '{"ha-mode": "all"}'

それ以外の場合、仮想ホストはデフォルトで「/」になります

この後、Webコンソールにログオンすると、ノードフィールドが2つのノードについてレポートしていることがわかりました...今。すごい :-)

ただし、一方を上下に動かし、もう一方を上下に動かすと、キューが消えます!?これは、ミラーリングに「同期」がなく、「スタッキング」のみが行われるためです。つまり、ノードを停止すると、残りのメッセージは残りの1つまたは複数のノードから配信されます。新しい/既存のノードを起動すると、追加された新しいメッセージのみがミラーリングされます。

私はこれにかなり慣れていないので、3つのノードを持つ方が2つよりはるかに優れていると思います。これは、1つのノードがダウンした場合でも、他の2つのノードよりも回復力があることを意味します(ビジネスケースが正しいかどうかによって異なります)。もちろん、2つのノードがダウンした場合、キューに残っているもののレプリケーションが失われます。これは「3ストライクセットアップ」と呼ばれるべきだと思います!

0
Richie