RabbitMQ集群搭建

说明:集群,不管是Redis集群,还是MQ集群,都是为了提高系统的可用性,使系统不至于因为Redis、MQ宕机而崩溃。本文介绍RabbitMQ集群搭建,RabbitMQ集群分为以下三类:

  • 普通集群

  • 镜像集群

  • 仲裁队列

普通集群

普通集群下,节点之间并不会进行数据同步,而是节点之间存在引用,当消费者绑定的队列(one.queue1),在当前这个节点(mq3)中不存在时,如果该节点关联了该队列所在的节点(mq1),会去该节点拉取消息,并返回。

节点之间的通信是依靠Erlang cookie实现的,当集群中的节点拥有相同的Erlang cookie,则这些节点可以相互通信。Erlang cookie是长度最多255的字母数字字符。

结构图:

在这里插入图片描述

搭建

第一步:获取Cookie

输入下面的命令,获取当前单机RabbitMQ的Cookie值,后面把这个值当做集群MQ中每个节点的Cookie;

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

Cookie值为前面的这一段:SKPRVQBTSMEJURVKVQGH

在这里插入图片描述

顺便停掉当前运行中的RabbitMQ

docker rm -f mq

在这里插入图片描述

第二步:准备配置文件

在/tem目录下,创建一个关于RabbitMQ的配置文件(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文件

在/tem目录下,创建一个文件,用于记录Cookie信息,并设置cookie文件的权限为600,即只能被管理员读写;

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

在这里插入图片描述

第四步:创建目录

准备三个目录,搭建三个节点的集群,分别把配置文件,cooke文件拷贝到这三个目录里;

mkdir mq1 mq2 mq3cp rabbitmq.conf mq1
cp rabbitmq.conf mq2
cp rabbitmq.conf mq3
cp .erlang.cookie mq1
cp .erlang.cookie mq2
cp .erlang.cookie mq3

在这里插入图片描述

第五步:启动

先创建一个网络

docker network create mq-net

在这里插入图片描述

分别启动这三个节点,账号、密码相同,名称分别为:mq1、mq2、mq3

程序端口号分别是:8071、8072、8073;

管理平台端口号分别是:8081、8082、8083;

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=root \
-e RABBITMQ_DEFAULT_PASS=123456 \
--name 节点名称 \
--hostname 节点名称 \
-p 程序端口:5672 \
-p 管理平台端口:15672 \
rabbitmq:3.8-management

在这里插入图片描述

第六步:测试

打开这三个管理平台,如果使用的是云服务,需要开放对应的端口;如果使用的是虚拟机,可直接关闭防火墙;

在这里插入图片描述

可以看到其他节点的信息,说明搭建完成;

在这里插入图片描述

第七步:使用

在第一个节点(8081)里面创建一个队列,队列内添加一条信息,如下:
在这里插入图片描述

在第二个节点(8082)中,可以查看到队列信息和消息的内容,已经达到了集群的效果;

在这里插入图片描述

可是此时,把创建这个队列的节点8081关闭,再查看另外节点的情况,另外节点可以看到队列信息,但是不能查看队列的消息内容;

在这里插入图片描述

小结

在普通集群下,如果各个节点都在线,可以访问任意一个节点,消费到任何队列的消息。但是因为节点之间没有备份数据,某节点下线后,其他节点就不能访问到该节点的消息。普通镜像的MQ集群具有局限性。

镜像集群

镜像集群,本质上是主从模式。与Redis主从集群不同的是,主从并不是创建时就决定了的,而是以队列为核心,创建队列的是该队列的主节点,其他节点为该队列的从节点。从节点会同步备份主节点的交换机、队列、队列中的消息。

当消费者绑定的是mq1节点中的one.queue1队列时,因为mq3同步备份了mq1的数据,所以通过访问mq3节点就能得到该队列中的消息,并且当(mq1)宕机时,其余的镜像节点(mq3)会代替成为主节点。

结构图

在这里插入图片描述

搭建

镜像集群搭建有3中配置模式,详细参考:rabbitMq集群之镜像模式,这里以exactly为例:

第一步:创建

在之前普通集群的情况下,敲下面的命令,表示镜像数量设置2,匹配队列名以“two”开头的队列;

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

在这里插入图片描述

第二步:测试

打开mq1的管理平台,创建一个队列“two.queue”,看到可以指定节点,说明镜像集群已搭建成功;

在这里插入图片描述

点击队列特征(features)可以看到策略信息,one.queue8081没有,是因为不是以“two”开头的队列;

在这里插入图片描述

第三步:使用

在mq1节点下two.queue8081队列内添加一条消息;

在这里插入图片描述

在mq3节点下,可以看到消息已同步过来;
在这里插入图片描述

此时,把mq1宕机,看其他节点还能不能查看到消息;

在这里插入图片描述
可以看到,mq3仍能查看到mq1当时创建的队列内的消息,并且队列的Node信息已经更改为rabbit@mq2

在这里插入图片描述

小结

镜像集群,本质上是主从模式,可以同步节点之间的交换机、队列、队列内的消息,并且当主节点宕机时,其余镜像节点会代替称为主节点。

仲裁队列

仲裁队列时RabbitMQ3.8之后增加的功能,效果与镜像队列一样,但省去了搭建镜像集群的操作,十分方便。

搭建

第一步:创建仲裁队列

在这里插入图片描述
可以看到Node信息里面有“+2”,表示该队列另有两个镜像节点。默认情况是5,节点数小于5以实际为准;
在这里插入图片描述

第二步:添加消息

在quorum.queue队列内添加消息;

在这里插入图片描述

第三步:让MQ1宕机

在mq2中可以看到quorum.queue队列的消息内容

在这里插入图片描述

手动让mq1宕机,在看看

在这里插入图片描述

可以看到,在mq2中还是能看到quorum.queue队列内的消息,并且Node节点已更改为rabbit@mq3,并且数量-1,仲裁队列达到了与镜像集群相同的效果。

在这里插入图片描述

代码中使用

如果需要在代码中创建仲裁队列,也十分方便,只需在配置文件中指定节点IP(注意此时端口号为程序的端口号,同样也需要开放这些端口号),连接集群:

spring:rabbitmq:addresses: 118.178.228.175:8071, 118.178.228.175:8072, 118.178.228.175:8073username: rootpassword: 123456virtual-host: /

创建Quorum队列

    /*** 创建仲裁队列* @return*/@Beanpublic Queue quorumQueue(){return QueueBuilder.durable("quorum.queue").quorum().build();}

小结

仲裁队列效果与镜像集群相同,省去了搭建镜像集群的操作,使用起来非常方便。另外,仲裁队列可集群扩容,增加集群的可用性(参考:http://t.csdn.cn/BwMeN)

总结

MQ集群分普通集群、镜像集群和仲裁队列三种,就可用性来说,普通集群局限性很大,只能做到“转发”,节点宕机了就没办法;镜像集群和仲裁队列效果相同,但仲裁队列不用额外敲命令,推荐使用。

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

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

相关文章

C语言中指针(简略复习)

一、指针 1. 指针运算 设p为指针,T为类型,n为整型数字,则pn表示,指针从当前位置向后移动n个数据单位,而不是n个字节。 数据类型不同,移动的数据单位字节数也不同,实际上移动的字节数为n*sizeo…

3DVR全景旅游,最新数字化智慧文旅

导语: 随着科技的飞速发展,3DVR全景旅游正以其独特的特点和无限的优势,成为当今智慧文旅的领航者。穿戴上VR设备,只需一个轻轻的点击,你将被带入一个全新的数字世界,领略美景、探索奇迹。让我们一起深入了…

探索容器镜像安全管理之道

邓宇星,Rancher 中国软件架构师,7 年云原生领域经验,参与 Rancher 1.x 到 Rancher 2.x 版本迭代变化,目前负责 Rancher for openEuler(RFO)项目开发。 最近 Rancher v2.7.4 发布了,作为一个安全更新版本,也…

【Spring MVC】Spring MVC的功能使用和相关注解介绍

Spring MVC主要有三个功能: 连接获取参数输出数据 对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了Spring MVC。 1.连接 连接的功能:将⽤户(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能…

基于YOLOv5的WiderFace人脸检测检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于YOLOv5的WiderFace人脸检测系统可用于日常生活中检测与定位人脸目标,利用深度学习算法可实现图片、视频、摄像头等方式的人脸目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型训练数据集&…

css终极方案PostCSS

一见如故 原理 所有的css框架都在一样的事,那就是由一个css生成一个新的css,那么postcss就来做了一个抽离: 1、将原有的css解析成抽象语法树 2、中间经过若干个插件 3、重新文本化,形成新的css postcss.config.js module.expor…

【C++】容器对象作为函数参数传递时,如何保证外部容器对象不被修改(以vector为例)

几种传参方式简单对比 传值 1.1 参数形式&#xff1a;void fun(vector<int> v); 1.2 函数调用&#xff1a;fun(v); 1.3 函数内使用&#xff1a;cout << v[1]; 1.4 是否可以改变函数外对象的值&#xff1a;否 1.5 是否会调用拷贝构造函数&#xff1a;是传指针 2.1 …

快速了解新一轮Moonbeam Grants申请提案

随着Moonbeam Grant第二期计划的发布&#xff0c;超过12个项目同时提交了生态Grant申请的提案。任何大于25万枚GLMR Grant的申请都将会要求项目在Moonbeam社区治理论坛上发布Grant提案&#xff0c;内容包含项目概览、申请金额、Grant使用方案以及背后的原因等等。 Grant的发放…

【软件架构】企业架构4A定义

文章目录 前言战略、BA、DA、AA、TA五者的关系1、业务架构&#xff08;BA&#xff09;2、数据架构&#xff08;DA&#xff09;3、应用架构&#xff08;AA&#xff09;4、技术架构&#xff08;TA&#xff09;总结 前言 业务架构是跨系统的业务架构蓝图&#xff0c;应用架构、数…

Redis

介绍 redis是内存数据结构存储&#xff0c;可用作数据库、缓存、消息代理和流引擎。 提供的数据结构有&#xff1a;String、hash、lists、sets、sorted sets、bitmaps、hyperloglogs、streams 字符串、哈希、列表、集、带有范围查询的排序集、位图、超日志日志、地理空间索引…

【每日运维】RockyLinux8非容器化安装Mysql、Redis、RabitMQ单机环境

系统版本&#xff1a;RockyLinux 8.6 安装方式&#xff1a;非容器化单机部署 安装版本&#xff1a;mysql 8.0.32 redis 6.2.11 rabbitmq 3.11.11 elasticsearch 6.7.1 前置条件&#xff1a;时间同步、关闭selinux、主机名、主机解析host 环境说明&#xff1a;PC电脑VMware Work…

互联网医院系统|互联网医院软件开发|互联网医院搭建方案

随着互联网技术的发展&#xff0c;互联网医院系统逐渐成为医疗服务的新模式&#xff0c;为患者和医生提供了更加方便和高效的医疗体验。下面将介绍互联网医院系统的功能优势。   在线挂号和预约&#xff1a;互联网医院系统可以提供在线挂号和预约功能&#xff0c;患者可以通过…

C++_01_初步认识C++语言

本人博客园亦可见 一、认识 “C语言” 一、首先聊聊什么是语言&#xff1f; 语言是一套具有“语法”、“词法”规律的系统&#xff0c;是思维的工具。   计算程序设计语言是计算机可以识别的语言&#xff0c;用于描述解决问题的方法&#xff0c;供计算机阅读和执行。 语言由…

vue中实现列表自由拖拽排序

元素的 dragable 属性设置 为 true &#xff08;文本 图片 链接 的draggable 属性默认为 true&#xff09;则元素可拖放 <template><transition-group class"list"><uldragstart"dragstart(index)"dragenter"dragenter($event, index)…

【设计模式——学习笔记】23种设计模式——原型模式Prototype(原理讲解+应用场景介绍+案例介绍+Java代码实现)

原型模式 介绍 原型模式指用通过拷贝原型实例创建新的实例&#xff0c;新实例和原型实例的属性完全一致原型模式是一种创建型设计模式工作原理是通过调用原型实例的 clone()方法来完成克隆&#xff0c;原型实例需要实现Cloneable接口&#xff0c;并重写clone()方法需要为每个…

naive-ui的dialog.warning 关闭和阻止关闭

序&#xff1a; 1、如果你卡到 了&#xff0c;博主没写博客&#xff0c;可以在博主的公众号&#xff1a;“程序员野区” 留言。博主看到有时间再帮你去试 2、博主主要讲的怎么 主动关闭dialog和阻止dialog 自动关闭。 注意&#xff01;&#xff01;&#xff01;&#xff01;来&…

Spring Data Redis操作Redis

在Spring Boot项目中&#xff0c;可以使用Spring Data Redis来简化Redis操作&#xff0c;maven的依赖坐标&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></…

5分钟搞懂池化的本质

大家好啊&#xff0c;我是董董灿&#xff01; 在很多与计算机视觉相关的神经网络中&#xff0c;我们往往都会看到池化这一算法&#xff0c;它一般跟在卷积层后面。 神经网络中用到最多的池化方式无外乎是最大池化和平均池化。两者运算接近&#xff0c;区别在于是在kernel范围…

在使用《快递批量查询高手》时从TXT文本导入的快递单号出现乱码如何解决。

在日常 工作中&#xff0c;有没有单号用TXT 文档保存吗&#xff1f;那么没有出现这种情况呢&#xff0c;打开TXT文档进去看都是正常没有问题&#xff0c;一但导入软件中就出现乱码的&#xff1f;遇到这个种情况需要什么解决呢&#xff1f;小编今天就教 您一招解决好方法&#x…

电脑微信空间占用简便清理

1、打开电脑版微信、点击左下角的三根横线 2、点击左侧的“设置” 3、弹出层左侧点击“通用设置”->“存储空间管理” 4、点击清理缓存&#xff0c;或者管理 5、点击“管理”后&#xff0c;根据选择的筛选条件&#xff0c;勾线需要清理的&#xff0c;最后点击清理