だいぶ前に書いていたメモを発掘。
これらの書いていたものなので投稿日を改ざんしてます。
設定ファイル
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 やらのチューニングについて下記にまとまっています。
また、下記によるとファイルディスクリプタの上限数 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
モニタリング
# クラスタ全体のメトリクスを 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
ヘルスチェック
- nagios
- prometheus
プロダクションチェックリスト
シングルテナントなら 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/memory.html https://www.rabbitmq.com/disk-alarms.html
仮想ホスト
RabbitMQ は仮想ホストごとに、接続、エクスチェンジ、キュー、バインディング、アクセス許可、ポリシー、などなどがある。
クライアントはどの仮想ホストに接続するかを指定して接続する。仮想ホストをまたがるような相互運用はクライアントが複数の接続を用いて、ある仮想ホストから取得したメッセージを別の仮想ホストに再発行するような形でやる必要がある。
仮想ホストの作成や削除には結構な時間がかかるため、ループの中で大量に作成するときとかはタイムアウト時間に気をつける必要がある。
認証、認可、アクセス制御
サーバが最初に開始したときに次の通りデータベースが作成去れる。
- デフォルトの仮想ホスト
/
- デフォルトのユーザー
guest
とパスワードguest
guest
ユーザーはローカルホストからしか接続できません。
プラグイン
プラグインは次のようなコマンドで有効にできる
rabbitmq-plugins enable <plugin-name>
--offline
を付ければ RabbitMQ には接続せずに設定ファイル enabled_plugins
だけが更新される。このファイルは次のような形式でプラグイン名がリストされる。
[rabbitmq_management,rabbitmq_management_agent,rabbitmq_shovel].
このファイルには依存関係はリストされないもよう? このファイルを更新したときは RabbitMQ の再起動が必要。
マネジメントプラグイン
設定で Path Prefix が指定できる
HTTP API での Publishing/Consuming は奨励はされないのだけど、Publishing については長寿命の接続が適切ではない状況では役立つとのこと。
その他のおもしろそうなプラグイン。
rabbitmq_random_exchange
- ロードバランスのためにルーティングするキューをランダムで決定する
rabbitmq_recent_history_exchange
- Exchange の最後の20メッセージを追跡する
- チャットの履歴みたいな使い方ができる
rabbitmq_sharding
- キューの FIFO を犠牲にしてシャーディングをする
rabbitmq_web_dispatch
- 勝手に有効になる?