web-dev-qa-db-ja.com

AWSでrabbitmqをクラスター化する方法

AWS環境でrabbitmqをクラスター化するために、考えられるすべての組み合わせを試しました。しかし要約すると:

  1. 私の地元のubuntu14でerlangとrabbitの配布をシャットダウンして削除しました
  2. Web上の自動構成モジュールを試しました
  3. デフォルトでインストールされているubuntu14バージョンはそれをカットしません。
  4. Erlangクッキーが一致します-これは以下に示されています

ホスト名の不一致が唯一のパズルです。ノード自体は、ホスト名がそれぞれ「q1」または「q2」であると見なします。コンテナのホスト名をホストのプライベートDNS名に設定しようとすると(他のノードに接続できるように)、コンテナ内のウサギのインスタンスがクラッシュします。 hostnameq2を生成する方法を下回っていませんが、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.

最新のrabbitmqdockerイメージを使用しています。

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:/# 

今私はそれをクラスター化しようとします(q1がマスターであるホストq2から)

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上では何の意味もありません。誰かがこれでいくつかの経験がありますか?

[〜#〜] update [〜#〜]これらのインスタンスのAWSセキュリティグループ:

Custom TCP Rule
TCP
1024 - 65535
0.0.0.0/0
5

はい、分かりました!

各ノードのホスト名は、コンテナ内に並んでいる必要があります。

ホストマシン(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コマンドを変更してホストをマウントすると思います/etc/hostsファイルをDockerイメージに-v /etc/hosts:/etc/hosts:roそしてこれは魔法のように機能するはずです

私が言及するのを忘れた別のステップ:ローカルのUbuntuボックスには、削除しなければならなかった古いバージョンのerlangが実行されていました(そしてウサギもありました)。

2

このプロジェクトは、AWSECSのクラスタリングプロセスを自動化します。これにより、プロセスの負担が軽減され、障害に対する耐性が高まります。
https://github.com/malawson/rabbitmq-ecs-autoclustering

0
arnaud lawson