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 mq3

cp 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:8073
  username: root
  password: 123456
  virtual-host: /

创建Quorum队列

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

小结

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

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

循环链表的实现

循环链表简介 简单来说,单链表像一个小巷,无论怎么样最终都能从一端走到另一端,循环链表则像一个有传送门的小巷,因为循环链表当你以为你走到结尾的时候,其实你又回到了开头。循环链表和非循环链表其实创建的过程以及…

程序员基础知识—IP地址

文章目录 一、什么是IP地址二、IP地址的分类三、子网掩码 一、什么是IP地址 IP地址就像我们需要打电话时的电话号码一样,它用来标识网络中的一台主机,每台主机至少有一个IP地址,而且这个IP地址是全网唯一的。IP地址由网路号和主机号两部分组…

Elasticsearch/Enterprise Search/Kibana安装记录

目录 Elasticsearch的安装导入 elasticsearch PGP密钥 安装使用APT安装手动下载安装 启动elasticsearch安全功能重新配置节点以加入现有集群启用系统索引的自动创建功能运行Elasticsearch(在systemd下)检查Elasticsearch是否正在运行Elasticsearch配置外网访问 第三方包安装ela…

Python学习(十六)柱状图

zdaPython学习(十四)折线图开发_yikuaidabin的博客-CSDN博客 案例数据资源 ↑ """演示基础柱状图的开发 """ from pyecharts.charts import Bar from pyecharts.options import LabelOpts # 使用Bar构建基础柱状图 bar …

【网络】socket——TCP网络通信 | 日志功能 | 守护进程

🐱作者:一只大喵咪1201 🐱专栏:《网络》 🔥格言:你只管努力,剩下的交给时间! 上篇文章中本喵介绍了UDP网络通信的socket代码,今天介绍TCP网络通信的socket代码。 TCP &a…

深度理解 Spring AOP

一、什么是AOP(面向切面编程)?🍉 AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式 和运行期 动态代理 实现程序功能的统一维护的一种技术。 AOP (面向切面编程)是 OOP&a…

深度理解 Spring IOC

Spring容器高层视图 Spring 启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配好Bean之间的依赖关系,为上层应用提供准备就绪的运行环境。 Bean缓存池&…

OJ练习第143题——二叉树展开为链表

二叉树展开为链表 力扣链接:114. 二叉树展开为链表 题目描述 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终…

postman批量执行请求,通过json传参

1、创建请求 "authUid":"{{authUid}}", 加粗为需要替换的参数 2、组装JSON 可通过Excel自动填充功能构造数据 [ {"authUid":"18700000001"}, {"authUid":"18725929202"} ] 3、批量执行请求配置 4、然后start r…

PuTTY连接服务器报错Connection refused

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

Cloudreve搭建云盘系统,并实现随时访问

文章目录 1、前言2、本地网站搭建1.环境使用2.支持组件选择3.网页安装4.测试和使用5.问题解决 3、本地网页发布1.cpolar云端设置2.cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了,各互联网大厂也纷纷加入战局,一时间公…

RabbitMQ惰性队列使用

说明:惰性队列是为了解决消息堆积问题,当生产者生产消息的速度远高于消费者消费消息的速度时,消息会大量的堆积在队列中,而队列中存放的消息数量是有限的,当超出数量时,会造成消息的丢失。而扩容队列&#…

uniapp app运行到ios详细流程

uniapp运行到IOS真机调试(windows系统) 工具步骤1.首先数据线连接电脑和手机2.右键点击桌面上的HBuilder,打开文件所在位置3.打开HBuilder编辑器里要运行的项目,点击运行>运行到手机或模拟器>运行到IOS APP基座>勾选你的…

LangChain大型语言模型(LLM)应用开发(五):评估

LangChain是一个基于大语言模型(如ChatGPT)用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互&#x…

【每日一题】——C - Standings(AtCoder Beginner Contest 308 )

🌏博客主页:PH_modest的博客主页 🚩当前专栏:每日一题 💌其他专栏: 🔴 每日反刍 🟡 C跬步积累 🟢 C语言跬步积累 🌈座右铭:广积粮,缓称…

ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域的数据分析

一、 空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 二、 ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化:地图符号与注记 …

十一、正则表达式详解:掌握强大的文本处理工具(三)

文章目录 🍀贪婪模式🍀应用的场景🍀总结 🍀非贪婪模式🍀应用的场景🍀总结 🍀贪婪模式与非贪婪模式在爬虫的应用🍀转义字符🍀正则表达式常见函数 🍀贪婪模式 在…

如何查看小程序的APPID和AppSecret

小程序APPID可以在手机上打开小程序后,点击右上角三点: 然后点击中间位置的小程序名称,进入小程序介绍页面: 点击“更多资料”后,进入页面就可以看到上方有APPID: 另一种方法: 在微信公众平台登…

【iOS】CALayer的理解与简单使用

文章目录 前言一、UIView与CALayer的关系二、CALayer的简单使用1.圆角与裁剪2.contents3.边框属性 总结 前言 在实现网易云音乐demo开发的过程中,通过查阅网上资料,发现了我们可以对我们的视图进行裁剪来实现美观的体现,例如这样&#xff1a…

Vue--》打造个性化医疗服务的医院预约系统(三)

今天开始使用 vue3 + ts 搭建一个医院预约系统的前台页面,因为文章会将项目的每一个地方代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的GithHub上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关…