RabbitMQ 3.x から Queue のミラーリング方法が変更になった

今まで, Queue 作成時に指定していたミラーリングのパラメータは廃止になり, rabbitmqctl コマンドで指定するように変更なった.
Perl の AnyEvent::RabbitMQ や Python の kombu(celery) で x-ha-policy を指定する方法は, RabbitMQ 2.x までしか通用しない.*1

経緯や詳細は, 下記二つを参照の事.

指定方法

Web UI の Manage Console からも指定できるが, 今回は rabbitmqctl の例を挙げる.*2

Usage は下記の通り.

$ rabbitmqctl set_policy <ポリシーの名前> <パターン> <モード> [<優先度>]
ポリシー名 ポリシーを一意にし, 更新や削除の操作対象とする.
パターン キュー名がパターンにマッチした場合, ポリシーの対象とする. 正規表現が使える.
モード RabbitMQ - Highly Available Queues 参照の事.
優先度 数値が高い程, 優先. 未指定で 0 が入る.

指定例

全てのキューをミラーリングする(ものぐさ設定w;).

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

キュー名の接頭辞に ha が付いた場合にミラーリングする.

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

キュー名の接頭辞に amq が付いた場合(キュー名を指定せず, RabbitMQ に自動採番させた場合) "以外" にミラーリングする.

$ rabbitmqctl set_policy ha-ignore-amq '^(?!amq\.).*' '{"ha-mode": "all"}'

運用中にポリシーの変更が可能らしいが, 検証はこれから行う予定.
運用中にポリシーの変更は可能. また, クラスタリング時の Manage Console のポリシー表記が変だったので, 下記のコマンドで動作確認した方が良い.

$ rabbitmqctl list_queues name policy pid owner_pid slave_pids messages_ready messages_unacknowledged messages

尚, ポリシーは, パターンにマッチする Exchange にも適用されている. これが, どのような影響を及ぼすのかは調査中.

*1:3.x で指定してもエラーにならないので, 問題に気がつき難い

*2:私は, Manage Console で操作するのが良いと思う