RabbitMQ クラスタの自動構成

RabbitMQ クラスタの自動構成

RabbitMQ クラスタリングドキュメント

https://www.rabbitmq.com/clustering.html

クラスタリング用の構成ファイルを展開して、rabbitmqノードの起動時にクラスタが自動的に作成されるようにするプロセスについて説明します。

[{rabbit,
  [{cluster_nodes, {['rabbit@rabbit1', 'rabbit@rabbit2', 'rabbit@rabbit3'], ram}}]}].

このファイルを /etc/rabbitmq/rabbitmq.config の 3 つのノードそれぞれに適用し、各ノードで rabbitmq を起動すると、クラスターが形成されるようです。

これはあまりうまく機能していないようです。

rabbit2 を起動したが、rabbit3 がまだ起動していない場合、rabbit3 でクラスターを作成しようとしているため、rabbit2 でサービスは起動しません。

同様に、rabbit1 にのみ設定を適用し、rabbit2 と rabbit3 を事前に起動した場合、ドキュメントによると、rabbit1 は rabbit2 のみとクラスターを形成します (理由はわかりません)。

RabbitMQ will try to cluster to each node provided, and stop after it can cluster with one of them.

これが機能する唯一の方法は、3つのノードすべてに構成ファイルを適用し、それらを次のように開始することです。その通り同時に。これを Ansible でデプロイしようとしていますが、ノードを順番に作成するため、うまくいきません。

ここで何が欠けているのでしょうか?

答え1

私は Puppet を使用して RabbitMQ クラスターも展開していますが、実際にはすべてのノードをまったく同時に起動する必要はありません。

私が普段やっていること、そしてこれまでのところうまくいっている方法は次のとおりです。

  • RabbitMQ (RPM または DEB) をインストールする
  • 各ノードに hosts ファイルを設定し、3 つすべてのエントリを含めます。例:

192.168.1.11    dev-c1n01-rabbitmq.example.com  dev-c1n01-rabbitmq
192.168.1.12    dev-c1n02-rabbitmq.example.com  dev-c1n02-rabbitmq
192.168.1.13    dev-c1n03-rabbitmq.example.com  dev-c1n03-rabbitmq

クラスタリングするノード(DNSが利用可能であることに依存したくないため) * rabbitmq.config を展開する

[
  {rabbit, [
    {cluster_nodes, {['rabbit@dev-c1n01-rabbitmq', 'rabbit@dev-c1n02-rabbitmq', 'rabbit@dev-c1n03-rabbitmq'], disc}},
    {cluster_partition_handling, pause_minority},
    {disk_free_limit, 2147483648},
    {heartbeat, 0},
    {tcp_listen_options, [binary, {backlog, 1024}, {nodelay, true}, {keepalive, true} ]},
    {vm_memory_high_watermark, 0.6},
    {default_user, <<"admin">>},
    {default_pass, <<"somedefaultpass">>}
  ]},
  {kernel, [

  ]}
,
  {rabbitmq_management, [
    {listener, [
      {port, 15672}
    ]}
  ]}
].
% EOF
  • erlang.cookieをデプロイする

Erlang Cookieを作成するには、通常http://passwordsgenerator.net/大文字のみで構成される 20 文字の文字列を作成するように設定します。次に、この文字列を次のように /var/lib/rabbitmq/.erlang.cookie に格納します。

echo -n 'LCQLSHVOPZFHRUXMMAPF' > /var/lib/rabbitmq/.erlang.cookie
  • ノードを起動します (erlang.cookie と rabbitmq.config が同じであれば、順序は関係ありません)

これでうまくいくはずです。3.2、3.3、3.5 バージョンでテスト済みです。

答え2

これに関しては少し進歩しました。

この問題は、ラムノードではなくディスクrabbitmq.config ファイル内のノード。ドキュメントより:

RAM ノードは高度な使用例です。最初のクラスターを設定するときは、単に RAM ノードを使用しないでください。冗長性要件を処理するのに十分なディスク ノードを用意し、必要に応じて拡張用に RAM ノードを追加します。

RAM ノードのみを含むクラスターは脆弱です。クラスターが停止すると、再起動できなくなり、すべてのデータが失われます。RabbitMQ は、多くの場合、RAM ノードのみのクラスターの作成を防止しますが、完全に防止することはできません。

設定ファイルを「ram」ではなく「disc」を使用するように変更すると、クラスターの作成がより安定しました。

[{rabbit,
    [{cluster_nodes, {['rabbit@rabbit1', 'rabbit@rabbit2', 'rabbit@rabbit3'],disc}}]}].

関連情報