消息中间件:RabbitMQ镜像集群部署配置全流程

目录

1、特点

2、RabbitMQ的消息传递模式

2.1、简单模式(Simple Mode)

2.2、工作队列模式(Work Queue Mode)

2.3、发布/订阅模式(Publish/Subscribe Mode)

2.4、路由模式(Routing Mode)

3、RabbitMQ集群

3.1、RabbitMQ部署和集群配置的三种模式

3.2、RabbitMQ集群的基本概念

3.2.1、节点类型

3.2.2、核心组件

4、rabbitMQ普通集群部署

4.1、环境准备

4.2、安装relang环境(三台服务器安装配置一致)

4.3、安装rabbitMQ(三台服务器安装配置一致)

下载安装

启动

4.4、开启web访问页面(启用插件)

4.5、访问(新增用户,设置权限)

4.6、创建日志、数据保存目录

4.7、创建配置文件并配置

4.8、构建erlang集群

4.9、将节点加入集群,并指定角色

4.10、查看集群状态

4.11、验证

5、rabbitMQ镜像集群配置

RabbitMQ 是一个基于 AMQP(高级消息队列协议)的开源的消息代理。

1、特点

  1.   支持多种协议(AMQP, MQTT, STOMP等)。
  2.   强大的消息路由功能。
  3.   支持事务和确认机制,保证消息传递的可靠性。
  4.   提供丰富的管理界面和监控功能。

2、RabbitMQ的消息传递模式

2.1、简单模式(Simple Mode)

P2P模式包含三个角色:消息队列(Queue)、发送者(Sender)、接收者(Receiver)。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到它们被消费或超时。适用于简单的点对点通信场景

  • 每个消息只有一个消费者(Consumer),即一旦被消费,消息就不再在消息队列中
  • 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行它不会影响到消息被发送到队列
  • 接收者在成功接收消息之后需向队列应答成功
  • 如果希望发送的每个消息都会被成功处理的话,那么需要P2P模式

2.2、工作队列模式(Work Queue Mode)

适用于需要并行处理任务的场景,如图像处理、数据计算等。

特点:

允许多个消费者从同一个队列中接收消息。这种模式通过在消费者之间分配任务来提高消息处理的效率。

2.3、发布/订阅模式(Publish/Subscribe Mode)

P2P模式包含三个角色:消息队列(Queue)、发送者(Sender)、接收者(Receiver)。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到它们被消费或超时。适用于需要消息广播的场景,例如新闻更新、日志记录等。

特点:

  1. 每个消息可以有多个消费者发布者和订阅者之间有时间上的依赖性。
  2. 针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息
  3. 为了消费消息,订阅者必须保持运行的状态
  4. 如果希望发送的消息可以不被做任何处理、或者只被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型

2.4、路由模式(Routing Mode)

适用于需要根据特定条件或规则将消息路由到不同处理者的场景。

特点:

生产者将消息发送到交换机,交换机根据消息的路由键(Routing Key)将消息发送到特定的队列。消费者监听这些队列以接收消息。

3、RabbitMQ集群

3.1、RabbitMQ部署和集群配置的三种模式

1、单机模式。

2、普通模式(默认的集群模式)。

3、镜像模式(把需要的队列做成镜像队列,存在于多个节点,属于RabbiMQ的HA方案,在对业务可靠性要求较高的场合中比较适合)。要实现镜像模式,需要先搭建出普通集群模式,在这个模式的基础上再配置镜像模式以实现高可用。

3.2、RabbitMQ集群的基本概念

在 RabbitMQ 集群中,所有节点都会同步元数据,包括队列、交换器、绑定和 vhost 的定义。这意味着无论在哪个节点上创建或修改这些资源,其他节点都会自动更新。

3.2.1、节点类型

磁盘节点:默认的节点类型,将元数据(包括队列、交换器、绑定和 vhost 的定义)存储在磁盘上。集群中至少需要一个磁盘节点来持久化元数据。

