Skip to content

Instantly share code, notes, and snippets.

@inokappa
Last active July 11, 2018 16:38
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save inokappa/5d83b6c094810902b48a to your computer and use it in GitHub Desktop.
Save inokappa/5d83b6c094810902b48a to your computer and use it in GitHub Desktop.
涙の自腹課金検証シリーズ第一弾:RabbitMQ クラスタ HA モード 3 パターンを速攻試す

涙の自腹課金検証シリーズ第一弾:RabbitMQ クラスタ HA モード 3 パターンを速攻試す


検証環境

  • Amazon Linux
  • t1.micro

を利用。以下の通り、クラスタ 3 台構成。


試したいこと

  • RabbitMQ クラスタ HA 構成 3 パターン

試し方概要

  • クラスタを構成
  • それぞれ HA パターンを設定
  • Ruby からキューの出し入れを行う
  • HA パターンによるキューの出し入れに対する挙動をパターン別に確認する

HA モード 3 パターンについて

  • 以下の 3 つのパターン(モード)がある
ha-mode ha-params Result
all 無し キューはクラスタ内のすべてのノード間でミラーリングされる。新しいノードがクラスタに追加されるとキューはそのノードにミラーリングされる。
exactly count キューは count に指定した数のノードにミラーリングされる。但し、クラスタ内のノード数が count より>少ない場合には全てのノードにコピーされる。
nodes node names キューは node names に指定したノードにミラーリングされる。

HA モード 3 パターンの設定

概要、注意

  • ha-modeset_policy でキューの名前をパターンマッチにて指定することでキュー毎に適用出来る
  • 以下の例では '^.*' としているので全てのキューに対して適用されることになるので注意
  • キューパターンを '^.*' で指定した場合には後から指定したモードで上書きされてしまうので要注意

HA モードの設定

  • 基本的な書式
rabbitmqctl set_policy ${ha-mode} ${queue_name_match_pattern} '{"ha-mode": "${ha-mode}","ha-params":${param},"ha-sync-mode":"${mode_pattern}"}'

all

  • 設定
rabbitmqctl set_policy all '^.*' '{"ha-mode": "all"}'

exactly

  • 設定
rabbitmqctl set_policy one "^.*" '{"ha-mode":"exactly","ha-params":1,"ha-sync-mode":"automatic"}'

nodes

  • 設定
rabbitmqctl set_policy node_test "^.*" '{"ha-mode":"nodes","ha-params":["rabbit@ip-xxx-xxx-x-xxx"],"ha-sync-mode":"automatic"}'

ミラー対象となるノードを配列で渡す。


rabbitmqctl

HA 構成に必要と思われる set_policy とか clear_policy とか list_policies とか。ここ見よう。

set_policy

rabbitmqctl set_policy all '^.*' '{"ha-mode": "all"}'

list_policies

rabbitmqctl list_policies

以下のように出力される。

Listing policies ...
/       one     ^.*     {"ha-mode":"exactly","ha-params":1,"ha-sync-mode":"automatic"}  0
/       two     ^.*     {"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}  0
...done.

clear_policy

rabbitmqctl clear_policy ${policy_name}

それぞれの挙動

HA モード all の場合

  • キューの登録先は指定したホストに登録される
  • 全てのノードにミラーリングされる
  • 特定のノードからキューを削除してもミラー先にはミラーリングされたキューとメッセージは残っており、ミラーリングされたノードからキューメッセージは取り出せる

HA モード exactly の場合("ha-params":1)

  • "ha-params":1 で試す
  • キューは登録したノードのみに存在するがクラスタ内のどこのノードからでもメッセージを取り出すことは出来る(クラスタノードが全て元気な場合)
  • キューが登録されているノードがダウン(stop_app)した場合、メッセージは当然取り出せなくなる

HA モード exactly の場合("ha-params":2)

  • "ha-params":2 で試す
  • キューは登録したノードのみに存在するがクラスタ内のどこのノードからでもメッセージを取り出すことは出来る(クラスタノードが全て元気な場合)
  • キューが登録されているノードがダウン(stop_app)した場合でもメッセージは取り出すことが出来る
  • キューが登録されたノード、ミラーリングされたノード、全てのノードがダウンした場合には...残念ながらキューは喪失する

HA モード nodes の場合

  • 1 ノードへのみのミラーリング
  • キューは登録したノードとミラー先のノードに存在するがクラスタ内のどこのノードからでもメッセージを取り出すことは出来る(クラスタノードが全て元気な場合)
  • キューを登録したノードを stop_app してもミラー先のキューからメッセージを取り出すことが出来る
  • ミラー先を stop_app するとキューが消えてしまいメッセージを取り出すことが出来ない

で、結局どうなの?

どの HA モードを選択するのがベターか?

  • 安全を考慮するなら all
  • 大量のキューが同時に発生するようなサービスの場合には all だとミラー(同期)に多くのリソースを持っていかれる可能性がある
  • ↑のような場合には 3 node 構成にしておいて exactly"ha-params":2 にしておくと良さそう

ちょっとしたメモ

クラスタ構成について

キューの消し方

  • Deleting queues in rabbitmq
  • rabbitmqctl stop_apprabbitmqctl resetrabbitmqctl start_app でノード上のキューは消える
  • 但し、rabbitmqctl reset を行った時点でクラスタノードだった場合にはクラスタから外れてしまうので注意する

HA モードを変更した場合

  • キューの HA モードを変更した場合にパターンにマッチするキューは手動でキューの同期を行う必要がある

上図は exactly"ha-params":1 からの all に変更した状態。

@inokappa
Copy link
Author

気づいたこと

デフォルトの HA 構成モード

  • 暗黙の all が効いてるっぽい
  • 安心だけど
  • デフォルトの HA モードってのは無い
  • ではポリシーがセットされていない場合はどうなるの?(さらに疑問追加)

どのモードでも

  • クラスタ内のノードが全て健全である場合にはどのノードからでもキュー内のメッセージは取り出せる(気づいたというか勘違いしてた)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment