RabbitMQ集群搭建及使用

1. 概述

前提条件:linux服务器下已经安装好了docker服务。
本文档将搭建一个三台RabbitMQ的集群,包括三个RabbitMQ容器安装在同一服务器和三台不同的服务器。

2. 集群搭建

在一台服务器上创建三个RabbitMQ容器。

2.1.1. 创建容器

执行以下命令创建三个RabbitMQ容器:

# 容器1
docker run -d --hostname rabbit01 --name mq01 \
-p 5671:5672 -p 15671:15672 \
-e RABBITMQ_DEFAULT_USER=guest \
-e RABBITMQ_DEFAULT_PASS=guest \
-e RABBITMQ_ERLANG_COOKIE="javaboy_rabbitmq_cookie" rabbitmq:3-management# 容器2
docker run -d --hostname rabbit02 --name mq02 \
--link mq01:mylink01 \
-p 5672:5672 -p 15672:15672 \
-e RABBITMQ_DEFAULT_USER=guest \
-e RABBITMQ_DEFAULT_PASS=guest \
-e RABBITMQ_ERLANG_COOKIE="javaboy_rabbitmq_cookie" rabbitmq:3-management# 容器3
docker run -d --hostname rabbit03 --name mq03 \
--link mq01:mylink02 --link mq02:mylink03 \
-p 5673:5672 -p 15673:15672 \
-e RABBITMQ_DEFAULT_USER=guest \
-e RABBITMQ_DEFAULT_PASS=guest \
-e RABBITMQ_ERLANG_COOKIE="javaboy_rabbitmq_cookie" rabbitmq:3-management
  • --link:用来链接2个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以互相通信(容器间通过容器名或容器id进行网络访问)。
  • -e RABBITMQ_ERLANG_COOKIE:搭建集群时,节点中的Erlang Cookie值要一致,默认情况下,文件在 /var/lib/rabbitmq/.erlang.cookie,我们在用docker创建RabbitMQ容器时,可以为之设置相应的Cookie值。
  • --hostname:设置容器的主机名,用于在搭建集群的时候指定主机。

2.1.2. 开始搭建

进入到容器mq02中,执行以下命令:

rabbitmqctl stop_app
# rabbit@rabbit01中前面的rabbit是固定值,后面的rabbit01对应mq01的hostname值
rabbitmqctl join_cluster rabbit@rabbit01
rabbitmqctl start_app

然后查看集群状态:

# 查看集群状态
rabbitmqctl cluster_status

执行效果

以相同的方式进入到容器 mq03 中,执行以下命令:

rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbit01
rabbitmqctl start_app

此时集群已经有三个节点了,可以登录RabbitMQ实例的Web端首页查看到以下内容:

# 首页地址,以下三个节点任一节点都可以,登录账号和密码为:guest
http://192.168.1.39:15671/#/
http://192.168.1.39:15672/#/
http://192.168.1.39:15673/#/

2.2. 跨服务器

假设我们有三台服务器(确保这三台服务器可以相互ping通),三台服务器的ip地址分别是:

  • 192.168.1.149(服务1,主服务器)
  • 192.168.1.167(服务2)
  • 192.168.1.152(服务3)

我们将在每台服务器上安装RabbitMQ服务,然后将这三个RabbitMQ服务组成RabbitMQ集群。

2.2.1. 设置主机名称

设置主机名称和ip的映射,计算机可以通过自定义的主机名称自动定位到相应的ip地址,需要在三台服务器中都设置,执行以下命令:

vim /etc/hosts

可以看到和以下差不多的内容:

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

在末尾再添加以下内容(例如第一行表示 主机名为node1 和 ip为192.168.1.149 的映射关系):

# node1、node2、node3分别为三台服务器主机名称,使用“hostname”即可查看服务器的主机名称
192.168.1.149 node1
192.168.1.167 node2
192.168.1.152 node3

最后效果如下:

然后可以测试一下,直接ping这个主机名,效果如下:

2.2.2. 创建容器

在每一台服务上运行如下脚本:

