![如何在 aws 中集群 rabbitmq](https://linux22.com/image/697353/%E5%A6%82%E4%BD%95%E5%9C%A8%20aws%20%E4%B8%AD%E9%9B%86%E7%BE%A4%20rabbitmq%20.png)
我尝试了所有可能的组合,试图在 AWS 环境中集群化 RabbitMQ。但总结一下:
- 关闭并删除本地 ubuntu 14 上的 erlang 和 rabbit 发行版
- 尝试了网络上的自动配置模块
- 默认安装的 ubuntu 14 版本不起作用。
- Erlang cookies 匹配-如下所示
主机名不匹配是唯一的难题。节点本身认为它的主机名分别是“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 的 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)上,我检查了 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
然后这应该会神奇地起作用
我忘记提到的另一个步骤:本地 Ubuntu 机器上运行着一个古老版本的 erlang,我必须将其删除(它还有 rabbit)。