RabbitMQ メモ

だいぶ前に書いていたメモを発掘。

これらの書いていたものなので投稿日を改ざんしてます。

設定ファイル

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

RabbitMQ 3.7.0 より前は rabbitmq.config というファイル名で Erlang 用の設定の書式が使われていたのだけど 3.7.0 以降では rabbitmq.conf というファイル名の普通の設定ファイルっぽい書式のものも使うことができて、こちらの方が奨励されています。

設定ファイルの場所は CentOS とかで RPM でインストールすれば /etc/rabbitmq/rabbitmq.conf になります。

rabbitmq.conf の形式では記述できる内容に制限があるため、追加で advanced.config という名前の設定ファイルを設けることもできます。このファイルはErlang 用の設定の書式を使用して記述します。

チューニング

実運用での RabbitMQ の設定値、sysctl やら ulimit やらのチューニングについて下記にまとまっています。

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

また、下記によるとファイルディスクリプタの上限数 ulimit -n は少なくとも 65536 を奨励するもよう。

https://www.rabbitmq.com/install-rpm.html#kernel-resource-limits

がしかし、例では 64000 を指定しているのだけど・・?

[Service]
LimitNOFILE=64000

なお CentOS7 に入れてみたところデフォルトは 32768 になっていました。

/usr/lib/systemd/system/rabbitmq-server.service

# To override LimitNOFILE, create the following file:
#
# /etc/systemd/system/rabbitmq-server.service.d/limits.conf
#
# with the following content:
#
# [Service]
# LimitNOFILE=65536

LimitNOFILE=32768

モニタリング

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

# クラスタ全体のメトリクスを JSON で得る
curl -u ore:pass http://localhost:15672/api/overview

# 特定のノードのノード固有メトリクスを JSON で得る
curl -u ore:pass http://localhost:15672/api/nodes/rabbit@mq01

# すべてのノードのノード固有メトリクスを JSON で得る
curl -u ore:pass http://localhost:15672/api/nodes

# キュー固有のメトリクスを得る
curl -u ore:pass http://localhost:15672/api/queues/%2F/hoge_queue

ヘルスチェック

https://www.rabbitmq.com/monitoring.html#health-checks

プロダクションチェックリスト

https://www.rabbitmq.com/production-checklist.html

シングルテナントなら vhost はデフォルトの / で問題ない、マルチテナントならテナントごとに個別の vhost を使うのが良い。

デフォルトのユーザー guest はローカルホストからしか使用できないものの実稼働環境では削除して別のユーザーを作るべき。アプリケーションごとにユーザーを設けると良い。

固定IPを持つ多くのクライアントがあるなら「x509証明書」や「ソースIPアドレス範囲」で認証すると良いかも。

RabbitMQ が使用可能なメモリの 40% を超えてメモリを使用するとそれ以上のメッセージをパブリッシャーから受けなくなる。RabbitMQ をメモリを使いすぎると OS のスワッピングによってパフォーマンスに影響があるため、vm_memory_high_watermark でパーセンテージは調整できるけれども基本的にはデフォルト値のままで、変更するにしても 0.40~0.66 に留めるべき。

disk_free_limit はデフォルトだと 50MB でこれは実稼働には小さすぎるかもしれないので、

disk_free_limit.mem_relative = 1.0
disk_free_limit.mem_relative = 1.5
disk_free_limit.mem_relative = 2.0

とかにすると良いかもしれない。

メモリとディスクのアラーム

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

メモリ使用量が設定された制限値以上になったとき、または、ディスクの空き容量が設定された制限値を下回ったとき、パブリッシャの通信が一時的にブロックされる。

パブリッシャからは単に遅延しているだけに見える。いずれかひとつのノードでアラームになるとクラスタのすべてのノードで同じ状態になる?

https://www.rabbitmq.com/memory.html https://www.rabbitmq.com/disk-alarms.html

仮想ホスト

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

RabbitMQ は仮想ホストごとに、接続、エクスチェンジ、キュー、バインディング、アクセス許可、ポリシー、などなどがある。

クライアントはどの仮想ホストに接続するかを指定して接続する。仮想ホストをまたがるような相互運用はクライアントが複数の接続を用いて、ある仮想ホストから取得したメッセージを別の仮想ホストに再発行するような形でやる必要がある。

仮想ホストの作成や削除には結構な時間がかかるため、ループの中で大量に作成するときとかはタイムアウト時間に気をつける必要がある。

認証、認可、アクセス制御

https://www.rabbitmq.com/access-control.html

サーバが最初に開始したときに次の通りデータベースが作成去れる。

  • デフォルトの仮想ホスト /
  • デフォルトのユーザー guest とパスワード guest

guest ユーザーはローカルホストからしか接続できません。

プラグイン

プラグインは次のようなコマンドで有効にできる

rabbitmq-plugins enable <plugin-name>

--offline を付ければ RabbitMQ には接続せずに設定ファイル enabled_plugins だけが更新される。このファイルは次のような形式でプラグイン名がリストされる。

[rabbitmq_management,rabbitmq_management_agent,rabbitmq_shovel].

このファイルには依存関係はリストされないもよう? このファイルを更新したときは RabbitMQ の再起動が必要。

マネジメントプラグイン

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

設定で Path Prefix が指定できる

HTTP API での Publishing/Consuming は奨励はされないのだけど、Publishing については長寿命の接続が適切ではない状況では役立つとのこと。

その他のおもしろそうなプラグイン。

  • rabbitmq_random_exchange
    • ロードバランスのためにルーティングするキューをランダムで決定する
  • rabbitmq_recent_history_exchange
    • Exchange の最後の20メッセージを追跡する
    • チャットの履歴みたいな使い方ができる
  • rabbitmq_sharding
    • キューの FIFO を犠牲にしてシャーディングをする
  • rabbitmq_web_dispatch
    • 勝手に有効になる?