MQ高级(四)MQ集群

news2024/11/17 17:47:20

一、集群分类

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 {

    @Bean
    public 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:8073
    username: itcast
    password: 123321
    virtual-host: /

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/70514.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Flink】复杂事件处理CEP底层实现(有限状态机)和应用

文章目录一 Flink CEP简介1 什么是复杂事件处理CEP2 Flink CEP(1)导入依赖(2)代码编写(3)优化模板3 实现CEP底层 -- 有限状态机4 使用CEP处理超时事件一 Flink CEP简介 1 什么是复杂事件处理CEP 一个或多…

239页11万字新型智慧城市运营中心IOC大数据平台建设方案

目录 1 概述 1.1 建设目标 1.2 建设内容 1.3 建设步骤 2 项目建设方案 2.1 总体设计方案 2.2 支撑平台方案 2.2.1 数据治理平台 2.2.2 可视化平台 2.2.3 城市感知平台 2.3 应用系统方案 2.3.1 综合监测系统 2.3.2 事件管理系统 2.3.3 联动指挥系统 2.3.4 辅助决策…

自定义镜像上传阿里云

目录标题一、Docker制作jdk镜像1.jdkv.1.0的制作1.1创建文件夹上传jdk的安装包,和在同级目录下编写Dockerfile文件1.2.编写 Dockerfile 文件1.3.执行Dockerfile文件,初次依赖镜像的时候会下载相应镜像2.jdk2.0的制作3.jdk3.0的制作二、Docker镜像上传至阿里云前期准…

19.5 迭代器的概念和分类

一:迭代器基本概念:第十三章第九节 迭代器:是一个“可遍历STL容器全部或者部分元素”的对象(行为类似于指针的对象); 迭代器用来表现容器中的某一位置;迭代器紧密依赖于容器,迭代器…

2023年天津仁爱学院专升本动画、化学工程与工艺专业介绍

2023年天津仁爱学院专升本专业课动画专业、化学工程与工艺专业介绍 (一)动画专业 动画专业以行业发展对应用型人才需求为导向,不断提高学生就业质量为目标,针对学生特点,积极拓展动画应用领域,设有影视后期…

JSP SSH超市管理统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP 超市管理统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发 JSP SSH超市管理统myeclipse开发…

【Leetcode每日一题】子序列宽度之和,匹配子序列的单词数,最大平均值和的分组

891. 子序列宽度之和 计算的是【贡献】。 首先观察发现,顺序不影响结果。然后比如1,作为最大元素贡献为0,而作为最小元素贡献为每个子序列的【最大-1】,一共有多少个作为最小元素的子序列,对答案的贡献就是-1*(个数)。…

【✨十五天搞定电工基础】正弦交流电路的分析(下)

目录 五、复杂正弦交流电路的分析(下) 六、功率因数的提高 七、谐振电路 1、串联谐振 2、并联谐振 八、课后习题 1、正弦量三要素,相位 2、RLC串联问题 3、复杂正弦交流电路问题 4、谐振问题 五、复杂正弦交流电路的分析&#x…

Metabase学习教程:权限-4

高级数据沙盒:限制对列的访问 了解如何使用已保存的SQL查询对表进行沙盒处理,并根据用户属性限制用户可以查看的列。 我们的文章行权限涵盖了沙盒(商业版本). 我们将沙盒定义为一种根据用户身份指定用户可以访问哪些数据的方法,…

【TOTP】基于时间的动态密码及其工程实践

探究了常见的动态密码的实现方式及其底层原理,并基于java做出了工程实践。 文章目录A.来源于一个现象的好奇B.2FAC.TOTP1.什么是TOTP2.原理详解(基于java-totp项目分析)3.这样真的安全吗4.常见的支持TOTP的软件1.Google Authenticator2.Micro…

RCNN学习笔记-MobileNet3

更新Block(bneck倒残差结构) 1.加入SE(自注意力模块squeeze-and-excite bottleneck)模块。当stride1(高和宽是不会变化的)且inputc outputc才有shortcut连接。 相反,我们将它们全部替换为扩展层中通道数量的1/4。我…

功率放大器输出阻抗的影响因素有哪些原因

关于功率放大器的疑问有很多,前阵子有人咨询影响功率放大器输出阻抗的有哪些因素,今天就请安泰电子来为大家解释,同时再为大家科普一下功率放大器的知识。 图:信号源和负载的放大器的简化模型 在搞清楚影响功率放大器输出阻抗因素…

速锐得解码本田雅阁混动版整车网关CAN总线通信协议DBC控制策略

本田汽车增城工厂就在附近50多公里的地方,和比亚迪汽车差不多,无论怎么跑都得1个多小时,也因为近水楼台的天然优势,而我们也与本田安全驾驶中心有多次深度的合作。碗里的肉,基本上都是上过了速锐得砧板。 近&#xff0…

m基于FPGA的半带滤波器verilog设计,对比普通结构以及乘法器复用结构

目录 1.算法描述 2.仿真效果预览 3.verilog核心程序 4.完整FPGA 1.算法描述 HBF模块由半带滤波器(HBF)和抽取模块组成。该模块的任务是实现2倍抽取进一步降低信号采样速率。由于HBF的冲激响应h(k)除零点外其余偶数点均为零,所以用HBF实现…

5G+无人驾驶融合创新,赋能港口智能化发展!

导语 | 在新一轮科技革命的时代背景下,5G 技术和无人驾驶的创新融合,使得我国当前港口的智慧化建设走在了世界的前列,智慧港口的发展不断深入。此次,我们邀请到了飞步科技的联合创始人兼 CTO、腾讯云 TVP 杨政老师,他将…

【LeetCode】No.116. Populating Next Right Pointers in Each Node -- Java Version

题目链接:https://leetcode.com/problems/populating-next-right-pointers-in-each-node/description/ 1. 题目介绍() You are given a perfect binary tree where all leaves are on the same level, and every parent has two children. T…

安卓APP源码和设计报告——小说阅读器

班级 姓名 学号 答辩情况 考核项满分成绩得分掌握计算机系统软硬件资源管理的原理,能够设计针对计算机领域复杂工程问题的解决方案,设计满足特定需求的软硬件系统,并具有对解决方案在特定约束条件下进行工程设计和开发的能力。30能够针对计…

Excel 函数大全之 INTERCEPT function 获取线性回归线的截距

描述 使用现有的 x 值和 y 值计算直线与 y 轴相交的点。截点基于通过已知 x 值和已知 y 值绘制的最佳拟合回归线。当您想要在自变量为 0(零)时确定因变量的值时,请使用 INTERCEPT 函数。例如,当您的数据点是在室温或更高温度下获取的时,您可以使用 INTERCEPT 函数预测金属…

BIGEMAP APP导入/导出文件\照片(kml\shp\cad(dxf)\txt\excel)

APP数据导入: 1、kml\bmv文件通过QQ、微信等发送到手机端,在手机端下载文件,然后选择其他应用打开,选择bigemap打开就可以了。 2、其他数据导入(其他数据包括:shp、kml\kmz、CAD的dxf、txt、excel、csv等…

java通过idea进行远程调试

1&#xff0c;基于SpringBoot使用IDEA工具 在pom.xml中配置 里配置jvmArguments参数 -Xdebug -Xrunjdwp:transportdt_socket,address8008,servery,suspendn&#xff1a; <build><plugins><plugin><groupId>org.springframework.boot</groupId>…