当前位置: 首页 > article >正文

实现RabbitMQ多节点集群搭建

目录

        引言

        一、环境准备

        二、利用虚拟机搭建

​        三、镜像集群配置

        四、HAProxy实现负载均衡(主用虚拟机操作)

        五、测试RabbitMQ集群搭建情况


        引言

在现代分布式系统中,消息队列(Message Queue)扮演着至关重要的角色,而  RabbitMQ 作为最流行的开源消息代理之一,广泛应用于异步通信、任务队列、事件驱动架构等场景。然而,单节点的 RabbitMQ 存在单点故障(SPOF, Single Point of Failure)风险,一旦宕机,整个消息系统就会瘫痪。因此, 搭建 RabbitMQ 集群 成为保障系统高可用性(High Availability, HA)和负载均衡(Load Balancing)的关键措施。
        为了保证MQ 中间件的可靠性、并发性、吞吐量,在生产环境上一般都会考虑使用 RabbitMQ 的集群方案。当然本搭建过程只是用于测试阶段,如用于上线产品,需要更严格的搭建流程。

        一、环境准备

本搭建过程搭建需要四台虚拟机,同时他们都已经安装了相同版本的RabbitMQ,我建议是由一台主用虚拟机,克隆复制出另外三台。完成后如下:
使用远程连接工具:finalshell

        二、利用虚拟机搭建

        这里利用我本地的虚拟机模拟三台真实的机器

服务器信息表:

IP地址主机名操作系统
192.168.93.135rabbitmq01CentOS7(64位)
192.168.93.136rabbitmq02CentOS7(64位)
192.168.93.137rabbitmq03CentOS7(64位)

        进行下一步前可以在本地windows的cmd中测试ping一下上面的三个虚拟机的IP地址。如果都能ping通,那可以进行下一步。

        (1)下面修改三台机器的hosts配置文件,为了方便机器间的相互访问,三台centos都执行 vim /etc/hosts , 添加下边的配置,依次执行:

#将三台机器上hosts都修改内容如下
vim /etc/hosts192.168.93.135 rabbitmq01
192.168.93.136 rabbitmq02
192.168.93.137 rabbitmq03#通过ping命令看主机名是否生效
ping rabbitmq02#修改三台主机的主机名 vim /etc/hostname
#修改主机名会导致这台主机上RabbitMQ的数据丢失,可以只改后两台主机名,或者修改前备份
#rabbitmq01 修改为 rabbitmq01.localdomain
#rabbitmq02 修改为 rabbitmq02.localdomain
vim /etc/hostname#然后重启每台机器
reboot

        对应修改如下:

        (2)如果上述都已准确完成,进行下一步:

        保持三台机器的.erlang.cookie 内容一致
        这个cookie 存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件是 400 的权限
        必须保证各节点cookie 一致 , 才能使节点之间相互通信
        例如: 全部使用 rabbitmq01 /.erlang.cookie
#查看rabbitmq01的.erlang.cookie
cat erlang.cookie#修改rabbitmq02和rabbitmq03的.erlang.cookie
vim /var/lib/rabbitmq/.erlang.cookie#该文件是只读的,加上写权限
chmod u+w /var/lib/rabbitmq/.erlang.cookie
vim /var/lib/rabbitmq/.erlang.cookie

        将另外两台都改成与这一样的即可。

        最后启动三台机器上的rabbitMQ服务

#每台机器的RabbitMQ服务的访问地址和控制台的访问地址分别是
#192.168.93.135:5672     192.168.93.135:15672
#192.168.93.136:5672     192.168.93.136:15672
#192.168.93.137:5672     192.168.93.137:15672#启动RabbitMQ服务
service rabbitmq-server start

        (3)rabbitmq02,rabbitmq03作为内存节点加入rabbitmq01节点集群中

        开放端口:

#这里需要开放25672和4369
firewall-cmd --zone=public --add-port=25672/tcp --permanent
systemctl restart firewalld.service
firewall-cmd --reloadfirewall-cmd --zone=public --add-port=4369/tcp --permanent
systemctl restart firewalld.service
firewall-cmd --reload

        在进行操作:

#在rabbitmq02机器下执行
#停掉rabbit应用
rabbitmqctl stop_app #加入rabbitmq01
rabbitmqctl join_cluster --ram rabbit@rabbitmq01#启动rabbit应用
rabbitmqctl start_app#查看所有节点状态
rabbitmqctl cluster_status

        最后查看所有节点状态时:

到此:

        三、镜像集群配置

        上面已经完成RabbitMQ 默认集群模式,但并不保证队列的高可用性,尽管队列 , 交换机 , 绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制.
        为了保证队列中的内容也能复制, 要使用镜像队列 , 镜像队列再添加一些策略。

        在网页上打开三个虚拟机的任意一个RabbitMQ的控制台,按照以下添加策略:

        当然如果不想用上面的方式,可以执行下面一行命令来完成操作(任意虚拟机即可):

策略参数解读:# ha-all:为策略名称;
# ^my:为匹配符,只有一个^代表匹配所有,^abc为匹配名称以abc开头的queue或exchange,^.则
匹配所有
# ha-mode:为同步模式,一共3种模式:
# all-所有(所有的节点都同步消息),
# exctly-指定节点的数目(需配置ha-params参数,此参数为int类型比如2,在集群中随机
抽取2个节点同步消息)
# nodes-指定具体节点(需配置ha-params参数,此参数为数组类型比如
["rabbit@rabbitmq01","rabbit@rabbitmq02"],明确#指定在这两个节点上同步消息)。
# ha-sync-mode
#ha-sync-mode=manual(默认),镜像队列中的消息不会主动同步到新节点,除非显式调用同步命令,
调用同步命令后,队列开始阻塞,无法对其进行操作,直到同步完毕
#ha-sync-mode=automatic 新加入节点时会默认同步已知的镜像队列#执行该命令等效于上面的页面添加策略操作
rabbitmqctl set_policy ha-all "^." '{"ha-mode":"all","ha-sync-mode":"automatic"}'

测试:

#关闭rabbitmq01
rabbitmqctl stop_app

        四、HAProxy实现负载均衡(主用虚拟机操作)

        HAProxy提供高可用性、负载均衡以及基于 TCP HTTP 应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案, 包括 Twitter Reddit StackOverflow GitHub 在内的多家知名互联网公司在使用。HAProxy 实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。 
安装HAProxy:
yum install -y haproxyhaproxy -v

看到下面则安装成功:

HAProxy /etc/haproxy/haproxy.cfg 中添加如下配置:
### haproxy 监控页面地址是:http://192.168.93.134:9188/haproxy_statuslisten admin_statsbind *:9188mode httplog 127.0.0.1 local3 errstats refresh 60sstats uri /haproxy_statusstats realm welcome login\ Haproxystats auth admin:123456     ##记得改成自己的账号和密码stats hide-versionstats admin if TRUE### rabbitmq 集群配置,转发到listen rabbitmq_clusterbind *:5672mode tcpbalance roundrobinserver rabbitnode1 192.168.93.135:5672 check inter 2000 rise 2 fall 3 weight 1server rabbitnode2 192.168.93.136:5672 check inter 2000 rise 2 fall 3 weight 1server rabbitnode3 192.168.93.137:5672 check inter 2000 rise 2 fall 3 weight 1

添加后:

完成上述的修改和配置后,启动

haproxy -f /etc/haproxy/haproxy.cfg

在网页上访问:http://192.168.93.134:9188/haproxy_status

看到下图,说明已经配置成功:

        可以看到三个虚拟机已经和HAProxy实现了负载均衡,当有信息发送到三台主机中的任意一个rabbitMQ时,尽管两外一台或两台出现宕机的情况,仍然不妨碍我们使用。

        五、测试RabbitMQ集群搭建情况

        完成上面的所有配置后,下面使用IDEA来连接RabbitMQ测试搭建情况:

        连接三台中任意一台虚拟机即可:

