RabbitMQ 3.x から Queue のミラーリング方法が変更になった
今まで, Queue 作成時に指定していたミラーリングのパラメータは廃止になり, rabbitmqctl コマンドで指定するように変更なった.
Perl の AnyEvent::RabbitMQ や Python の kombu(celery) で x-ha-policy を指定する方法は, RabbitMQ 2.x までしか通用しない.*1
経緯や詳細は, 下記二つを参照の事.
- RabbitMQ >> Blog Archive >> Breaking things with RabbitMQ 3.0 - Messaging that just works
- RabbitMQ - Highly Available Queues
指定方法
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 にも適用されている. これが, どのような影響を及ぼすのかは調査中.