RabbitMQ部署指南

简介: 本指南详细介绍RabbitMQ在CentOS7中基于Docker的单机与集群部署,涵盖DelayExchange插件安装、普通模式与镜像模式集群搭建、仲裁队列配置及高可用测试,助力实现稳定可靠的消息队列服务。

RabbitMQ部署指南
1.单机部署
我们在Centos7虚拟机中使用Docker来安装。
1.1.下载镜像
1.2.安装MQ
执行下面的命令来运行MQ容器:

启动后即可验证:http://192.168.206.128:15672/#/
2.安装DelayExchange插件
官方的安装指南地址为:官方地址。上述文档是基于linux原生安装RabbitMQ,然后安装插件。
因为我们之前是基于Docker安装RabbitMQ,所以下面我们会讲解基于Docker来安装RabbitMQ插件。
2.1.下载插件
RabbitMQ官方的插件社区地址:链接,其中包含各种各样的插件,包括我们使用的DelayExchange插件:
读者朋友们可以去对应的GitHub页面下载3.8.9版本的插件,地址为:插件地址,这个对应RabbitMQ的3.8.5以上版本。这里我也提供了下载好的插件:
2.2.上传插件
因为我们是基于Docker安装,所以需要先查看RabbitMQ的插件目录对应的数据卷。如果不是基于Docker的读者朋友们,请参考第一章部分,重新创建Docker容器。
我们之前设定的RabbitMQ的数据卷名称为mq-plugins,所以我们使用下面命令查看数据卷:
可以得到下面结果:
接下来,将插件上传到这个目录即可:
2.3.安装插件
最后就是安装了,需要进入MQ容器内部来执行安装。我的容器名为mq,所以执行下面命令:
执行时,请将其中的 -it 后面的mq替换为你自己的容器名。进入容器内部后,执行下面命令开启插件:
结果如下:
3.集群部署
3.1.集群分类
在RabbitMQ的官方文档中,讲述了两种集群的配置方式:
普通模式:普通模式集群不进行数据同步,每个MQ都有自己的队列、数据信息(其它元数据信息如交换机等会同步)。例如我们有2个MQ:mq1,和mq2,如果你的消息在mq1,而你连接到了mq2,那么mq2会去mq1拉取消息,然后返回给你。如果mq1宕机,消息就会丢失。
镜像模式:与普通模式不同,队列会在各个mq的镜像节点之间同步,因此你连接到任何一个镜像节点,均可获取到消息。而且如果一个节点宕机,并不会导致数据丢失。不过,这种方式增加了数据同步的带宽消耗。
我们先来看普通模式集群,我们的计划部署3节点的mq集群:
主机名
控制台端口
amqp通信端口
mq1
8081 ---> 15672
8071 ---> 5672
mq2
8082 ---> 15672
8072 ---> 5672
mq3
8083 ---> 15672
8073 ---> 5672
集群中的节点标示默认都是:rabbit@[hostname],因此以上三个节点的名称分别为:
rabbit@mq1
rabbit@mq2
rabbit@mq3
3.2.获取cookie
RabbitMQ底层依赖于Erlang,而Erlang虚拟机就是一个面向分布式的语言,默认就支持集群模式。集群模式中的每个RabbitMQ 节点使用 cookie 来确定它们是否被允许相互通信。要使两个节点能够通信,它们必须具有相同的共享秘密,称为Erlang cookie。cookie 只是一串最多 255 个字符的字母数字字符。
每个集群节点必须具有相同的 cookie。实例之间也需要它来相互通信。我们先在之前启动的mq容器中获取一个cookie值,作为集群的cookie。执行下面的命令:
可以看到cookie值如下:
也可到指定容器下去查找,路径:/var/lib/docker/volumes/最新数据/_data/.erlang.cookie
接下来,停止并删除当前的mq容器,我们重新搭建集群。
3.3.准备集群配置
在/tmp目录新建一个配置文件 rabbitmq.conf:
文件内容如下:
再创建一个文件,记录cookie
准备三个目录,mq1、mq2、mq3:
然后拷贝rabbitmq.conf、cookie文件到mq1、mq2、mq3:
3.4.启动集群
创建一个网络,用作集群间通信:
运行命令
3.5.测试
在mq1这个节点上添加一个队列:
如图,在mq2和mq3两个控制台也都能看到:
3.5.1.数据共享测试
点击这个队列,进入管理页面:
然后利用控制台发送一条消息到这个队列:
结果在mq2、mq3上都能看到这条消息:
3.5.2.可用性测试
我们让其中一台节点mq1宕机:
然后登录mq2或mq3的控制台,发现simple.queue也不可用了:
说明数据并没有拷贝到mq2、mq3。显然在生产环境下是不可以的,那么如何更好的做集群设计和优化呢?
4.镜像模式
在刚刚的案例中,一旦创建队列的主机宕机,队列就会不可用。不具备高可用能力。如果要解决这个问题,必须使用官方提供的镜像集群方案。官方文档地址:https://www.rabbitmq.com/ha.html
4.1.镜像模式的特征
默认情况下,队列只保存在创建该队列的节点上。而镜像模式下,创建队列的节点被称为该队列的主节点,队列还会拷贝到集群中的其它节点,也叫做该队列的镜像节点。但是,不同队列可以在集群中的任意节点上创建,因此不同队列的主节点可以不同。甚至,一个队列的主节点可能是另一个队列的镜像节点。用户发送给队列的一切请求,例如发送消息、消息回执默认都会在主节点完成,如果是从节点接收到请求,也会路由到主节点去完成。镜像节点仅仅起到备份数据作用。当主节点接收到消费者的ACK时,所有镜像都会删除节点中的数据。
总结如下:
镜像队列结构是一主多从(从就是镜像)
所有操作都是主节点完成,然后同步给镜像节点
主宕机后,镜像节点会替代成新的主(如果在主从同步完成前,主就已经宕机,可能出现数据丢失)
不具备负载均衡功能,因为所有操作都会有主节点完成(但是不同队列,其主节点可以不同,可以利用这个提高吞吐量)
4.2.镜像模式的配置
镜像模式的配置有3种模式:
ha-mode
ha-params
效果
准确模式exactly
队列的副本量count
集群中队列副本(主服务器和镜像服务器之和)的数量。count如果为1意味着单个副本:即队列主节点。count值为2表示2个副本:1个队列主和1个队列镜像。换句话说:count = 镜像数量 + 1。如果群集中的节点数少于count,则该队列将镜像到所有节点。如果有集群总数大于count+1,并且包含镜像的节点出现故障,则将在另一个节点上创建一个新的镜像。
all
(none)
队列在群集中的所有节点之间进行镜像。队列将镜像到任何新加入的节点。镜像到所有节点将对所有群集节点施加额外的压力,包括网络I / O,磁盘I / O和磁盘空间使用情况。推荐使用exactly,设置副本数为(N / 2 +1)。
nodes
node names
指定队列创建到哪些节点,如果指定的节点全部不存在,则会出现异常。如果指定的节点在集群中存在,但是暂时不可用,会创建节点到当前客户端连接到的节点。
这里我们以rabbitmqctl命令作为案例来讲解配置语法。
4.2.1.exactly模式
rabbitmqctl set_policy:固定写法
ha-two:策略名称,自定义
"^two.":匹配队列的正则表达式,符合命名规则的队列才生效,这里是任何以two.开头的队列名称
'{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}': 策略内容
"ha-mode":"exactly":策略模式,此处是exactly模式,指定副本数量
"ha-params":2:策略参数,这里是2,就是副本数量为2,1主1镜像
"ha-sync-mode":"automatic":同步策略,默认是manual,即新加入的镜像节点不会同步旧的消息。如果设置为automatic,则新加入的镜像节点会把主节点中所有消息都同步,会带来额外的网络开销
4.2.2.all模式
ha-all:策略名称,自定义
"^all.":匹配所有以all.开头的队列名
'{"ha-mode":"all"}':策略内容
"ha-mode":"all":策略模式,此处是all模式,即所有节点都会称为镜像节点
4.2.3.nodes模式
rabbitmqctl set_policy:固定写法
ha-nodes:策略名称,自定义
"^nodes.":匹配队列的正则表达式,符合命名规则的队列才生效,这里是任何以nodes.开头的队列名称
'{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}': 策略内容
"ha-mode":"nodes":策略模式,此处是nodes模式
"ha-params":["rabbit@mq1", "rabbit@mq2"]:策略参数,这里指定副本所在节点名称
4.3.测试
我们使用exactly模式的镜像,因为集群节点数量为3,因此镜像数量就设置为2。运行下面的命令(任一节点均可,这里以mq1为例),进入控制台:
下面,我们创建一个新的队列:
在任意一个mq控制台查看队列:
4.3.1.测试数据共享
注意:下面的发消息,需要点击图示:+1 ,查看对应的从节点是哪个再去操作,这里我的是mq2
给two.queue发送一条消息:
然后在mq1、mq2、mq3的任意控制台查看消息:
4.3.2.测试高可用
现在,我们让two.queue的主节点mq1宕机:
查看集群状态:
查看队列状态:
发现依然是健康的!并且其主节点切换到了rabbit@mq2上
5.仲裁队列
从RabbitMQ 3.8版本开始,引入了新的仲裁队列,他具备与镜像队里类似的功能,但使用更加方便。
5.1.添加仲裁队列
在任意控制台添加一个队列,一定要选择队列类型为Quorum类型。
在任意控制台查看队列:
可以看到,仲裁队列的 + 2字样。代表这个队列有2个镜像节点。因为仲裁队列默认的镜像数为5。如果你的集群有7个节点,那么镜像数肯定是5;而我们集群只有3个节点,因此镜像数量就是3.
5.2.测试
可以参考对镜像集群的测试,效果是一样的。
5.3.集群扩容
5.3.1.加入集群
1)启动一个新的MQ容器:
2)进入容器控制台:
3)停止mq进程
4)重置RabbitMQ中的数据:
5)加入mq1:
6)再次启动mq进程
5.3.2.增加仲裁队列副本
我们先查看下quorum.queue这个队列目前的副本情况,进入mq1容器:
Shell
运行代码
复制代码
1
docker exec -it mq1 bash
执行命令:
Shell
运行代码
复制代码
1
rabbitmq-queues quorum_status "quorum.queue"
结果:
现在,我们让mq4也加入进来:
Shell
运行代码
复制代码
1
rabbitmq-queues add_member "quorum.queue" "rabbit@mq4"
结果:
再次查看:
Shell
运行代码
复制代码
1
rabbitmq-queues quorum_status "quorum.queue"
查看控制台,发现quorum.queue的镜像数量也从原来的 +2 变成了 +3:

相关文章
|
编解码 Linux 编译器
使用 C++ 方式实现 GBK 到 UTF-8 转码 (win / linux)
使用 C++ 的方式处理在 Windows 平台和 Linux 平台,编码字符集从 GBK 到 UTF-8 转码,C++ 存在多种方式实现
4504 1
|
存储 弹性计算 安全
阿里云数字新基建系列——混合云架构(第2章-1)
阿里云经过12年的发展,以IaaS、PaaS分层为标准的云计算基础技术已经非常成熟,同时围绕这两层的泛网络、泛存储、泛安全等对云计算攸关的技术也起着关键支撑作用。当然,阿里云的核心技术有很多,包括但不限于数据库、大数据、IoT、AI等技术。限于篇幅,本章不会涉及这些内容,后续章节主要是介绍IaaS和PaaS层及相关的泛网络、泛存储、泛安全技术原理。
阿里云数字新基建系列——混合云架构(第2章-1)
|
5月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
952 108
|
消息中间件 存储 运维
2024最全RabbitMQ集群方案汇总
本文梳理了RabbitMQ集群的几种方案,主要包括普通集群、镜像集群(高可用)、Quorum队列(仲裁队列)、Streams集群模式(高可用+负载均衡)和插件方式。重点介绍了每种方案的特点、优缺点及适用场景。搭建步骤包括安装Erlang和RabbitMQ、配置集群节点、修改hosts文件、配置Erlang Cookie、启动独立节点并创建集群,以及配置镜像队列以提高可用性和容错性。推荐使用Quorum队列与Streams模式,其中Quorum队列适合高可用集群,Streams模式则同时支持高可用和负载均衡。此外,还有Shovel和Federation插件可用于特定场景下的集群搭建。
3034 2
|
机器学习/深度学习 编解码 人工智能
人脸表情[七种表情]数据集(15500张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
本数据集包含15,500张已划分、已标注的人脸表情图像,覆盖惊讶、恐惧、厌恶、高兴、悲伤、愤怒和中性七类表情,适用于YOLO系列等深度学习模型的分类与检测任务。数据集结构清晰,分为训练集与测试集,支持多种标注格式转换,适用于人机交互、心理健康、驾驶监测等多个领域。
|
1月前
|
消息中间件 存储 Java
消息中间件RabbitMQ(高级)
本节深入RabbitMQ高级特性,涵盖消息可靠性保障、持久化、消费者确认与重试机制,结合TTL与死信交换机实现延迟队列,通过惰性队列解决消息堆积,并详解普通集群、镜像集群及仲裁队列的搭建与应用,全面提升RabbitMQ在生产环境中的高可用与稳定性。
97 0
|
3月前
|
存储 关系型数据库 MySQL
MySQL Docker 容器化部署全指南
MySQL是一款开源关系型数据库,广泛用于Web及企业应用。Docker容器化部署可解决环境不一致、依赖冲突问题,实现高效、隔离、轻量的MySQL服务运行,支持数据持久化与快速迁移,适用于开发、测试及生产环境。
694 4
vcpkg安装软件包时自定义编译选项
vcpkg安装软件包时自定义编译选项
1147 0
|
消息中间件
rabbitMQ集群
rabbitMQ集群
261 0
|
编解码
LabVIEW用户界面设计
LabVIEW用户界面设计
319 0

热门文章

最新文章