MQ高级(四)MQ集群

article/2025/8/28 1:09:58

一、集群分类

RabbitMQ的是基于Erlang语言编写,而Erlang又是一个面向并发的语言,天然支持集群模式。

RabbitMQ的集群有两种模式:

(1)普通集群:是一种分布式集群,将队列分散到集群的各个节点,从而提高整个集群的并发能力。

(2)镜像集群:是一种主从集群,普通集群的基础上,添加了主从备份功能,提高集群的数据可用性。

镜像集群虽然支持主从,但主从同步并不是强一致的,某些情况下可能有数据丢失的风险。因此在 RabbitMQ 的 3.8 版本以后,推出了新的功能:仲裁队列来代替镜像集群,底层采用Raft 协议确保主从的数据一致性。

二、普通集群

普通集群,或者叫标准集群(classic cluster),具备下列特征:

(1)会在集群的各个节点间共享部分数据,包括:交换机、队列元信息。不包含队列中的消息。

(2)当访问集群某节点时,如果队列不在该节点,会从数据所在节点传递到当前节点并返回 (3)队列所在节点宕机,队列中的消息就会丢失

1. 集群部署

我们先来看普通模式集群,我们的计划部署3节点的mq集群:

集群中的节点标示默认都是:`rabbit@[hostname]`,因此以上三个节点的名称分别为:

(1)rabbit@mq1

(2)rabbit@mq2

(3)rabbit@mq3

2.获取cookie

RabbitMQ 底层依赖于 Erlang,而 Erlang 虚拟机就是一个面向分布式的语言,默认就支持集群模式。集群模式中的每个 RabbitMQ 节点使用 cookie 来确定它们是否被允许相互通信。

要使两个节点能够通信,它们必须具有相同的共享秘密,称为 Erlang cookie。cookie 只是一串最多 255 个字符的字母数字字符。

每个集群节点必须具有相同的 cookie。实例之间也需要它来相互通信。

我们先在之前启动的mq容器中获取一个cookie值,作为集群的cookie。执行下面的命令:

docker exec -it mq cat /var/lib/rabbitmq/.erlang.cookie

接下来,停止并删除当前的mq容器,我们重新搭建集群。

docker rm -f mq

3. 准备集群配置

在/tmp目录新建一个配置文件 rabbitmq.conf:

cd /tmp
# 创建文件
touch rabbitmq.conf

文件内容如下:

loopback_users.guest = false
listeners.tcp.default = 5672
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
cluster_formation.classic_config.nodes.1 = rabbit@mq1
cluster_formation.classic_config.nodes.2 = rabbit@mq2
cluster_formation.classic_config.nodes.3 = rabbit@mq3

再创建一个文件,记录cookie

cd /tmp
# 创建cookie文件
touch .erlang.cookie
# 写入cookie
echo "FXZMCVGLBIXZCDEMMVZQ" > .erlang.cookie
# 修改cookie文件的权限
chmod 600 .erlang.cookie

准备三个目录,mq1、mq2、mq3:

cd /tmp
# 创建目录
mkdir mq1 mq2 mq3

然后拷贝rabbitmq.conf、cookie文件到mq1、mq2、mq3:

# 进入/tmp
cd /tmp
# 拷贝
cp rabbitmq.conf mq1
cp rabbitmq.conf mq2
cp rabbitmq.conf mq3
cp .erlang.cookie mq1
cp .erlang.cookie mq2
cp .erlang.cookie mq3

4. 启动集群

创建一个网络:

docker network create mq-net

运行命令

docker run -d --net mq-net \
-v ${PWD}/mq1/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=itcast \
-e RABBITMQ_DEFAULT_PASS=123321 \
--name mq1 \
--hostname mq1 \
-p 8071:5672 \
-p 8081:15672 \
rabbitmq:3.8-management
docker run -d --net mq-net \
-v ${PWD}/mq2/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=itcast \
-e RABBITMQ_DEFAULT_PASS=123321 \
--name mq2 \
--hostname mq2 \
-p 8072:5672 \
-p 8082:15672 \
rabbitmq:3.8-management
docker run -d --net mq-net \
-v ${PWD}/mq3/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=itcast \
-e RABBITMQ_DEFAULT_PASS=123321 \
--name mq3 \
--hostname mq3 \
-p 8073:5672 \
-p 8083:15672 \
rabbitmq:3.8-management

三、镜像集群

镜像集群:本质是主从模式,具备下面的特征:

(1)交换机、队列、队列中的消息会在各个mq的镜像节点之间同步备份。

(2)创建队列的节点被称为该队列的主节点,备份到的其它节点叫做该队列的镜像节点

