RabbitMQ——Docker搭建RabbitMQ集群

本文介绍如何使用Docker搭建RabbitMQ集群,包括普通集群与镜像集群的搭建步骤,并详细解释了两种集群模式的特点及应用场景。

RabbitMQ——Docker搭建RabbitMQ集群

集群模式介绍

RabbitMQ集群模式有两种:普通模式和镜像模式

  • 普通模式:默认模式,多个节点组成的普通集群,消息随机发送到其中一个节点的队列上,其他节点仅保留元数据,各个节点仅有相同的元数据,即队列结构、交换器结构、交换器与队列绑定关系、vhost。消费者消费消息时,会从各个节点拉取消息,如果保存消息的节点故障,则无法消费消息,如果做了消息持久化,那么得等该节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。
  • 镜像模式:它是在普通模式的基础上,把需要的队列做成镜像队列,存在于多个节点来实现高可用(HA)。该模式解决了上述问题,Broker会主动地将消息实体在各镜像节点间同步,在consumer取数据时无需临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被大量消耗。通常地,对可靠性要求较高的场景建议采用镜像模式。

1、普通集群的搭建

1.1、普通集群架构介绍

架构图

在这里插入图片描述

1.2、环境准备

拉取RabbitMQ镜像

docker pull rabbitmq:3.7-management

在这里插入图片描述

创建并运行三个RabbitMQ容器节点,一主两从

命令如下:

#rabbitmqCluster01 主节点
docker run -d --hostname rabbitmq01 --name rabbitmqCluster01 -v `pwd`/rabbitmq01:/var/lib/rabbitmq -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie' rabbitmq:3.7-management

#rabbitmqCluster02 从节点
docker run -d --hostname rabbitmq02 --name rabbitmqCluster02 -v `pwd`/rabbitmq02:/var/lib/rabbitmq -p 7002:15672 -p 5673:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie'  --link rabbitmqCluster01:rabbitmq01 rabbitmq:3.7-management

#rabbitmqCluster03 从节点
docker run -d --hostname rabbitmq03 --name rabbitmqCluster03 -v `pwd`/rabbitmq03:/var/lib/rabbitmq -p 8002:15672 -p 5674:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie'  --link rabbitmqCluster01:rabbitmq01 --link rabbitmqCluster02:rabbitmq02  rabbitmq:3.7-management

-d 后台运行容器;

–name 指定容器名;

-p 指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号),控制台端口用于管理rabbitmq,应用访问端口号为rabbitclient等应用访问。;

-v 映射目录或文件,pwd 当前目录;

–hostname 主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名);

-e 指定环境变量;(RABBITMQ_DEFAULT_VHOST:默认虚拟机名;RABBITMQ_DEFAULT_USER:默认的用户名;RABBITMQ_DEFAULT_PASS:默认用户名的密码,RABBITMQ_ERLANG_COOKIE 节点认证作用,部署集成时 需要同步该值)

–link 用于容器的链接

查看运行中的三个RabbitMQ容器:

在这里插入图片描述

登录 RabbitMQ 控制台界面:

rabbitmq01 节点:

在这里插入图片描述

rabbitmq02 节点:

在这里插入图片描述

rrabbitmq03 节点

在这里插入图片描述

1.3、集群搭建

将rabbitmqCluster02 节点和 rabbitmqCluster03 节点加入 rabbitmqCluster01 创建集群

进入 rabbitmqCluster02 节点和 rabbitmqCluster03 节点,在两个节点分别执行一下加入集群的命令:

rabbitmqctl stop_app

rabbitmqctl reset
#rabbitmq01为rabbitmqCluster01容器中的hostname
rabbitmqctl join_cluster --ram rabbit@rabbitmq01

rabbitmqctl start_app

rabbitmqCluster02 节点:

在这里插入图片描述

rabbitmq-slave1 节点:

在这里插入图片描述

执行完后在任意节点查看集群状态:

rabbitmqctl cluster_status

如果出现如下显示,集群搭建成功:

在这里插入图片描述

之后我们在主节点的web管理页可以看到两个从节点了:

在这里插入图片描述

2、镜像集群的搭建

镜像集群的结构图

在这里插入图片描述

2.1、配置镜像集群的策略

1、使用命令配置策略:

rabbitmqctl set_policy [-p Vhost] [--priority <priority>] [--apply-to <apply-to>]  Name Pattern Definition

参数说明:

-p Vhost: 可选参数,针对指定 vhost 下的 queue 进行设置

Name: policy 的名称

Pattern: queue 的匹配模式(正则表达式)