docker run \
-d \
--net host \
--name mq01 \
-e RABBITMQ_DEFAULT_USER=guest \
-e RABBITMQ_DEFAULT_PASS=guest \
--restart=always \
rabbitmq:3-management

参数释义:

  • --net host:以host模式启动容器,容器将共享宿主机的ip和端口
  • -e RABBITMQ_DEFAULT_USER:设置RabbitMQ的web管理页面的登录账号,默认guest
  • -e RABBITMQ_DEFAULT_PASS:设置RabbitMQ的web管理页面的登录密码,默认guest,集群的每个节点的账号密码需要一致
  • --restart=always:在容器退出时总是重启容器

效果如下图:

确保每一个服务都可以打开对应的web端管理页面

# 首页地址,确保以下三个节点任一节点都可以
http://192.168.1.149:15672/#/
http://192.168.1.167:15672/#/
http://192.168.1.152:15672/#/

2.2.3. 查看容器端口

查看容器的端口用于排查容器启动的问题,例如端口的占用,或者后续登录或者连接服务,也需要知道端口信息,如果忘记了服务的端口,就可以使用查看端口命令来查看,如果暂时没有这方面的需求,可以暂时跳过本段。

容器启动之后会以默认端口启动,容器启动之后的效果如下:

如果想要查询容器的端口,先查询出容器的PID:

再根据PID查询端口:

netstat -anp | grep 1655

如上图,可以看出RabbitMQ服务默认启动的端口有很多,例如25672、15672、5672等。

2.2.4. 设置cookie

要使两个节点能够通信,它们必须具有相同的共享密钥,称为Erlang cookiecookie是一串最多 255 个字符的任意字母数字字符,每个集群节点必须具有相同的cookie,我们可以将主服务的cookie文件复制到每台从服务中。

cookie文件所在目录为容器内部的/var/lib/rabbitmq/.erlang.cookie/root/.erlang.cookie两处,如果进入目录使用ls命令查看,不要忘记加-a参数,.erlang.cookie是一个隐藏文件。

先将主服务器容器内部的cookie文件拷贝到宿主机中:

docker cp mq01:/var/lib/rabbitmq/.erlang.cookie /mydata/rabbitmq/

效果如下图:

docker宿主机和容器文件相互拷贝的语法:

# 本地到服务器
docker cp 本地路径 容器id或者容器名字:容器内路径
# 服务器到本地
docker cp 容器id或者容器名字:容器内路径 本地路径

再将cookie文件从主服务宿主机中拷贝到每台的从服务宿主机中:

# 利用scp工具将cookie文件从主服务宿主机中拷贝到每台的从服务宿主机中
scp /mydata/rabbitmq/.erlang.cookie root@node2:/mydata/rabbitmq/
scp /mydata/rabbitmq/.erlang.cookie root@node3:/mydata/rabbitmq/

在从服务器2和从服务器3中就可以看到这个cookie文件了:

在从服务器2和从服务器3中,将cookie文件copy到容器中,覆盖原cookie文件:

docker cp /mydata/rabbitmq/.erlang.cookie mq01:/var/lib/rabbitmq/.erlang.cookie
docker cp /mydata/rabbitmq/.erlang.cookie mq01:/root/.erlang.cookie

效果如下图:

然后重启容器。

2.2.5. 加入集群

分别进入从服务器2和从服务器3,然后分别进入其容器内部,再将该节点加入集群:

# 进入指定容器命令,例如下面进入容器mq01
docker exec -it mq01 bash# 关闭当前启动的节点
rabbitmqctl stop_app# 将当前节点加入到集群节点node1上
rabbitmqctl join_cluster rabbit@node1# 再开启当前节点
rabbitmqctl start_app

效果如下图:
node2加入到node1中

node3加入到node1中