内存节点:将元数据存储在内存中,不提供持久化。通常用于提高性能,但重启后元数据会丢失。

内存节点虽然不写入磁盘,但是它执行比磁盘节点要好。集群中,只需要一个磁盘节点来保存数据就足够了

如果集群中只有内存节点,那么不能停止它们,否则所有的状态,消息等都会丢失。

3.2.2、核心组件

Broker:消息队列服务器实体

ConnectionFactory(连接管理器):应用程序与Rabbit之间建立连接的管理器,程序代码中使用;

Exchange(交换器):用于接受、分配消息;

Routing Key:路由关键字,exchange根据这个关键字进行消息投递;

Queue(队列):用于存储生产者的消息;

Bindding:绑定,把exchange和queue按照路由规则绑定起来。

vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离.

producer:消息生产者,就是投递消息的程序。

consumer:消息消费者,就是接受消息的程序。

channel:(信道)消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。消息推送使用的通道;

4、rabbitMQ普通集群部署

4.1、环境准备

主机名

ip地址

版本

rebbitMQ01

10.211.55.57

aarch64的centos9

rebbitMQ02

10.211.55.58

aarch64的centos9

rebbitMQ03

10.211.55.59

aarch64的centos9

安装依赖(三台服务器安装配置一致)

yum install -y *epel* gcc-c++ unixODBC openssl-devel ncurses-devel

配置host文件

[root@rabbitMQ2 ~]# vim /etc/hosts 

10.211.55.57 rabbitMQ1

10.211.55.58 rabbitMQ2

10.211.55.59 rabbitMQ3

4.2、安装relang环境三台服务器安装配置一致

下载地址:https://github.com/rabbitmq/erlang-rpm/releases/

根据自身环境下载安装

wget https://github.com/rabbitmq/erlang-rpm/releases/download/v27.2.2/erlang-27.2.2-1.amzn2023.aarch61.rpm

rpm -ivh erlang-27.2.2-1.amzn2023.aarch61.rpm 

[root@rabbitMQ1 ~]# rpm -ivh erlang-27.2.2-1.amzn2023.aarch61.rpm Verifying...                          ################################# [100%]Preparing...                          ################################# [100%]Updating / installing...1:erlang-27.2.2-1.amzn2023         ################################# [100%]

验证是否安装成功

[root@rabbitMQ1 ~]# erlErlang/OTP 27 [erts-15.2.2] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [jit]Eshell V15.2.2 (press Ctrl+G to abort, type help(). for help)

4.3、安装rabbitMQ(三台服务器安装配置一致)

官方安装教程:Installing on RPM-based Linux | RabbitMQ

下载安装

[root@rabbitMQ1 ~]# wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v1.0.5/rabbitmq-server-1.0.5-1.el8.noarch.rpm

[root@rabbitMQ1 ~]# yum localinstall -y rabbitmq-server-1.0.5-1.el8.noarch.rpm

启动

systemctl start rabbitmq-server

systemctl enable rabbitmq-server

4.4、开启web访问页面(启用插件)

rabbitmq-plugins enable rabbitmq_management

4.5、访问(新增用户,设置权限)

http://10.211.55.57:15672/

http://ip:15672

用户名:guest

密码:guest

上述用户仅支持本机登录

远程登录需添加新用户

添加新用户

rabbitmqctl add_user zjp zjp

设置管理员

rabbitmqctl set_user_tags zjp administrator

设置新用户的权限

rabbitmqctl set_permissions -p / zjp ".*" ".*" ".*"

查看用户

rabbitmqctl list_users

备注:

4369 -- erlang端口

5672 --程序连接端口

15672 -– web界面访问端口

25672 -- server间内部通信端口

4.6、创建日志、数据保存目录

三个服务器均操作

[root@rabbitMQ1 ~]# mkdir -p /data/rabbitmq/data[root@rabbitMQ1 ~]# mkdir -p /data/rabbitmq/logs[root@rabbitMQ1 ~]# chmod 777 -R /data/rabbitmq[root@rabbitMQ1 ~]# chown rabbitmq.rabbitmq /data/ -R