(3)一个队列的主节点可能是另一个队列的镜像节点

(4)所有操作都是主节点完成,然后同步给镜像节点

(5)主宕机后,镜像节点会替代成新的主

 

镜像模式的配置有3种模式:

 

3.1 exactly模式

rabbitmqctl set_policy ha-two "^two\." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'

(1)rabbitmqctl set_policy:固定写法

(2)a-two:策略名称,自定义

(3)"^two\.":匹配队列的正则表达式,符合命名规则的队列才生效,这里是任何以`two.`开头的队列名称

(4)'{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}':策略内容

1️⃣"ha-mode":"exactly":策略模式,此处是exactly模式,指定副本数量

2️⃣"ha-params":2:策略参数,这里是2,就是副本数量为2,1主1镜像

3️⃣"ha-sync-mode":"automatic":同步策略,默认是manual,即新加入的镜像节点不会同步旧的消息。如果设置为automatic,则新加入的镜像节点会把主节点中所有消息都同步,会带来额外的网络开销

3.2 all模式

rabbitmqctl set_policy ha-all "^all\." '{"ha-mode":"all"}'

(1)ha-all:策略名称,自定义

(2)"^all\.":匹配所有以`all.`开头的队列名

(3)'{"ha-mode":"all"}':策略内容

1️⃣"ha-mode":"all":策略模式,此处是all模式,即所有节点都会称为镜像节点

3.3 nodes模式

rabbitmqctl set_policy ha-nodes "^nodes\." '{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}'

(1)rabbitmqctl set_policy:固定写法

(2)ha-nodes:策略名称,自定义

(3)"^nodes\.":匹配队列的正则表达式,符合命名规则的队列才生效,这里是任何以`nodes.`开头的队列名称

1️⃣'{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}':策略内容

2️⃣"ha-mode":"nodes":策略模式,此处是nodes模式

3️⃣"ha-params":["rabbit@mq1", "rabbit@mq2"]:策略参数,这里指定副本所在节点名称

四、仲裁队列

仲裁队列:仲裁队列是3.8版本以后才有的新功能,用来替代镜像队列,具备下列特征:

(1)与镜像队列一样,都是主从模式,支持主从数据同步 使

(2)用非常简单,没有复杂的配置

(3)主从同步基于Raft协议,强一致

1. 添加仲裁队列

在任意控制台添加一个队列,一定要选择队列类型为Quorum类型。

 

2. SpringAMQP

SpringAMQP创建仲裁队列:

