AWS 環境で rabbitmq をクラスタ化するために、考えられるあらゆる組み合わせを試しました。要約すると、次のようになります。
- ローカルのUbuntu 14からErlangとRatbitのディストリビューションをシャットダウンして削除しました
- ウェブ上の自動設定モジュールを試してみた
- デフォルトでインストールされている Ubuntu 14 バージョンでは不十分です。
- Erlangのクッキーの一致 - これは以下に示されています
ホスト名の不一致が唯一の謎です。ノード自体は、ホスト名がそれぞれ「q1」または「q2」であると考えています。コンテナのホスト名をホストのプライベート DNS 名に設定しようとすると (他のノードに接続できるようにするため)、コンテナ内の Rabbit インスタンスがクラッシュします。以下はhostname
生成方法ではq2
ありませんが、Amazon プライベート DNS にシェルしましたか?
root@q2:~# hostname
q2
root@q2:~# exit
christian@q2:~$ logout
Connection to ip-10-0-3-101.us-west-2.compute.internal closed.
最新のrabbitmq dockerイメージを使用しています。
docker run -d --restart always --hostname q1 --name rabbitmq -p 4369:4369 -p 15671:15671 -p 25672:25672 -p 15672:15672 -p 5672:5672 -e RABBITMQ_HIPE_COMPILE=1 -e RABBITMQ_ERLANG_COOKIE='ilikecookies' rabbitmq:3-management
サービスは問題なく起動します
root@q1:~# curl -I localhost:15672
HTTP/1.1 200 OK
Content-Length: 1419
Content-Type: text/html
Date: Fri, 20 Jan 2017 22:46:12 GMT
last-modified: Fri, 20 Jan 2017 22:38:45 GMT
Server: MochiWeb/1.0 (Any of you quaids got a smint?)
そして、これがホストq1からのクッキーです
root@q1:~# docker exec -it rabbitmq /bin/bash
root@q1:/# cat /var/lib/rabbitmq/.erlang.cookie
ilikecookies
root@q1:/#
今、私はそれをクラスタ化しようとします(ホストq2からq1をマスターとして)
root@q2:~# docker exec -it rabbitmq /bin/bash
root@q2:/# rabbitmqctl stop_app
Stopping node rabbit@q2 ...
root@q2:/# rabbitmqctl join_cluster [email protected]
Clustering node rabbit@q2 with '[email protected]' ...
Error: unable to connect to nodes ['[email protected]']: nodedown
DIAGNOSTICS
===========
attempted to contact: ['[email protected]']
[email protected]:
* connected to epmd (port 4369) on ip-10-0-3-56.us-west-2.compute.internal
* epmd reports node 'rabbit' running on port 25672
* TCP connection succeeded but Erlang distribution failed
* suggestion: hostname mismatch?
* suggestion: is the cookie set correctly?
* suggestion: is the Erlang distribution using TLS?
current node details:
- node name: 'rabbitmq-cli-41@q2'
- home dir: /var/lib/rabbitmq
- cookie hash: quN0y0GUm2Zxv8VYc2eX9A==
root@q2:/# cat /var/lib/rabbitmq/.erlang.cookie
ilikecookies
root@q2:/#
質問問題は、これらのものをどうやってクラスター化するのでしょうか? 欠けている要素は何でしょうか? エラー メッセージは Web 上では何の意味もありません。これについて経験のある方はいらっしゃいますか?
アップデート これらのインスタンスの AWS セキュリティグループ:
Custom TCP Rule
TCP
1024 - 65535
0.0.0.0/0
答え1
はい、分かりました!
各ノードのホスト名はコンテナ内で整列する必要があります。
ホスト マシン (q2) で、hosts ファイルで認識されているホストを確認しました。
# This file was generated by OpsWorks
# any manual changes will be removed on the next update.
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
# OpsWorks Layer State
127.0.0.1 localhost.localdomain localhost
127.0.1.1 q2.localdomain q2
10.0.3.56 q1.localdomain q1
10.0.3.101 q2.localdomain q2
root@q2:/# ping q1
PING q1.local (10.0.3.56): 56 data bytes
^C--- q1.local ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
そこで、ホストマシンが何を知っているかは問題ではなく、Docker コンテナが何を知っているかが重要だということに気付きました。そこで、コンテナにシェルでアクセスして、同じことを行いました。
root@q2:/# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 q2.local
これで、何かが始まりました! そこで、ノード マスターのエントリを追加しました。
root@q2:/# echo "10.0.3.56 q1.local q1" >> /etc/hosts
root@q2:/# which ping
/bin/ping
root@q2:/# ping q1
PING q1.local (10.0.3.56): 56 data bytes
そして、コンテナ内でもう一度スイングしました
root@q2:/# rabbitmqctl stop_app
Stopping node rabbit@q2 ...
root@q2:/# rabbitmqctl join_cluster rabbit@q1
Clustering node rabbit@q2 with rabbit@q1 ...
root@q2:/#
そして、各ノードはクラスター化されていることを認識します。やったー!
dockerでクラスタリングするには、dockerコマンドを変更して、hosts/etc/hosts
ファイルをdockerイメージにマウントすれば-v /etc/hosts:/etc/hosts:ro
、魔法のように動作するはずです。
言及し忘れたもう 1 つの手順: ローカルの Ubuntu ボックスでは、削除する必要のある古いバージョンの erlang が実行されていました (rabbit も実行されていました)。