如何设置简单的dockerized RabbitMQ集群?

时间:2016-12-23 13:09:52

标签: docker rabbitmq cluster-computing ubuntu-16.04

我一直在阅读有关设置dockerized RabbitMQ群集的一些内容,谷歌会在同一台机器上显示各种结果。

我正在尝试在多台计算机上设置RabbitMQ群集。

我有三台机器名为dockerswarmmodemaster1dockerswarmmodemaster2dockerswarmmodemaster3

在第一台机器(dockerswarmmodemaster1)上,我发出以下命令:

docker run -d -p 4369:4369 -p 5671:5671 -p 5672:5672 -p 15671:15671 -p 15672:15672 \
    -p 25672:25672 --hostname dockerswarmmodemaster1 --name roger_rabbit \
    -e RABBITMQ_ERLANG_COOKIE='secret cookie here' rabbitmq:3-management

现在启动一个rabbitMQ就好了,我可以转到15672的管理页面,看看它是否正常运行。

然后我连接到我的第二台机器(dockerswarmmodemaster2),这就是我被困住的位置。我一直在尝试以下命令的变体:

docker run -d -p 4369:4369 -p 5671:5671 -p 5672:5672 -p 15671:15671  \
    -p 15672:15672 -p 25672:25672 --name jessica_rabbit -e CLUSTERED=true \
    -e CLUSTER_WITH=rabbit@dockerswarmmodemaster1 \
    -e RABBITMQ_ERLANG_COOKIE='secret cookie here' \
    rabbitmq:3-management

无论我尝试什么,两台RabbitMQ机器上的网页都说“集群链接”下没有集群。部分。我还没有尝试过涉及第三台机器。

所以 - 更多信息:
  1.机器名称可由DNS解析   2.我尝试在两台机器上的docuker run命令中使用--net = host开关;没有变化。
  3.我没有使用docker swarm或swarm模式   4.我没有安装docker compose。如果可能,我不想使用它。

有没有办法从docker run命令执行此操作,还是我必须下载rabbit admin cli并手动加入群集?

3 个答案:

答案 0 :(得分:2)

您可以使用此插件https://github.com/aweber/rabbitmq-autocluster创建RabbitMQ泊坞窗群集。

该插件使用etcd2consul作为服务发现,这样您就不需要使用rabbitmqctl命令行。

我将它与docker swarm一起使用,但没有必要。

Here是结果

答案 1 :(得分:2)

官方容器似乎不支持环境变量CLUSTEREDCLUSTER_WITH。它仅支持RabbitMQ Configuration中指定的列表变量。 根据官方Clustering Guide,可能的解决方案之一是通过配置文件。因此,您可以只为容器提供自己的配置。 您的案例中修改后的默认配置如下所示:

[ 
  { rabbit, [ 
    { loopback_users, [ ] }, 
    { cluster_nodes, {['rabbit@dockerswarmmodemaster1'], disc }} 
  ]} 
].

将此代码段保存为/home/user/rmq/rabbitmq.config。 提示:如果要在管理控制台中查看节点,则需要添加另一个仅包含字符串的文件/home/user/rmq/enabled_plugins

[rabbitmq_management].

之后,您的命令看起来像

docker run -d -p 4369:4369 -p 5671:5671 -p 5672:5672 -p 15671:15671  \
-p 15672:15672 -p 25672:25672 --name jessica_rabbit \
-v /home/user/rmq:/etc/rabbmitmq \
-e RABBITMQ_ERLANG_COOKIE='secret cookie here' \
rabbitmq:3-management

PS您可能还需要考虑设置环境变量RABBITMQ_USE_LONGNAME。

答案 2 :(得分:2)

为了创建集群,所有要构成集群的rabbitmq节点必须按节点名称(主机名)访问(每个节点都由其他节点)。 您需要为每个具有--hostname选项的docker容器指定主机名,并为所有其他容器添加/ etc / host条目,这可以使用--add-host选项或手动编辑/ etc / hosts文件。 所以,这是一个带有docker容器的3个rabbitmq节点集群的示例(rabbitmq:3-management image):

首先创建一个网络,以便您可以分配IP:docker network create --subnet=172.18.0.0/16 mynet1。我们将有以下内容:

  • 名为rab1con,rab2con和rab3con的3个泊坞容器
  • IP分别为172.18.0.11,-12和-13
  • 他们每个人的主人名分别为rab1,rab2和rab3
  • 所有必须共享相同的erlang cookie

旋转第一个

docker run -d --net mynet1 --ip 172.18.0.11 --hostname rab1 --add-host rab2:172.18.0.12 --add-host rab3:172.18.0.13 --name rab1con -e RABBITMQ_ERLANG_COOKIE='secret cookie here' rabbitmq:3-management

第二个

docker run -d --net mynet1 --ip 172.18.0.12 --hostname rab2 --add-host rab1:172.18.0.11 --add-host rab3:172.18.0.13 --name rab2con -e RABBITMQ_ERLANG_COOKIE='secret cookie here' rabbitmq:3-management

最后一个

docker run -d --net mynet1 --ip 172.18.0.13 --hostname rab3 --add-host rab2:172.18.0.12 --add-host rab1:172.18.0.11 --name rab3con -e RABBITMQ_ERLANG_COOKIE='secret cookie here' rabbitmq:3-management

比容器rab2con做

rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rab1
rabbitmqctl start_app

和rab3con一样,就是这样。