实现RabbitMQ多节点集群搭建

news2025/7/27 5:15:28

目录

        引言

        一、环境准备

        二、利用虚拟机搭建

​        三、镜像集群配置

        四、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/hosts

192.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 --reload


firewall-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 haproxy

haproxy -v

看到下面则安装成功:

HAProxy /etc/haproxy/haproxy.cfg 中添加如下配置:
### haproxy 监控页面地址是:http://192.168.93.134:9188/haproxy_status
	listen admin_stats
		bind *:9188
		mode http
		log 127.0.0.1 local3 err
		stats refresh 60s
		stats uri /haproxy_status
		stats realm welcome login\ Haproxy
		stats auth admin:123456     ##记得改成自己的账号和密码
		stats hide-version
		stats admin if TRUE
	### rabbitmq 集群配置,转发到
	listen rabbitmq_cluster
		bind *:5672
		mode tcp
		balance roundrobin
		server rabbitnode1 192.168.93.135:5672 check inter 2000 rise 2 fall 3 weight 1
		server rabbitnode2 192.168.93.136:5672 check inter 2000 rise 2 fall 3 weight 1
		server 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.根据连接工厂创建一个连接,根据这个连接创建一个channel
        Connection 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();
    }
}

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

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

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

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

相关文章

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

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

机器学习——放回抽样

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

Go的隐式接口机制

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

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

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

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

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

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

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

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

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

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

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

Spring AI 系列3: Promt提示词

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

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…

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上行数据分散到八对下行数据或通道。…

013旅游网站设计技术详解:打造一站式旅游服务平台

旅游网站设计技术详解:打造一站式旅游服务平台 在互联网与旅游业深度融合的时代,旅游网站成为人们规划行程、预订服务的重要工具。一个功能完备的旅游网站,通过用户管理、订单管理等核心模块,实现用户与管理员的高效交互。本文将…

2024 CKA模拟系统制作 | Step-By-Step | 12、题目搭建-创建多容器Pod

目录 免费获取题库配套 CKA_v1.31_模拟系统 一、题目 二、考点分析 1. 多容器 Pod 的理解 2. YAML 配置规范 3. 镜像版本控制 三、考点详细讲解 1. 多容器 Pod 的工作原理 2. 容器端口冲突处理 3. 资源隔离机制 四、实验环境搭建步骤 总结 免费获取题库配套 CKA_v…

优化 Spring Boot API 性能:利用 GZIP 压缩处理大型有效载荷

引言 在构建需要处理和传输大量数据的API服务时,响应时间是一个关键的性能指标。一个常见的场景是,即使后端逻辑和数据库查询已得到充分优化,当API端点返回大型数据集(例如,数千条记录的列表)时&#xff0…

【C盘瘦身】给DevEco Studio中HarmonyOSEmulator(鸿蒙模拟器)换个地方,一键移动给C盘瘦身

文章目录 一、HarmonyOSEmulator的安装路径二、修改路径 一、HarmonyOSEmulator的安装路径 之前安装了华为的DevEco Studio,当时没注意,后来C盘告急,想着估计是鸿蒙的模拟器占用空间比较大,一检查还真是躺在C盘。路径如下&#x…

ORACLE 缺失 OracleDBConsoleorcl服务导致https://xxx:port/em 不能访问

这个原因是,操作过一下 ORCL的服务配置变更导致的。 再PATH中添加个环境变量,路径如下 管理员权限运行cmd 等待创建完成 大概3分钟 查看服务 点击第一个访问,下图登录后的截图