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

How do I set up a simple dockerized RabbitMQ cluster?

我一直在阅读有关设置 docker 化 RabbitMQ 集群的一些资料,google 在同一台机器上这样做会得到各种各样的结果。

我正在尝试跨多台机器设置 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 上的管理页面,看看它是否按预期工作。

然后我通过 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机器上的网页都说'cluster links'部分下没有集群。我还没有尝试涉及第三台机器。

所以 - 更多信息:

  1. 计算机名称可由 DNS 解析。
  2. 我已经尝试在两台机器上的 docker 运行 命令中使用 --net=host 开关;没有变化。
  3. 我没有使用 docker swarm 或 swarm 模式。
  4. 我没有安装 docker compose。如果可能,我宁愿不使用它。

有什么方法可以从 docker 运行 命令执行此操作,还是我必须下载 rabbit admin cli 并手动加入集群?

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

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

我在 docker swarm 中使用了它,但这不是必需的。

Here是结果

官方容器好像不支持环境变量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.

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

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

  • 3 docker 个名为 rab1con、rab2con 和 rab3con 的容器
  • 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 中也是如此。