我一直在阅读一些有关设置 dockerized RabbitMQ 集群的信息,并且 google 找到了在同一台机器上执行此操作的各种结果。
我正在尝试跨多台机器设置 RabbitMQ 集群。
我有三台机器,名称分别为
dockerswarmmodemaster1
、dockerswarmmodemaster2
和 dockerswarmmodemaster3
在第一台机器(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 上的管理页面,看看它是否按预期工作。
然后我通过 SSH 连接到我的第二台机器(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 机器上的网页都显示“集群链接”部分下没有集群。我还没有尝试过涉及第三台机器。
所以 - 更多信息:
有什么方法可以通过 docker run 命令执行此操作,还是我必须下载rabbit admin cli 并手动加入集群?
您可以使用此插件https://github.com/aweber/rabbitmq-autocluster来创建 RabbitMQ docker 集群。
插件使用
etcd2
或consul
作为服务发现,这样你就不需要使用rabbitmqctl
命令行。
我用了docker swarm,但是没有必要。
CLUSTERED
和
CLUSTER_WITH
。它仅支持在RabbitMQ Configuration中指定的列表变量。 根据官方集群指南,可能的解决方案之一是通过配置文件。因此,您只需向容器提供您自己的配置即可。 在您的情况下修改后的默认配置将如下所示:
[
{ 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。
--hostname
选项为每个 docker 容器指定主机名,并为所有其他容器添加 /etc/host 条目,您可以使用
--add-host
选项或手动编辑 /etc/hosts 文件来完成此操作。 因此,这里是带有 docker 容器的 3 个rabbitmq 节点集群的示例(rabbitmq:3-管理镜像)。首先,创建一个网络,以便您可以分配IP:
docker network create --subnet=172.18.0.0/16 mynet1
。我们将有以下内容:
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 中也是如此,仅此而已。
2024 中的一个可能的解决方案,使用 bitnami/rabbitmq Docker 映像轻松创建带有 Docker 撰写文件的完整 RabbitMQ 集群。
来自自述文件:
services:
stats:
image: bitnami/rabbitmq
environment:
- RABBITMQ_NODE_TYPE=stats
- RABBITMQ_NODE_NAME=rabbit@stats
- RABBITMQ_ERL_COOKIE=s3cr3tc00ki3
ports:
- '15672:15672'
volumes:
- 'rabbitmqstats_data:/bitnami/rabbitmq/mnesia'
queue-disc1:
image: bitnami/rabbitmq
environment:
- RABBITMQ_NODE_TYPE=queue-disc
- RABBITMQ_NODE_NAME=rabbit@queue-disc1
- RABBITMQ_CLUSTER_NODE_NAME=rabbit@stats
- RABBITMQ_ERL_COOKIE=s3cr3tc00ki3
volumes:
- 'rabbitmqdisc1_data:/bitnami/rabbitmq/mnesia'
queue-ram1:
image: bitnami/rabbitmq
environment:
- RABBITMQ_NODE_TYPE=queue-ram
- RABBITMQ_NODE_NAME=rabbit@queue-ram1
- RABBITMQ_CLUSTER_NODE_NAME=rabbit@stats
- RABBITMQ_ERL_COOKIE=s3cr3tc00ki3
volumes:
- 'rabbitmqram1_data:/bitnami/rabbitmq/mnesia'
volumes:
rabbitmqstats_data:
driver: local
rabbitmqdisc1_data:
driver: local
rabbitmqram1_data:
driver: local