/etc/hostsを書かずにRabbitMQのクラスタを構築したい- ansibleを使ってクラスタ化まで実行したい
- RabbitMQの各ホストがConsulで名前解決できる状態にある
- 例えば
node01.node.consul、node02.node.consulとして個別ホストにアクセスできる- サービスとしては
rabbitmq.service.consulとしてアクセスできる - dnsmasqを利用し、シームレスに名前解決できる
- サービスとしては
普通にRabbitMQを構成すると、RabbitMQノード名はホスト名を用いて
rabbit@node01 のように自動設定される。
非クラスタ環境ではこれで問題ないが、
この場合、クラスタを組む際には node01 が名前解決できなければならない。
具体的には
rabbitmqctl join_cluster rabbit@node01
のステップで node01 が名前解決できずに失敗する
とはいえ、
rabbitmqctl join_cluster rabbit@node01.node.consul
とすると、consul+dnsmasqにより node01.node.consul は名前解決できるが、
対向側のRabbitMQが rabbit@node01 の名前で起動しているので
ノード名がマッチせず、ジョインに失敗する。
ここで node01 が名前解決できればよいことから、
/etc/hosts に記述すれば解決する。
最低限、RabbitMQのマスタノードを記載すれば良い。
しかし、consulを用いてhostsファイルを使わずに構築した環境なので、 このためだけにhostsを書くのは避けたい。
次の方針で解決する。
- RabbitMQのデフォルトのノード名を用いない
- ノードのドメインは「長いもの」を使う
以上をRabbitMQの設定ファイル /etc/rabbitmq/rabbitmq-env.conf
に記載することで対処する。
具体的な設定項目は
NODENAME=rabbit@node01.node.consulUSE_LONGNAME=true
ノード名の変更はrabbitmq-server起動中に実行してはならない。
(ノード名不一致で rabbitmqctl が実行できなくなる)
rabbitmqctl stop_app
systemctl stop rabbitmq-server
vi /etc/rabbitmq/rabbitmq-env.conf でノード名を変更する
systemctl start rabbitmq-server
の順で実行する。