我嘗試了所有可以想到的組合,試圖在 AWS 環境中對rabbitmq進行叢集。但回顧一下:
- 關閉並刪除我本地 ubuntu 14 上的 erlang 和rabbit 發行版
- 嘗試了網路上的自動配置模組
- 預設安裝的 ubuntu 14 版本不會削減它。
- Erlang cookie 匹配 - 這在下面演示
主機名稱不符是唯一的難題。節點本身認為它的主機名稱分別是「q1」或「q2」。當我嘗試將容器的主機名稱設定為主機的私人 dns 名稱(以便它可以連接到其他節點)時,容器中的rabbit實例崩潰了。不低於如何hostname
產生q2
,但我砲擊了亞馬遜私人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 的 cookie
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:/#
問題是如何讓這些東西聚集在一起?缺少什麼成分?該錯誤訊息在網路上沒有任何意義。有人有這方面的經驗嗎?
更新 這些執行個體的 AWS 安全性群組:
Custom TCP Rule
TCP
1024 - 65535
0.0.0.0/0
答案1
好,我知道了!
每個節點的主機名稱必須在容器內對齊。
在主機 (q2) 上,我在主機檔案中檢查了它所知道的主機:
# 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,我必須將其刪除(它也有rabbit)。