4.7、创建配置文件并配置

RABBITMQ_MNESIA_BASE=/data/rabbitmq/data

RABBITMQ_LOG_BASE=/data/rabbitmq/logs

填入上述配置

[root@rabbitMQ1 ~]# vim /etc/rabbitmq/rabbitmq-env.conf[root@rabbitMQ1 ~]# cat /etc/rabbitmq/rabbitmq-env.conf RABBITMQ_MNESIA_BASE=/data/rabbitmq/dataRABBITMQ_LOG_BASE=/data/rabbitmq/logs

配置完后三台机子重启服务(可等下面erlang集群构建后再一起重启)

systemctl restart rabbitmq-server

4.8、构建erlang集群

Rabbitmq的集群是依附于erlang的集群来工作的,所以必须先构建起erlang的集群。

erlang集群构建方法很简单,将三台机子中的其中一台的这个文件/var/lib/rabbitmq/.erlang.cookie,的内容拷贝到其他两台即可,拷贝过去后需要设置400权限。

查看rabbitmq-1的.erlang.cookie文件内容,(其他两台机器这个文件的内容替换成这个文件的内容就构成了一个erlang集群)

[root@rabbitMQ1 ~]# cat /var/lib/rabbitmq/.erlang.cookieJXUSRTWCVLRVAMPQWISW

设置/var/lib/rabbitmq/.erlang.cookie的权限为400

[root@rabbitMQ1 ~]# chmod 400 /var/lib/rabbitmq/.erlang.cookie

将rabbitmq-1文件的内容拷贝到其他两台机器rabbitmq-2、rabbitmq-3里