@Configuration
public class QuorumConfig {@Beanpublic Queue quorumQueue() {return QueueBuilder.durable("quorum.queue2") // 持久化.quorum() // 仲裁队列.build();}
}

SpringAMQP连接集群,只需要在yaml中配置即可:

spring:rabbitmq:
#    host: 192.168.150.101 # rabbitMQ的ip地址
#    port: 5672 # 端口addresses: 192.168.150.101:8071, 192.168.150.101:8072, 192.168.150.101:8073username: itcastpassword: 123321virtual-host: /


http://chatgpt.dhexx.cn/article/nIQ8Oy5E.shtml

相关文章

MQ-2烟雾传感器解析

一、工作原理 可用于家庭和工厂的气体泄漏监测装置,适宜于液化气、苯、烷、酒精、氢气、烟雾等的探测。故因此,MQ-2可以准确来说是一个多种气体探测器。MQ-2的探测范围极其的广泛。它的优点:灵敏度高、响应快、稳定性好、寿命长、驱动电路简…

MQ2

死信队列 什么是死信队列 一般来说,producer将消息投递到queue中,consumer从queue取出消息进行消费,但某些时候由于特定的原因导致queue中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信(Dead Lett…

MQ-2学习笔记

1.工作原理 MQ-2型烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式N型半导体。处于200~300摄氏度时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与烟雾接触时…

01、RabbitMQ入门

目录 1.、什么是MQ 2、应用场景 3、主流MQ框架 4、Docker安装部署RabbitMQ 5、RabbitMQ管理平台 6、MQ的核心概念 单一生产者和单一消费者 7、springboot整合rabbitmq 执行测试方法testRabbitmq,控制台输出:receive msg : test rabbitmq messag…

MQ2烟雾传感器

1、MQ-2气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。MQ-2气体传感器可用于家…

MQ-2烟雾传感器

一、MQ-2烟雾传感器简介 MQ-2常用于家庭和工厂的气体泄漏监测装置,适宜于液化气、苯、烷、酒精、氢气、烟雾等的探测。故因此,MQ-2可以准确来说是一个多种气体探测器。 MQ-2的探测范围极其的广泛。它的优点:灵敏度高、响应快、稳定性好、寿…

MQ-2烟雾浓度传感器(STM32F103)

本实验是通过串口调试助手显示STM32F103C8T6采集到MQ-2传感器的电压值。 一、 概述 1. 简介 MQ-2可用于家庭和工厂的气体泄漏监装置,适宜于液化气、丁烷、丙烷、甲烷、酒精、烟雾等的探测。它的优点是灵敏度高、响应快、稳定性好。寿命长、驱动电路简单以及方便安…

MQ-2烟雾传感器的原理及使用教程

一、MQ-2烟雾传感器简介 MQ-2常用于家庭和工厂的气体泄漏监测装置,适宜于液化气、苯、烷、酒精、氢气、烟雾等的探测。故因此,MQ-2可以准确来说是一个多种气体探测器。 MQ-2的探测范围极其的广泛。它的优点:灵敏度高、响应快、稳定性好、寿命…

MQ-2烟雾传感器的使用

一、MQ-2烟雾传感器简介 MQ-2烟雾传感器采用在清洁空气中电导率较低的二氧化锡(SnO2),属于表面离子式N型半导体。当MQ-2烟雾传感器在200到300摄氏度环境时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少&a…

MQ-2烟雾传感器模块功能实现(STM32)

认识MQ-2模块与其工作原理 MQ-2型烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式N型半导体。当处于200~300摄氏度时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。…

MQ-2烟雾浓度传感器

文章目录 一、模块简介二、工作原理三、程序设计 本实验将采集到的传感器数据利用ADC转换,将转换后的电压值显示在串口调试助手上 一、模块简介 MQ-2烟雾传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当烟雾传感器所处环境中存在可燃气体时&a…

python杨辉三角输出指定行_python杨辉三角输出指定行_使用python打印十行杨辉三角过程详解...

如何用python输出杨辉三角 程序输出需要实现如下效果: [1] [1,1] [1,2,1] [1,3,3,1] .. 方法:迭代,生成器 123456789101112131415161718192021 def triangles() L [1] while True: yiled L L [1] [L[i] L[I1] for i in range(len(L)-1)] …

蓝桥杯 python 杨辉三角

欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&#x…

python杨辉三角 简单方法

何为杨辉三角,杨辉三角就是,第一行与第二行分别为1和1,1 再往后第三行就有规律了,除了开头和结尾的数(都是1),每个数都是自己左上角和右上角的和。如图: 如何用编程把它实现呢?我们…

Python 杨辉三角

前言:我在学习Python的时候,正好学到列表推导式,于是这里尝试运用列表推导式来写一个杨辉三角。如果能点出其中不足或提出优化建议,感激不尽。 杨辉三角:杨辉三角左右两侧的数字都是1,而里面的数字等于它肩…

python杨辉三角

题目 杨辉三角形,也称帕斯卡三角,其定义为:顶端是 1,视为(row0).第1行(row1)(1&1)两个1,这两个1是由他们上头左右两数之和 (不在三角形内的数视为0).依此类推产生第2行(row2):011;112;101.第3行(row3):011;123; 213;101. 循此法可以产生以…

Python程序:输出杨辉三角的几种办法

文章目录 一、问题描述二、问题分析三、第一种方法1、具体代码2、运行结果3、程序的改进 四、第二种方法1、具体代码2、运行结果 五、总结分析 一、问题描述 给定一个非负整数 n,生成「杨辉三角」的前 n行。 在「杨辉三角」中,每个数是它左上方和右上方…

用python实现杨辉三角的几种不同方式

杨辉三角的概念 比较详细的知识可以看这里,在杨辉三角中,每个数是它左上方和右上方的数的和。 1/ \1 1/ \ / \1 2 1/ \ / \ / \1 3 3 1/ \ / \ / \ / \1 4 6 4 1/ \ / \ / \ / \ / \ 1 5 10 10 5 1解法1:动态规…

【杨辉三角python】

文章目录 杨辉三角实现方法(Python) 一、杨辉三角是什么?二、杨辉三角解法 杨辉三角实现方法(Python) 一、杨辉三角是什么? 杨辉三角,是二项式系数在三角形中的一种几何排列,中国南…

Python实现杨辉三角(2种实现方案)

杨辉三角形,又称贾宪三角形、帕斯卡三角形,是二项式系数在三角形中的一种几何排列。 下图显示了杨辉三角的前 7 行: 递归打印杨辉三角 杨辉三角形中的数,正是(xy)的 N 次方幂展开式各项的系数,下面以递归的方法来打印…