Definition:镜像定义,包括三个部分 ha-mode, ha-params, ha-sync-mode

  • ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes
    • all:表示在集群中所有的节点上进行镜像
    • exactly:表示在指定个数的节点上进行镜像,节点的个数由 ha-params 指定
    • nodes:表示在指定的节点上进行镜像,节点名称通过 ha-params 指定
  • ha-params:作为参数,为 ha-mode 的补充
  • ha-sync-mode:进行队列中消息的同步方式,有效值为 automatic 和 manual

pririty:可选参数,policy的优先级

在任意节点上添加策略:

#^hello 匹配hello开头的队列
rabbitmqctl set_policy ha-all "^hello" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

在所有节点的以hello开头的队列上都添加了策略:以后当主节点宕机时,hello队列里未消费的消息也不会丢失,会复制到其他节点上。

在这里插入图片描述

删除策略:

#rabbitmqctl clear_policy 策略名称
rabbitmqctl clear_policy ha-all

2、管理界面配置策略

登录 rabbitmq 管理页面 ——> Admin ——> Policies ——> Add / update a policy

在这里插入图片描述

name:策略名称

Pattern:^匹配符,只有一个^代表匹配所有。^message指同步“message”开头的队列名称

Definition:ha-mode=all 为匹配类型,分为3种模式:all(表示所有的queue)

Priority:优先级,首先根据priority排序,值越大的优先级越高;相同priority则根据创建时间排序,越晚创建的优先级越高。

Operator Policy 和 User Policy 的区别:

  • Operator Policy 是给服务提供商或公司基础设施部门用来设置某些需要强制执行的通用规则
  • User Policy 是给业务应用用来设置的规则