最后登录任一节点的后台管理系统(例如node2的:http://192.168.1.167:15672/#/)查看:

注意:如果在node2或者node3节点中,执行加入集群命令的时候报错,请检查以下几点:

  • 每台服务器之间是否是否可以ping通,并且通过主机名也可以ping通。
  • 每个服务单独都可以启动成功,并且后台管理页面可以访问到。
  • 每台从服务的两个cookie文件是否都和主服务的cookie文件一致,不要随意修改cookie文件的权限。

3. 集群容灾性测试

  • 普通集群:我们创建的队列Queue,它的元数据(主要就是Queue的一些配置信息)会在所有的RabbitMQ 实例中进行同步,但是队列中的消息只会存在于一个RabbitMQ实例上,而不会同步到其他队列。
    这种集群可以提高RabbitMQ的消息吞吐能力,但是无法保证高可用,因为一旦一个 RabbitMQ 实例挂了,消息就没法访问了,如果消息队列做了持久化,那么等 RabbitMQ 实例恢复后,就可以继续访问了;如果消息队列没做持久化,那么消息就丢了
  • 镜像集群:它和普通集群最大的区别在于Queue数据和原数据不再是单独存储在一台机器上,而是同时存储在多台机器上。也就是说每个RabbitMQ实例都有一份镜像数据(副本数据)。每次写入消息的时候都会自动把数据同步到多台实例上去,这样一旦其中一台机器发生故障,其他机器还有一份副本数据可以继续提供服务,也就实现了高可用。

3.1. 普通集群

上面我们搭建的就是普通集群,普通集群数据只在一个RabbitMQ实例上,所以如果这个实例宕机了,

正常情况:

 停止服务2
再次发送消息,消息的消费不受影响
再次启动服务2,这次换停止服务3,发现消息的发送和消费还是不受影响


将服务3也还原回来,这次直接停止主节点服务1,再次调用接口

消息没有收到,发现所有的队列也直接崩了

这时候恢复服务1,发现队列就回来了

普通集群模式下,从节点并没有数据,主节点接收消息,从节点只是去主节点拉取消息,这样做来提高吞吐量,可用性并没有提高,主节点一宕机,这个集群就用不了了。

3.2. 镜像集群

3.2.1. 配置

镜像集群并不用重新搭建,只需在原来普通集群的基础上修改策略即可。
进入RabbitMQ web管理页面

新增策略

各参数含义如下:

  • Name: policy 的名称。
  • Pattern: queue 的匹配模式(正则表达式)。
  • Definition:镜像定义,主要有三个参数:ha-mode, ha-params, ha-sync-mode。
    • ha-mode:指明镜像队列的模式,有效值为 all、exactly、nodes。其中 all 表示在集群中所有的节点上进行镜像(默认即此);exactly 表示在指定个数的节点上进行镜像,节点的个数由 ha-params 指定;nodes 表示在指定的节点上进行镜像,节点名称通过 ha-params 指定。
    • ha-params:ha-mode 模式需要用到的参数。
    • ha-sync-mode:进行队列中消息的同步方式,有效值为 automatic 和 manual。
  • priority 为可选参数,表示 policy 的优先级。

配置完成后,点击下面的 add/update policy 按钮

或者直接使用命令:

语法:

rabbitmqctl set_policy [-p vhost] [--priority priority] [--apply-to apply-to] {name} {pattern} {definition}

设置好之后再去看队列就可以看到末尾有+2的标志:

3.2.2. 测试

关闭服务2测试:服务和普通集群一样,可以正常运行;
关闭服务1测试:

这时候队列也还存在,测试消息也能正常发送和消费。

4. 连接和使用集群

1、添加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2、配置文件

spring:rabbitmq:addresses: 192.168.1.39:5671,192.168.1.39:5672,192.168.1.39:5673username: guestpassword: guest# 消息重试配置listener:simple:retry:# 开启重试机制enabled: true# 最大重试次数max-attempts: 60# 最大重试间隔时间max-interval: 60000# 初始重试间隔时间initial-interval: 3000# 间隔时间乘子,当前间隔时间*间隔时间乘子=下一次的间隔时间,最大不能超过设置的最大重试间隔时间multiplier: 2

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

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

相关文章

Python实现PSO粒子群优化DBSCAN膨胀聚类模型(DBSCAN算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 随着大数据时代的到来&#xff0c;从海量数据中提取有用信息变得至关重要。聚类分析作为一种无监督…

Telephony中ITelephony的AIDL调用关系

以Android14.0源码讲解 ITelephony来自framework下的com.android.internal.telephony包下 frameworks/base/telephony/java/com/android/internal/telephony/ITelephony.aidl这个接口用于与Phone交互的界面&#xff0c;主要由TelephonyManager类使用&#xff0c;一些地方仍在…

【电机控制】相电流重构——单电阻采样方案

【电机控制】相电流重构——单电阻采样方案 文章目录 [TOC](文章目录) 前言一、基于单电阻采样电流重构技术原理分析1.1 单电阻采样原理图1.2 基本电压矢量与电流采样关系 二、非观测区2.1 扇区过渡区2.2 低压调制区 三、非观测区补偿——移相法四、参考文献总结 前言 使用工具…

C++11实践指北

C11&#xff1a;书、在线工具、库。 书 1. 《现代C语言核心特性解析》 覆盖 C11~C20 特性的讲解。 视频跟读&#xff1a;https://www.bilibili.com/video/BV1nN4y1j7fv 现代CPP随笔_0CCh - 每天5分钟了解现代C新特性 2. 《C Primer》第五版 基于 C11 的 C 入门书。 正在看…

java基础面试题一

目录 1、Java语言概述 1.1一个”.java”源文件中是否可以包括多个类&#xff1f;有什么限制 1.2Java 的优势 1.3常用的几个命令行操作都有哪些&#xff1f;(至少4个) 1.4Java 中是否存在内存溢出、内存泄漏&#xff1f;如何解决&#xff1f;举例说明 1. 内存溢出&#xf…

RocketMQ | 源码分析 | Broker控制器的启动

在分布式消息中间件的领域中&#xff0c;RocketMQ 以其高性能、高可靠性和强大的功能占据着重要的地位。而 Broker 作为 RocketMQ 的核心组件之一&#xff0c;其控制器的启动过程涉及到众多关键环节和复杂的逻辑。理解这个过程对于深入掌握 RocketMQ 的运行机制以及在实际应用中…

从0开始深度学习(22)——从全连接层到卷积

多层感知机在处理图像这种高维数据时&#xff0c;因为模型需要大量的数据来训练这么多参数&#xff0c;会导致巨大的计算成本&#xff0c;还会增加过拟合的风险&#xff0c;所以人们选择使用卷积神经网络 1 不变性 在计算机视觉和深度学习领域&#xff0c;特指模型对输入数据中…

MySQL8.0.40编译安装

近期MySQL发布了8.0.40版本&#xff0c;与之前的版本相比&#xff0c;部分依赖包发生了变化&#xff0c;因此重新编译一版&#xff0c;也便于大家参考。 1. 下载源码 选择对应的版本、选择源码、操作系统 如果没有登录或者没有MySQL官网账号&#xff0c;可以选择只下载 2. 进…

系统性能优化——绑核

简要 绑核正如其名&#xff0c;将线程/进程绑定在一个或多个CPU核心。该技术可以使进程或线程在特定的处理器上运行&#xff0c;而不会被操作系统调度到其他处理器上。这里有两层含义。 如果线程被绑定在指定核心上&#xff0c;则只会在该核心上运行&#xff0c;即使其他核心…

2024年CentOS镜像下载地址,包括CentOS官网、国内镜像下载,超详细也

这里给大家提供了4种镜像下载地址&#xff0c;包括CentOS官方镜像下载、阿里云开源镜像站下载、网易开源镜像下载搜狐开源镜像下载。 1.CentOS官网镜像下载 因为服务器在国外所以打开CentOS官方网站的时候可能会比较慢。大家可以选择后面几种国内镜像下载方式。 1.1进入CentO…

【面试经典150】day 8

#1024程序员节 | 征文# 作为一个未来的程序员&#xff0c;现在我要继续刷题了。 力扣时刻。 目录 1.接雨水 2.罗马数字转整数 3.最后一个单词的长度 4.最长公共前缀 5.反转字符串中的单词 1.接雨水 好好好好好好&#xff0c;一开始就接雨水。我记得接了n次了。。。 痛苦战…

矩阵概念 和 性质

目录 一、矩阵因式分解 二、矩阵在图形学的运用 一、矩阵因式分解 1、先将矩阵化为上三角阵&#xff0c;得到U 2、每个主元列以下元素 主元 得到下三角阵 二、矩阵在图形学的运用 二维移动&#xff1a; 子空间H&#xff1a; 零向量属于H 对H中任意向量u、v&#xff0c;uv…

spyglass关于cdc检测的一处bug

最近在使用22版spyglass的cdc检测功能&#xff0c;发现struct_check的cdc检测实际时存在一些bug的。 构造如下电路&#xff0c;当qualifier和destination信号汇聚时&#xff0c;如果des信号完全将qualifier gate住&#xff0c;sg仍然会报ac_sync。当然此问题可以通过后续funct…

共识算法Raft(day11)

引入 在分布式系统中&#xff0c;为了消除单点提高系统可用性&#xff0c;通常会创建副本来进行容错&#xff0c;但这会带来另一个问题就是&#xff0c;如何保证多个副本之间的数据一致性。 为了解决这个问题&#xff0c;计算机行内就提出了共识算法&#xff0c;它允许多个分…

27.9 调用go-ansible执行playbook拷贝json文件重载采集器

本节重点介绍 : go-ansible执行playbook编写分发重载的playbook编译执行 测试停掉一个节点测试停掉的节点再回来 go-ansible执行playbook 新增 goansiblerun/run.go package goansiblerunimport ("context""github.com/apenella/go-ansible/pkg/execute&qu…

【数学二】多元函数积分学-重积分-二重积分定义、性质、计算

考试要求 1、了解多元函数的概念&#xff0c;了解二元函数的几何意义. 2、了解二元函数的极限与连续的概念&#xff0c;了解有界闭区域上二元连续函数的性质. 3、了解多元函数偏导数与全微分的概念&#xff0c;会求多元复合函数一阶、二阶偏导数&#xff0c;会求全微分&#x…

【Dv2Admin】Django配置线上ws反向代理

在 Web 应用程序的部署过程中,安全性、稳定性和实时通信是开发者们普遍关注的重点。Django 是一个非常流行的 Web 框架,常与 Nginx 配合使用,以便实现反向代理、负载均衡以及 SSL 加密等功能。除此之外,实时功能(如 WebSocket)也是现代应用中经常使用的技术。 在项目中实…

分布式文件系统Minio实战

分布式文件存储系统Minio实战 1、分布式文件系统应用场景1.1 Minio介绍1.1.1 Minio优点 1.2 MinIO的基础概念1.3 纠删码EC&#xff08;Erasure Code&#xff09;1.4 存储形式1.5 存储方案 2、Minio环境搭建2.1 单机部署2.1.1 non-erasure code mode2.1.2 erasure code mode2.1.…

算法题总结(十九)——图论

图论 DFS框架 void dfs(参数) { if (终止条件) {存放结果;return; }for (选择&#xff1a;本节点所连接的其他节点) {处理节点;dfs(图&#xff0c;选择的节点); // 递归回溯&#xff0c;撤销处理结果 } }深搜三部曲 确认递归函数&#xff0c;参数确认终止条件处理目前搜索节…

【网络协议栈】Tcp协议(下)的可靠性和高效性(超时重传、快速重传、拥塞控制、流量控制)

绪论: 承接上文&#xff0c;上文写到Tcp协议的结构以及对tcp协议的性能优化的滑动窗口&#xff0c;本章我们将继续了解Tcp协议的可靠性和高效性的具体展示。后面我将继续完善网络协议栈的网络层协议敬请期待&#xff01; 话不多说安全带系好&#xff0c;发车啦&#xff08;建议…