如何设置一个简单的 dockerized RabbitMQ 集群?
How do I set up a simple dockerized RabbitMQ cluster?
我一直在阅读有关设置 docker 化 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机器上的网页都说'cluster links'部分下没有集群。我还没有尝试涉及第三台机器。
所以 - 更多信息:
- 计算机名称可由 DNS 解析。
- 我已经尝试在两台机器上的 docker 运行 命令中使用 --net=host 开关;没有变化。
- 我没有使用 docker swarm 或 swarm 模式。
- 我没有安装 docker compose。如果可能,我宁愿不使用它。
有什么方法可以从 docker 运行 命令执行此操作,还是我必须下载 rabbit admin cli 并手动加入集群?
您可以使用此插件 https://github.com/aweber/rabbitmq-autocluster 创建 RabbitMQ docker 集群。
插件使用etcd2
或consul
作为服务发现,这样你就不需要使用rabbitmqctl
命令行。
我在 docker swarm 中使用了它,但这不是必需的。
Here是结果
官方容器好像不支持环境变量CLUSTERED
和CLUSTER_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 中也是如此。
我一直在阅读有关设置 docker 化 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机器上的网页都说'cluster links'部分下没有集群。我还没有尝试涉及第三台机器。
所以 - 更多信息:
- 计算机名称可由 DNS 解析。
- 我已经尝试在两台机器上的 docker 运行 命令中使用 --net=host 开关;没有变化。
- 我没有使用 docker swarm 或 swarm 模式。
- 我没有安装 docker compose。如果可能,我宁愿不使用它。
有什么方法可以从 docker 运行 命令执行此操作,还是我必须下载 rabbit admin cli 并手动加入集群?
您可以使用此插件 https://github.com/aweber/rabbitmq-autocluster 创建 RabbitMQ docker 集群。
插件使用etcd2
或consul
作为服务发现,这样你就不需要使用rabbitmqctl
命令行。
我在 docker swarm 中使用了它,但这不是必需的。
Here是结果
官方容器好像不支持环境变量CLUSTERED
和CLUSTER_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 中也是如此。