<think>好的,我现在需要帮助用户解决如何使用Docker搭建RabbitMQ集群的问题。根据用户提供的引用内容,我需要整理出一个清晰的步骤指南。首先,我需要确定用户的需求是搭建一个多节点的RabbitMQ集群,并且使用Docker来实现。用户可能对Docker有一定的了解,但可能不熟悉具体的集群配置步骤。 首先,我应该回顾用户提供的引用内容,特别是引用[3]、[4]和[5],因为这些引用中包含了具体的Docker命令和配置步骤。引用[3]给出了启动三个节点的示例命令,每个节点使用不同的端口和主机名,并且通过--link参数连接。不过,注意到--link在较新的Docker版本中可能已被弃用,改用自定义网络更为推荐。引用[4]提到了使用自定义网络(--net mq-net)以及挂载配置文件、cookie文件等。引用[5]则强调了环境变量和目录结构的创建,以及镜像队列的应用场景和注意事项。 接下来,我需要将这些信息整合成一个连贯的步骤指南。可能需要分为几个步骤:准备Docker环境、创建自定义网络、配置Erlang Cookie、启动多个节点、加入集群、启用管理插件,以及验证集群状态。同时,需要注意不同节点之间的通信,尤其是Erlang Cookie的一致性,这是集群正常工作的关键。 另外,用户可能关心如何配置持久化存储,避免容器重启后数据丢失。因此,在启动容器时,应该包括-v参数来挂载数据卷。例如,挂载.erlang.cookie文件和配置文件到容器内的正确位置。 还需要考虑端口映射,确保每个节点的管理界面和AMQP端口正确映射到宿主机,避免端口冲突。例如,第一个节点映射15672和5672,后续节点使用不同的宿主机端口,如5673、5674等。 在集群配置部分,需要指导用户如何进入容器内执行rabbitmqctl命令,将节点加入集群。例如,将rabbitmq2和rabbitmq3加入rabbitmq1的集群。同时,可能需要提到镜像队列的配置,以提高可靠性,但也要注意网络带宽的消耗,如引用[5]所述。 最后,验证部分需要用户通过管理界面或命令行检查集群状态,确保所有节点已正确加入。同时,提醒用户注意事项,如Cookie文件权限、网络配置、资源限制等。 现在需要确保步骤清晰,命令准确,并且解释到位,避免用户在执行过程中遇到问题。可能还需要在常见问题部分预见到一些潜在的错误,例如节点无法加入集群,Cookie不匹配,端口冲突等,并给出解决方法。 总结一下,回答的结构应该是: 1. 环境准备:安装Docker,创建网络。 2. 配置Erlang Cookie:确保所有节点使用相同的cookie。 3. 启动节点:三个节点的Docker命令,包括端口映射、网络、卷挂载。 4. 组建集群:进入容器执行集群命令。 5. 启用管理插件:方便通过Web界面管理。 6. 验证集群状态:通过UI或命令行检查。 7. 镜像队列配置(可选):提高可靠性。 8. 注意事项:Cookie权限、网络、资源等。 需要检查每个步骤的命令是否正确,特别是卷挂载的路径是否正确,以及网络配置是否合理。另外,要确保命令中的参数如--hostname和--name的正确性,以及端口映射是否冲突。 可能还需要比较不同引用中的方法,选择最合适的方式。例如,引用[3]使用--link,而引用[4]使用自定义网络,后者更为现代和推荐。因此,在步骤中应采用自定义网络的方式,如创建mq-net网络,并让所有容器加入该网络,这样容器之间可以通过主机名互相访问,无需使用--link。 另外,Erlang Cookie的配置在引用[3]、[4]、[5]中都有提到,必须确保所有节点的.erlang.cookie文件内容一致,并且权限为600。因此,在步骤中需要详细说明如何创建这个文件,设置权限,并通过-v参数挂载到容器中。 最后,可能需要在常见问题部分提到如何处理节点无法加入集群的情况,例如检查Cookie是否正确,检查网络连通性,查看日志等。</think>以下是使用Docker搭建RabbitMQ集群的详细步骤: --- ### **1. 环境准备** - **安装Docker** 确保宿主机已安装Docker,并启动Docker服务[^1]。 - **创建自定义网络** ```bash docker network create mq-net ``` 使用自定义网络`mq-net`便于容器间通过主机名通信[^4]。 --- ### **2. 配置Erlang Cookie** RabbitMQ集群依赖相同的Erlang Cookie进行节点认证: ```bash echo "rabbitmq-cluster-cookie" > .erlang.cookie chmod 600 .erlang.cookie # 必须设置权限为600 ``` 所有节点需挂载此文件到容器内路径`/var/lib/rabbitmq/.erlang.cookie`[^5]。 --- ### **3. 启动RabbitMQ节点** **节点1(主节点)** ```bash docker run -d \ --name rabbitmq1 \ --hostname rabbitmq1 \ --net mq-net \ -p 5672:5672 -p 15672:15672 \ -v $(pwd)/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \ -e RABBITMQ_DEFAULT_USER=admin \ -e RABBITMQ_DEFAULT_PASS=admin \ rabbitmq:3.8-management ``` **节点2** ```bash docker run -d \ --name rabbitmq2 \ --hostname rabbitmq2 \ --net mq-net \ -p 5673:5672 -p 15673:15672 \ -v $(pwd)/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \ rabbitmq:3.8-management ``` **节点3** ```bash docker run -d \ --name rabbitmq3 \ --hostname rabbitmq3 \ --net mq-net \ -p 5674:5672 -p 15674:15672 \ -v $(pwd)/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \ rabbitmq:3.8-management ``` --- ### **4. 组建集群** 将`rabbitmq2`和`rabbitmq3`加入`rabbitmq1`的集群: ```bash # 配置rabbitmq2加入集群 docker exec rabbitmq2 rabbitmqctl stop_app docker exec rabbitmq2 rabbitmqctl reset docker exec rabbitmq2 rabbitmqctl join_cluster rabbit@rabbitmq1 docker exec rabbitmq2 rabbitmqctl start_app # 配置rabbitmq3加入集群 docker exec rabbitmq3 rabbitmqctl stop_app docker exec rabbitmq3 rabbitmqctl reset docker exec rabbitmq3 rabbitmqctl join_cluster rabbit@rabbitmq1 docker exec rabbitmq3 rabbitmqctl start_app ``` --- ### **5. 启用管理插件(可选)** 若需Web管理界面,执行: ```bash docker exec rabbitmq1 rabbitmq-plugins enable rabbitmq_management ``` 访问`http://宿主机IP:15672`,使用`admin/admin`登录[^2]。 --- ### **6. 验证集群状态** - **命令行验证** ```bash docker exec rabbitmq1 rabbitmqctl cluster_status ``` 输出应包含所有节点信息。 - **管理界面验证** 在Web界面中,导航至`Nodes`标签页,确认三个节点状态均为`running`[^3]。 --- ### **7. 配置镜像队列(可选)** 为提高队列可靠性,可在任意节点执行: ```bash rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}' ``` 此策略会将队列镜像到所有节点,但需注意网络带宽消耗[^5]。 --- ### **注意事项** 1. **Erlang Cookie权限** 必须确保挂载的Cookie文件权限为`600`,否则节点启动失败。 2. **网络配置** 节点需在同一Docker网络内,且主机名解析正常。 3. **数据持久化** 可挂载`/var/lib/rabbitmq`目录到宿主机,防止数据丢失。 4. **资源限制** 建议为容器分配足够内存,避免因资源不足导致节点崩溃。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万里顾—程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值