public class SimpleProducer {public static void main(String[] args) throws IOException, TimeoutException {//1.创建连接工厂,并且设置RabbitMQ相关的连接参数ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("192.168.93.135");connectionFactory.setPort(5672); //设置rabbitMq的默认端口   不修改可以不设置//connectionFactory.setUsername("admin");//connectionFactory.setPassword("123456");//connectionFactory.setVirtualHost("myVH");//2.根据连接工厂创建一个连接,根据这个连接创建一个channelConnection connection = connectionFactory.newConnection();Channel channel = connection.createChannel();//3.创建一个队列(Queue)//设置队列名、是否持久化、是否独占、是否被消费后自动删除、队列参数等等channel.queueDeclare("hello",true,false,false,null);//4.发布一条消息//设置交换机名称、routingKey、信息属性、消息内容channel.basicPublish("","hello",null,"Hello,World".getBytes());//5.释放资源channel.close();connection.close();}
}

发送信息后,查看任意页面:

        当故意关闭三台中的任意一台或两台虚拟机(模拟宕机)时,仍可以继续发送信息,再次启动“宕机”的虚拟机,会自动同步消息,应为三台机器已经构成一个集群,可以实现信息互相同步,当出问题时,信息会立刻同步到正常的机器上去,宕机修复后又可以同步,这里不再演示此过程。

相关文章:

实现RabbitMQ多节点集群搭建

目录 引言 一、环境准备 二、利用虚拟机搭建 ​ 三、镜像集群配置 四、HAProxy实现负载均衡(主用虚拟机操作) 五、测试RabbitMQ集群搭建情况 引言 在现代分布式系统中,消息队列(Message Queue)扮演着至关重要的角色,而 RabbitMQ 作为…...

GLIDE论文阅读笔记与DDPM(Diffusion model)的原理推导

Abstract 扩散模型(Diffusion model)最近被证明可以生成高质量的合成图像,尤其是当它们与某种引导技术结合使用时,可以在生成结果的多样性与保真度之间进行权衡。本文探讨了在文本条件图像生成任务中使用扩散模型,并比…...

机器学习——放回抽样

为了构建树集成模型,需要一种叫做有放回采样的技术。 以4个标记为演示,分别是红色、黄色、绿色和蓝色,用一个黑色的袋子把这四个标记的例子放进去,然后从这个袋子里有放回地抽取四次,抽出一个标记,结果是绿…...

前端内存泄漏:原理、检测与防范实践

一、什么是内存泄漏 内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因未能被释放或无法被释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 在前端开发中,虽然现代浏览器具备垃…...

Go的隐式接口机制

正确使用Interface 不要照使用C/Java等OOP语言中接口的方式去使用interface。 Go的Interface的抽象不仅可以用于dynamic-dispatch 在工程上、它最大的作用是:隔离实现和抽象、实现完全的dependency inversion 以及interface segregation(SOLID principle中的I和D)。…...

UE音频中间件wwise插件

虚幻引擎用wwise插件有什么用? 没有这个插件不是也能播放声音吗? 为什么要用他? 在Unreal Engine(UE)中使用 Wwise 插件,不是因为 UE 不能做声音,而是因为 Wwise 更强、更专业,适合复杂的音频需求。 🎧 …...

C++.cstring string

C.cstring string 1. C 中的字符串概述1.1 C 中字符串的两种表示方式C 中的 cstring示例代码 C 中的 string示例代码 1.2 C 中字符串的使用场景使用 cstring 的场景使用 string 的场景示例对比使用 cstring 的示例使用 string 的示例 2. C 中的 cstring2.1 cstring 的定义与基本…...

Spring AOP 和 AspectJ 有什么区别

1. 织入方式 Spring AOP: 运行时织入:Spring AOP 使用动态代理技术(如 JDK 动态代理或 CGLIB 代理)在运行时创建代理对象。 依赖 Spring 容器:仅支持 Spring 管理的 Bean。 AspectJ: 编译时织入&#xf…...

报表/报告组件(二)-实例与实现解释

上篇《报表/报告组件(一)-指标/属性组件设计》介绍了组件核心指标/属性设计,本文以实例介绍各个特性的实现和效果,实例是多个报告融合,显示所有的特性。 设计 指标/属性组件是报告/报表关键部分,上篇已介绍过,本节回顾…...

linux的实时性

Linux 的实时性取决于其内核配置和使用场景。标准 Linux 内核(非实时内核)在设计上更注重吞吐量和公平调度,而非严格的实时性。但通过以下方式可以显著提升其实时性能: 1. 标准 Linux 内核的实时性 优点: 适用于大多数…...

Opencv4 c++ 自用笔记 04 图像滤波与边缘检测

图像滤波与边缘检测 直接采集到的图像可能带有噪声的干扰,因此去除噪声是图像预处理中十分重要的一步。图像滤波是图像噪声去除的重要方式。 图像卷积 卷积操作广泛应用于信号处理领域,而图像本质上可以视为一种二维信号数据。 卷积过程可以理解为一…...

流媒体基础解析:音视频封装格式与传输协议

在视频处理与传输的完整流程中,音视频封装格式和传输协议扮演着至关重要的角色。它们不仅决定了视频文件的存储方式,还影响着视频在网络上的传输效率和播放体验。今天,我们将深入探讨音视频封装格式和传输协议的相关知识。 音视频封装格式 什…...

一个html实现数据库自定义查询

使用场景 应用上线后甲方频繁的找开发查询数据库数据,且没有固定的查询规律,产品经理也没有规划报表需求。 实现方案 后端开放自定义sql查询,屏蔽所有数据库的高危操作,将常用查询的sql放在一个html中的js中直接查询&#xff0…...

OCC笔记:TopoDS_Edge上是否一定存在Geom_Curve

1. 问题 写occt代码时,访问边的几何数据,通常有以下代码,若边不为空,BRep_Tool::Curve函数是否能返回Curve的有效对象指针呢? //其他略...const TopoDS_Edge& curEdge TopoDS::Edge(edgeExp.Current()); if( cu…...

Python aiohttp 全面指南:异步HTTP客户端/服务器框架

边写代码零食不停口 盼盼麦香鸡味块 、卡乐比(Calbee)薯条三兄弟 独立小包、好时kisses多口味巧克力糖、老金磨方【黑金系列】黑芝麻丸 边写代码边贴面膜 事业美丽两不误 DR. YS 野森博士【AOUFSE/澳芙雪特证】377专研美白淡斑面膜组合 优惠劵 别光顾写…...

更新已打包好的 Spring Boot JAR 文件中的 class 文件

# 1. 解压原始 JAR unzip -q original-app.jar -d temp # 2. 替换 class 文件 cp ~/projects/new-classes/*.class temp/BOOT-INF/classes/com/example/ # 3. 保留原始清单 cp temp/META-INF/MANIFEST.MF . # 4. 重新打包 jar -cf0m new-app.jar MANIFEST.MF -C temp/ . # …...

容器(如 Docker)中,通常不建议运行多个进程或要求进程必须运行在前台

在容器(如Docker)中,通常不建议运行多个进程或要求进程必须运行在前台,这与容器的设计理念、资源管理和生命周期管理机制密切相关。以下是具体原因和深入解析: 一、容器的设计理念:单一职责原则 容器的核…...

conda管理环境指令综合(随时更新)

创建环境和删除环境 #创建环境 conda create --name envname#删除环境 conda env remove --name envname克隆环境 # 查看现有环境列表 conda env list# 执行克隆操作 conda create --name 新环境名称 --clone 原环境名称# 示例:将名为"tf2"的环境克隆…...

从Java的JDK源码中学设计模式之装饰器模式

装饰器模式是一种极具弹性的结构型设计模式,它允许我们通过组合的方式动态扩展对象功能而无需修改原有结构。本文将通过JDK源码中的实际应用和通俗易懂的代码示例,带你深入了解这一强大模式的精髓。 装饰器模式核心原理 装饰器模式的核心思想&#xff…...

鸿蒙电脑会在国内逐渐取代windows电脑吗?

点击上方关注 “终端研发部” 设为“星标”,和你一起掌握更多数据库知识 10年内应该不会 用Windows、MacOS操作系统的后果是你的个人信息可能会被美国FBI看到,但绝大多数人的信息FBI没兴趣去看 你用某家公司的电脑系统,那就得做好被某些人监视的下场,相信…...

持续领跑中国异地组网路由器市场,贝锐蒲公英再次登顶销量榜首

作为国产远程连接SaaS服务的创领者,贝锐持续引领行业发展,旗下贝锐蒲公英异地组网路由器,凭借出色的技术实力和市场表现,斩获2024年线上电商平台市场销量份额中国第一的佳绩,充分彰显了其在网络解决方案与异地组网领域…...

Spring AI 系列3: Promt提示词

一、Promt提示词 Promt提示是引导 AI 模型生成特定输出的输入, 提示的设计和措辞会显著影响模型的响应。 在 Spring AI 中与 AI 模型交互的最低层级,处理提示有点类似于在 Spring MVC 中管理”视图”。 这涉及创建带有动态内容占位符的大段文本。 这些占…...

Nginx 的配置文件

核心概念: 指令 (Directives): 配置文件的基本构建块。每条指令以分号 ; 结束。指令可以设置参数(如 worker_processes auto;)。 上下文 (Contexts): 指令被组织在特定的块(用花括号 {} 包围)中,称为上下文…...

Redis:安装与常用命令

🌈 个人主页:Zfox_ 🔥 系列专栏:Redis 🔥 安装 Redis 使⽤apt安装 apt install redis -y⽀持远程连接 修改 /etc/redis/redis.conf 修改 bind 127.0.0.1 为 bind 0.0.0.0 修改 protected-mode yes 为 protected-mo…...

[原创](Windows使用技巧): Windwos11如何设置局域网共享访问? (多图详解)

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…...

Mac 芯片系列 安装cocoapod 教程

安装声明: 本人是在搭梯子的环境下安装成功,前提是必须安装好安装homebrew环境。 1.检测rudy的源 2.查看源(目的:检测rudy的源) gem sources - l 3.移除源(目的:移除rudy自带的源) gem sources --remove https://rubygems.org/ 4.更换源(目的:替换成国…...

智启未来:AI重构制造业供应链的五大革命性突破

一、需求预测:让供应链“未卜先知” 1.1 从经验判断到数据预言 传统供应链依赖人工分析历史数据,但面对市场波动、设备突发故障等不确定性,往往反应滞后。AI通过整合工业物联网(IIoT)传感器数据、生产排程、供应商交…...

Linux进程间通信----简易进程池实现

进程池的模拟实现 1.进程池的原理: 是什么 进程池是一种多进程编程模式,核心思想是先创建好一定数量的子进程用作当作资源,这些进程可以帮助完成任务并且重复利用,避免频繁的进程的创建和销毁的开销。 下面我们举例子来帮助理…...

解锁Java多级缓存:性能飞升的秘密武器

一、引言 文末有彩蛋 在当今高并发、低延迟的应用场景中,传统的单级缓存策略往往难以满足性能需求。随着系统规模扩大,数据访问的瓶颈逐渐显现,如何高效管理缓存成为开发者面临的重大挑战。多级缓存架构应运而生,通过分层缓存设…...

(纳芯微)NCA9548- DTSXR 具有复位功能的八通道 I²C 开关、所有I/O端子均可承受5.5V输入电压

深圳市润泽芯电子有限公司 推荐NOVOSENSE(纳芯微)品牌 NCA9548- DTSXR TSSOP-24封装 NCA9548- DTSXR 具有复位功能的八通道 IC 开关、所有I/O端子均可承受5.5V输入电压 产品描述 NCA9548是通过I2C总线控制的八路双向转换开关。 SCL / SDA上行数据分散到八对下行数据或通道。…...