[root@rabbitMQ1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@10.211.55.58:/var/lib/rabbitmq/[root@rabbitMQ1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@10.211.55.59:/var/lib/rabbitmq/

重启rebbitmq-2 rebbitmq-3服务(这里因为rabbitmq-1是传过去的本身没有改变所以不需要重启)

systemctl restart rabbitmq-server

4.9、将节点加入集群,指定角色

加入前均先停止并初始化节点

[root@rabbitMQ2 ~]# rabbitmqctl stop_appStopping rabbit application on node rabbit@rabbitMQ2 ...

[root@rabbitMQ2 ~]# rabbitmqctl reset(可不初始化,初始化会使前面创建的用户也删掉)

Resetting node rabbit@rabbitMQ2 ...

rabbitMQ2、rabbitMQ3加入内存节点

rabbit@rabbitMQ1怎么查?[root@rabbitMQ1 ~]# rabbitmqctl cluster_status[root@rabbitMQ2 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitMQ1Clustering node rabbit@rabbitMQ2 with rabbit@rabbitMQ1

加入后启动节点

rabbitmqctl start_app

默认rabbitMQ1启动后是磁盘节点,在这个cluster命令下,mq-2和mq-3是内存节点,

MQ1是磁盘节点。

如果要使mq-2、mq-3都是磁盘节点,去掉--ram参数即可。

(3)如果想要更改节点类型,可以使用命令rabbitmqctl change_cluster_node_type

disc(ram),前提是必须停掉rabbitmq应用

4.10、查看集群状态

在 RabbitMQ 集群任意节点上执行 rabbitmqctl cluster_status来查看是否集群配置成功。

MQ1磁盘节点上面查看(集群里的任意一台机器查看都行,这里选择的是MQ1)

4.11、验证

三台机器访问15672端口的web页面

根据界面提示创建一条队列

其他两台机器的web界面也能看到刚刚创建的队列

5、rabbitMQ镜像集群配置

启用插件rabbitmq_federation

[root@rabbitMQ2 ~]# rabbitmq-plugins enable rabbitmq_federationEnabling plugins on node rabbit@rabbitMQ2:rabbitmq_federationThe following plugins have been configured:rabbitmq_federationrabbitmq_managementrabbitmq_management_agentrabbitmq_web_dispatchApplying plugin configuration to rabbit@rabbitMQ2...The following plugins have been enabled:rabbitmq_federation

在集群里的任意一台机器上输入

rabbitmqctl set_policy  federate-me "^" '{"ha-mode":"all"}'

[root@rabbitMQ2 ~]# rabbitmqctl set_policy federate-me "^" '{"federation-upstream-set":"all"}'Setting policy "federate-me" for pattern "^" to "{"federation-upstream-set":"all"}" with priority "0" for vhost "/" ...

federate-me是策略名,^表示匹配所有队列,{"ha-mode":"all"},策略模式all即复制到所有节点,包含新增节点(已有队列不会生效)

查看效果

至此,rabbitMQ的基本部署,集群配置,镜像队列设置就完事了,感谢观看学习,文章有问题可留言作者会查看并分析处理🙂

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

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

相关文章

【STM32】通过HAL库Flash建立FatFS文件系统并配置为USB虚拟U盘MSC

【STM32】通过HAL库Flash建立FatFS文件系统并配置为USB虚拟U盘MSC 在先前 分别介绍了FatFS文件系统和USB虚拟U盘MSC配置 前者通过MCU读写Flash建立文件系统 后者通过MSC连接电脑使其能够被操作 这两者可以合起来 就能够实现同时在MCU、USB中操作Flash的文件系统 【STM32】通过…

打穿内网三重奏-红日7

靶机下载地址: 漏洞详情 (qiyuanxuetang.net) 攻击链路: DMZ区IP段为192.168.11.1/24 第二层网络环境IP段为192.168.52.1/24 第三层网络环境IP段为192.168.93.1/24 这里DMZ和攻击者我用的是192.168.11.1 这个网段,其他不变 这里我加了两张…

学习笔记-人脸识别相关编程基础

通过编程实现人脸识别功能,需要掌握一定的技术基础,包括编程语言、图像处理、机器学习以及相关的库和框架: 1. 编程语言 Python:Python 是实现人脸识别最常用的语言之一,因为它有大量的库和框架支持,如 Op…

LeetCode题解:2690. 无穷方法对象,Proxy

Problem: 2690. 无穷方法对象 思路 这个问题的核心在于创建一个对象,该对象能够响应对其任何方法的调用,并返回调用的方法名称。为了实现这一点,我们可以利用 JavaScript 中的 Proxy 对象。Proxy 对象允许我们自定义对象的基本操作&#xff…

Vue.js 在低代码开发平台中的应用与优化

Vue.js 在低代码开发平台中的应用与优化 在数字化转型的进程中,低代码开发平台成为了企业快速构建应用的得力助手。而 Vue.js 作为一款广受欢迎的前端框架,在低代码开发平台中发挥着举足轻重的作用。它不仅提升了开发效率,还优化了应用的用户…

【CodePen实战:撤销重做功能全记录】

🛠️ CodePen实战:撤销重做功能全记录 🌟 目录 🚨 真实报错全记录 - 那些折磨我的Bug🏗️ 极简架构设计 - 适合实验项目的结构🧩 模块实现细节 - 关键代码解析🚑 急救方案 - 快速Debug技巧 &a…

QML 快捷键与Shortcut的使用

一、效果展示 二、源码分享 import QtQuick import QtQuick.Controls import Qt.labs.qmlmodels import QtQuick.Controls.Basic import QtQuick.Layouts import QtQuick.Effects import Qt.labs.platformApplicationWindow {id:rootwidth: 1000height: 730visible: truetitle…

RocketMQ和Kafka如何实现顺序写入和顺序消费?

0 前言 先说明kafka,顺序写入和消费是Kafka的重要特性,但需要正确的配置和使用方式才能保证。本文需要解释清楚Kafka如何通过分区来实现顺序性,以及生产者和消费者应该如何配合。   首先,顺序写入。Kafka的消息是按分区追加写入…

【南方Cass】快捷键0002:合并多段线

快捷键:JOIN 按下快捷键JOIN,然后选择需要合并的对象(多段线),按下回车即可完成合并。

HTML之JavaScript变量和数据类型

HTML之JavaScript变量和数据类型 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

Qt的isVisible ()函数介绍和判断窗口是否在当前界面显示

1、现象&#xff1a;当Qt的窗口最小化时&#xff0c;isVisible值一定是true&#xff0c;这是正常的。 解释&#xff1a;在Qt中&#xff0c;当你点击窗口的最小化按钮时&#xff0c;Qt内部不会自动调用 hide() 方或 setVisible(false) 来隐藏窗口。相反&#xff0c;它会改变窗口…

【愚公系列】《Python网络爬虫从入门到精通》007-请求模块requests高级应用(Reguests-HTML)

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…

【虚幻引擎UE】UE4.23到UE5.5的核心功能变化

简单总结从UE4.23到UE5.5&#xff0c;虚幻引擎的重大变化&#xff1a; 1. WebGL/HTML5 平台支持和像素流 UE4.23-UE4.25&#xff1a;移除官方HTML5支持&#xff0c;改为社区插件维护。 但通过第三方插件&#xff08;如WebAssemblyWebGPU&#xff09;可在浏览器运行部分项目。U…

win10 离线安装openssh.server

在 Windows 10 上离线安装 OpenSSH Server 可以通过手动安装的方式来达成&#xff0c;因为 OpenSSH 默认并不包含在 Windows 10 的可选功能中。以下是一些步骤来帮助你手动安装 OpenSSH Server&#xff1a; 方法一&#xff1a;使用 PowerShell 安装 启用管理员权限的 PowerShe…

在Vue中,JavaScript数组常用方法,添加,插入,查找,删除等整理

在Vue中&#xff0c;JavaScript数组常用&#xff0c;添加&#xff0c;插入&#xff0c;查找&#xff0c;删除等整理 1.splice()方法可以直接修改原数组&#xff0c;通过指定要删除元素的索引来删除它。 例&#xff1a; let index // 要删除的元素的索引; this.array.splice(i…

【AI论文】CodeI/O: 通过代码输入输出预测来提炼推理模式

摘要&#xff1a;推理是大型语言模型的一项基本能力。尽管先前的研究主要集中在提升如数学或代码生成等狭窄领域的技能&#xff0c;但由于训练数据稀疏且分散&#xff0c;在许多其他推理任务上提高性能仍然具有挑战性。为了解决这个问题&#xff0c;我们提出了CodeI/O&#xff…

AI编程01-生成前/后端接口对表-豆包(或Deepseek+WPS的AI

前言: 做过全栈的工程师知道,如果一个APP的项目分别是前端/后端两个团队开发的话,那么原型设计之后,通过接口文档进行开发对接是非常必要的。 传统的方法是,大家一起定义一个接口文档,然后,前端和后端的工程师进行为何,现在AI的时代,是不是通过AI能协助呢,显然可以…

热更图片方案

项目平常需要对线上一些图片资源修正&#xff0c;所以需要热更图片功能。 远端入口新增字段配json文件 {"1.1.22030303":{"sprite":{"assets/ui/common/images/acient_gold.png" : "https://aaaa.png","assets/ui/common/image…

24电子信息类研究生复试面试问题汇总 电子信息类专业知识问题最全!电子信息复试全流程攻略 电子信息考研复试真题汇总

你是不是在为电子信息考研复试焦虑&#xff1f;害怕被老师问到刁钻问题、担心专业面答不上来&#xff1f;别慌&#xff01;作为复试面试92分逆袭上岸的学姐&#xff0c;今天手把手教你拆解电子信息类复试通关密码&#xff01;看完这篇&#xff0c;让你面试现场直接开大&#xf…

PortSwigger——WebSockets vulnerabilities

文章目录 一、WebSockets二、Lab: Manipulating WebSocket messages to exploit vulnerabilities三、Lab: Manipulating the WebSocket handshake to exploit vulnerabilities四、Using cross-site WebSockets to exploit vulnerabilities4.1 跨站WebSocket劫持&#xff08;cro…