RabbitMQ 集群

文章目录

  • 集群搭建
    • 使用 Docker-Compose
  • 镜像队列
    • 搭建步骤
    • 工作原理
    • 镜像策略
    • 主从同步
  • 同步延迟


集群搭建

参考:

  1. docker中安装并启动rabbitMQ

  2. Docker中搭建RabbitMQ集群

使用 Docker-Compose

这里提供一个脚本来使用 docker-compose 完成RabbitMQ集群的配置及启动

docker-compose.yml 文件如下

#!/bin/bash# 定义 RabbitMQ 用户名、密码和 Erlang Cookie
RABBITMQ_USER="guest"
RABBITMQ_PASS="guest"
ERLANG_COOKIE="secret_cookie"# 创建 docker-compose.yml 文件
cat << EOF > docker-compose.yml
version: '3.8'services:rabbitmq1:image: rabbitmq:3-managementhostname: rabbitmq1environment:RABBITMQ_DEFAULT_USER: $RABBITMQ_USERRABBITMQ_DEFAULT_PASS: $RABBITMQ_PASSports:- "15671:15672"  # Management UI- "5671:5672"    # RabbitMQvolumes:- ./rabbitmq1/data:/var/lib/rabbitmq- ./rabbitmq1/etc/rabbitmq:/etc/rabbitmqnetworks:- rabbitmq-netrabbitmq2:image: rabbitmq:3-managementhostname: rabbitmq2environment:RABBITMQ_DEFAULT_USER: $RABBITMQ_USERRABBITMQ_DEFAULT_PASS: $RABBITMQ_PASSports:- "15672:15672"  # Management UI- "5672:5672"    # RabbitMQvolumes:- ./rabbitmq2/data:/var/lib/rabbitmq- ./rabbitmq2/etc/rabbitmq:/etc/rabbitmqnetworks:- rabbitmq-netrabbitmq3:image: rabbitmq:3-managementhostname: rabbitmq3environment:RABBITMQ_DEFAULT_USER: $RABBITMQ_USERRABBITMQ_DEFAULT_PASS: $RABBITMQ_PASSports:- "15673:15672"  # Management UI- "5673:5672"    # RabbitMQvolumes:- ./rabbitmq3/data:/var/lib/rabbitmq- ./rabbitmq3/etc/rabbitmq:/etc/rabbitmqnetworks:- rabbitmq-netnetworks:rabbitmq-net:
EOFecho "docker-compose.yml 文件已创建。"# 创建节点目录结构
for i in {1..3}; domkdir -p rabbitmq$i/data rabbitmq$i/etc/rabbitmqecho "NODENAME=rabbit@rabbitmq$i" > ./rabbitmq$i/etc/rabbitmq/rabbitmq-env.confecho "$ERLANG_COOKIE" > ./rabbitmq$i/etc/rabbitmq/.erlang.cookiechmod 400 ./rabbitmq$i/etc/rabbitmq/.erlang.cookie  # 设置权限为 400
doneecho "各节点的配置文件已创建。"# 启动 Docker Compose
docker-compose up -d# 等待 RabbitMQ 启动
sleep 10# 将节点加入集群
docker exec -it rabbitmq2 rabbitmqctl stop_app
docker exec -it rabbitmq2 rabbitmqctl join_cluster rabbit@rabbitmq1
docker exec -it rabbitmq2 rabbitmqctl start_appdocker exec -it rabbitmq3 rabbitmqctl stop_app
docker exec -it rabbitmq3 rabbitmqctl join_cluster rabbit@rabbitmq1
docker exec -it rabbitmq3 rabbitmqctl start_app# 显示集群状态
docker exec -it rabbitmq1 rabbitmqctl cluster_statusecho "RabbitMQ 集群已成功启动。"

使用方式:
复制脚本内容到指定脚本文件,例如rabbitmq_cluster.sh,添加执行权限
脚本支持以下参数:

  1. 指定节点数量:./setup_rabbitmq_cluster.sh -n 5,默认 3 个节点
  2. 指定 Erlang Cookie 值:./rabbitmq_cluster.sh -c "your_cookie_value"
  3. 指定镜像版本:./rabbitmq_cluster.sh -v "3.10-management",默认"3.8-management"

脚本解释

  1. Erlang Cookie
    因为Erlang节点之间通过认证Erlang Cookie的方式来允许互相通信,所以要确保在每个节点中使用相同的 RABBITMQ_ERLANG_COOKIE 值,以便它们能够相互通信。

新版本已经不建议通过环境变量设置 Erlang Cookie 了,会报错
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
,建议在 home 目录下新建 .erlang.cookie 文件,在 每个节点的 .erlang.cookie 写入一致的字符串,注意 .erlang.cookie 文件的权限应该为 400。所以为了便于修改ErlangCookie,启动容器时要做好容器数据卷的映射。因为/var/lib/rabbitmq 是 RabbitMQ home 目录和 data 目录,所以需要映射到宿主机

启动成功后:访问WEB控制台界面
在这里插入图片描述

镜像队列

如果 RabbitMQ 集群中只有一个 Broker 节点,那么该节点的失效将导致整体服务的临时性不可用,并且也可能会导致消息的丢失。可以将所有消息都设置为持久化,并且对应队列的durable属性也设置为true,但 是这样仍然无法避免由于缓存导致的问题:因为消息在发送之后和被写入磁盘井执行刷盘动作之间存在一 个短暂却会产生问题的时间窗。通过 publisherconfirm(发布确认) 机制能够确保客户端知道哪些消息己经存入磁盘,尽 管如此,一般不希望遇到因单点故障导致的服务不可用。

引入镜像队列(Mirror Queue)的机制,可以将队列镜像到集群中的其他 Broker 节点之上,如果集群中 的一个节点失效了,队列能自动地切换到镜像中的另一个节点上以保证服务的可用性。

搭建步骤

  1. 启动三台集群节点
  2. 随便找一个节点添加 policy(策略)

找到 Policies 部分。
点击 Add / update a policy 按钮。
在这里插入图片描述

参数解释:

  1. Name: policy的名称,用户自定义。
  2. Pattern: queue的匹配模式(正则表达式)。^表示所有队列都是镜像队列。
  3. Definition: 镜像定义,包括三个部分ha-sync-mode、ha-mode、ha-params。

ha-mode: 指明镜像队列的模式,有效取值范围为all/exactly/nodes。

  • all:表示在集群所有的代理上进行镜像。
  • exactly:表示在指定个数的代理上进行镜像,代理的个数由ha-params指定。
  • nodes:表示在指定的代理上进行镜像,代理名称通过ha-params指定。

ha-params: ha-mode模式需要用到的参数。
ha-sync-mode: 表示镜像队列中消息的同步方式,有效取值范围为:automatic,manually。

  • automatic:表示自动向master同步数据。
  • manually:表示手动向master同步数据。

Priority: 可选参数, policy的优先级。

在 rabbitmq2 上创建一个队列发送一条消息,队列存在镜像队列,如下图所示:

在这里插入图片描述

工作原理

https://www.rabbitmq.com/docs/3.13/ha#what-is-mirroring

多个RabbitMQ节点组成镜像队列的情况下,有一个节点会作为主节点,其他的节点就是从节点,也就是其镜像队列。镜像队列其是就是从节点的概念。

对主节点的写操作会被复制到其他镜像队列上,slave会准确地按照master执行命令的顺序进行命令执行,故slave与master上维护的状态应该是相同的。

故障转移:如果持有队列主副本的节点发生故障,RabbitMQ 会自动将一个镜像副本提升为新的主副本,从而确保消息的可用性。

优缺点

优点:

  1. 高可用性:通过在多个节点上维护队列副本,确保即使某个节点故障,消息仍然可用。
  2. 故障转移:故障发生时可以快速切换到其他节点,减少服务中断。
    缺点:
  3. 资源消耗:镜像队列会消耗更多的内存和存储资源,因为每个消息都需要在多个节点上存储副本。
  4. 性能开销:在高负载情况下,消息复制可能导致性能下降,增加网络流量和延迟。

使用镜像策略的注意事项

在设计系统时,必须权衡高可用性和资源消耗之间的平衡。
定期监控队列和节点的状态,以确保镜像队列正常运行。
根据业务需求灵活设置镜像策略,确保系统在不同场景下的可靠性和性能。
通过合理配置镜像策略,您可以在 RabbitMQ 集群中实现高可用性和容错能力,确保消息在故障情况下的可用性。

镜像策略

RabbitMQ 的镜像策略(也称为高可用性策略)用于确保队列在集群中的高可用性和容错性。镜像队列会在多个节点上维护相同的队列副本,这样即使某个节点发生故障,其他节点仍然可以提供服务。以下是关于镜像策略的详细解释:

  1. 通过管理控制台设置
  2. 通过 rabbitmqctl 命令行工具设置
rabbitmqctl set_policy ha-all "^.*" '{"ha-mode":"all"}'

镜像策略的类型

ha-mode:

  1. all: 所有队列副本都在集群中的所有节点上。
  2. exactly: 指定每个队列应该有的副本数量。
  3. nodes: 指定特定的节点列表作为镜像副本。

ha-params:与 ha-mode 配合使用的参数,具体含义取决于 ha-mode 的选择。

主从同步

rabbitmq的主从复制是异步的,但是rabbitmq并不存在mysql这种场景的丢数据(这句话不是说rabbitmq保证不丢数据)。在这里,我们来分析一下RabbitMQ的副本复制的过程。

首先,我们来说一下mysql和rabbitmq的使用接口是不同的,这时很关键的一点。mysql是同步的接口,也就是说client将sql发给server,server处理sql后将结果返回给client,在server返回client结果前,client不能发起下一个sql的请求。对于rabbitmq来说,访问接口是异步的。client(我们这里说的是publisher)向rabbitmq server publish一条消息,在默认的情况下server是不返回成功还是失败的,也就是说client在不到成功还是失败的情况下就可以发起下一个请求。如果client关心server是否成功处理完这条消息,可以开启confirm模式,server会异步的返回ack通知client消息投递成功还是失败。但是client仍然不必等待收到当前消息的ack就可以继续发下一条。

接下来,我们来说rabbitmq的主从复制过程。实际上,RabbitMQ主从之间的数据复制是异步的,但是在rabbitmq中不会出现mysql那种丢数据的情况,这是因为rabbitmq的接口也是异步的,主收到一条消息写入本地存储,然后在发起写入从的请求。当所有从写入成功后,主才会给client返回ack说这次写入成功了。所以可以看出,虽然rabbitmq的主从复制是异步的,但是并且不会出现mysql丢数据的场景。只要客户端收到ack,就说明这条消息已经写入主和从了。

所以需要强调的一点是,同步和异步并非是决定数据可靠性的关键点。客户端收到成功通知时,所有副本是否写入成功才是判断数据可靠的关键点。因为mysql的接口是同步,所以才需要在主从复制同步还是异步上做出选择。rabbitmq的接口本身就是异步的接口,所以rabbitmq的主从复制就自然而然的是异步的方式。

同步延迟

在 RabbitMQ 中,同步延迟可能会影响消息的处理速度和系统的整体性能。以下是一些常见的解决方案和优化策略,可以帮助减少 RabbitMQ 的同步延迟:

  1. 优化网络配置
    网络带宽:确保 RabbitMQ 节点之间有足够的带宽,特别是在高负载情况下。考虑使用更快的网络连接。
    网络延迟:尽量将 RabbitMQ 节点部署在同一数据中心内,以减少网络延迟。
  2. 调整队列和镜像策略
    使用适当的镜像策略:
    如果不需要所有节点都有队列的镜像,可以选择 ha-mode 设置为 exactly 或 nodes,以减少复制的数量。
    如果只需要部分节点有镜像,可以指定特定的节点。
    减少镜像数量:尽量减少每个队列的镜像副本数量,权衡高可用性和性能之间的关系。
  3. 使用流控
    设置队列流控:可以通过设置 x-max-length 或 x-max-length-bytes 限制队列的最大长度或大小,从而防止队列过长导致的延迟。
  4. 增加消费者数量
    水平扩展消费者:增加消费者实例的数量,确保消息能够更快地被处理和确认。确保消费者能够在多个节点上并行运行。
  5. 优化消息处理
    提高消息处理效率:检查消费者的处理逻辑,确保消息处理尽可能高效,避免在处理过程中出现瓶颈。
    批量处理消息:考虑使用批量确认(basic.ack)而不是单个确认,以减少确认的开销。
  6. 监控和调试
    使用监控工具:利用 RabbitMQ 的监控插件或其他监控工具(如 Prometheus、Grafana)监控系统性能,识别瓶颈。
    分析日志:查看 RabbitMQ 日志,识别可能导致延迟的错误或警告。
  7. 资源和配置优化
    调整 RabbitMQ 配置:根据系统需求调整 RabbitMQ 的配置参数,如内存、磁盘和 CPU 使用情况。
    增加节点资源:确保 RabbitMQ 节点有足够的 CPU 和内存资源,避免因资源不足导致的性能下降。
  8. 使用持久化
    选择适当的持久化策略:在消息持久化与性能之间进行权衡,确保消息持久化不会对性能产生负面影响。
  9. 负载均衡
    使用负载均衡策略:在多个消费者之间分配负载,确保没有单个消费者过载,从而提高处理能力。
    通过上述方法,您可以有效减少 RabbitMQ 的同步延迟,并提高系统的整体性能和可靠性。

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

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

相关文章

【含开题报告+文档+PPT+源码】基于SSM + Vue的养老院管理系统【包运行成功】

开题报告 随着社会的发展和经济的进步&#xff0c;人口老龄化问题逐渐凸显。统计数据显示&#xff0c;全球范围内的老龄人口比例正在逐年上升&#xff0c;养老需求也随之增长。养老院作为提供专业养老服务的机构&#xff0c;承担着照料老人、提供医疗保健和社交活动等责任。传…

分享量化策略以及股票期货高频行情数据获取

**一、引言**在量化投资的世界中&#xff0c;回测是策略开发的关键环节。通过将策略应用于历史数据&#xff0c;我们可以模拟其表现并作出相应的调整。以下是一些实际案例&#xff0c;帮助我们更好地理解回测的重要性。 二、数据源 银河数据库&#xff08;yinhedata.com) 提供…

线上线下融合:开启商业新时代

在数字化时代&#xff0c;线上线下融合成为商业发展的重要趋势。 一、全渠道体验 线上线下融合实现了不同渠道无缝连接。如消费者可在实体店试穿后线上购买&#xff0c;线上买的也能在实体店退换货。同时&#xff0c;通过整合数据&#xff0c;为消费者提供个性化服务。像根据购…

【NLP自然语言处理】01-基础学习路径简介

目的&#xff1a;让大家能够在 AI-NLP 领域由基础到入门具体安排&#xff1a; NLP介绍 文本预处理RNN 及其变体&#xff08;涉及案例&#xff09;Transformer 原理详解迁移学习 和 Bert 模型详解 &#xff08;涉及案例&#xff09;特点&#xff1a; 原理 实践每个文章会有练习…

UART驱动学习二(TTY体系)

目录 一、TTY体系中设备节点的差别1. 傻傻分不清 /dev/tty*2. 要讲历史了2.1 电传机teletype2.2 计算机需要控制2.2.1 使用teletype2.2.2 teletype被淘汰了2.2.3 个人电脑和虚拟终端 3. tty相关设备节点3.1 各类设备节点的差别3.2 /dev/ttyN(N1,2,3,..., 63)3.3 /dev/tty03.4 /…

C语言入门指南:为大一新生准备

C语言入门指南&#xff1a;为大一新生准备 C语言是许多编程语言的基础&#xff0c;许多现代编程语言&#xff08;如C、Java、Rust等&#xff09;都从C语言中汲取了灵感。因此&#xff0c;学习C语言不仅能帮助你掌握编程的基本概念&#xff0c;还能为学习其他编程语言打下坚实的…

Android一个APP里面最少有几个线程

Android一个APP里面最少有几个线程 参考 https://www.jianshu.com/p/92bff8d6282f https://www.jianshu.com/p/8a820d93c6aa 线程查看 Android一个进程里面最少包含5个线程&#xff0c;分别为&#xff1a; main线程(主线程&#xff09;FinalizerDaemon线程 终结者守护线程…

详解正确创建好SpringBoot项目后但是找不到Maven的问题

目录 问题 解决步骤&#xff1a; 找到File->Project Structure... 设置SDK 设置SDKs 问题 刚刚在使用IDEA专业版创建好SpringBoot项目后&#xff0c;发现上方导航栏的运行按钮是灰色的&#xff0c;而且左侧导航栏的pom.xml的图标颜色也不是正常的&#xff0c;与此同时我…

Network - Telnet协议

Telnet 是一种网络协议&#xff0c;允许用户使用基于文本的界面通过网络与远程设备通信。它在早期的网络应用中被广泛用于远程管理和故障诊断&#xff0c;使用户能够连接到远程机器和服务&#xff0c;通常是通过 TCP/IP 网络。 Telnet is a network protocol that allows a use…

详细分析Spring Security OAuth2中的JwtAccessTokenConverter基本知识(附Demo)

目录 前言1. 基本知识2. Demo3. 实战 前言 java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 1. 基本知识 JwtAccessTokenConverter 是 Spring Security OAuth2 中的一…

如何创建免费版本的ABP分离模块?

由于ABP最近官方大改革&#xff0c;我们打开ABP.IO 官方会发现通过Cli创建模板的时候不能创建Trered类型的了 就是创建一个分层的解决方案&#xff0c;其中Web和Http API层在物理上是分开的。如果不勾选&#xff0c;则创建一个分层的解决方案&#xff0c;它不那么复杂&#xf…

Taipy:AI应用全栈开发神器

Taipy 是一个免费使用的 Python 库&#xff0c;任何具备基本 Python 技能的人都可以使用。它是数据科学家、机器学习工程师和 Python 程序员的得力工具。使用 Taipy&#xff0c;你可以轻松地将数据和机器学习模型转换为功能齐全的 Web 应用程序。在我们生活的瞬息万变的世界中&…

SpringBoot:让开发更加简单

文章目录 前言什么是 SpringBoot快速启动一个 SpringBoot 项目开发一个登录功能小结 前言 有一天&#xff0c;你脑海中闪现了一个想法&#xff1a;“学了 Java 好像还没怎么使用&#xff0c;今天要不用 Java 开发一个自己的网站&#xff1f;” 你想着不禁激动起来&#xff0c;…

棋牌灯控计时计费系统软件免费试用版怎么下载 佳易王计时收银管理系统操作教程

一、前言 【试用版软件下载&#xff0c;可以点击本文章最下方官网卡片】 棋牌灯控计时计费系统软件免费试用版怎么下载 佳易王计时收银管理系统操作教程 棋牌计时计费软件的应用也提升了顾客的服务体验&#xff0c;顾客可以清晰的看到自己的消费时间和费用。增加了消费的透明…

NASA:GES DISC 的 ATMOS L1 光谱和运行日志 V3 (ATMOSL1)大气痕量分子光谱(ATMOS)1 级产品

目录 简介 变量 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 ATMOS L1 Spectra and Runlogs V3 (ATMOSL1) at GES DISC 简介 这是第三版大气痕量分子光谱&#xff08;ATMOS&#xff09;1 级产品&#xff0c;包含 netCDF 格式的光谱和运行日志&#xff08;即 &…

Codeforces Round 977

这场比赛是晚上vp的&#xff0c;太逆天了自己&#xff0c;给我自己都菜笑了&#xff0c;第二题当时差了一个那个循序渐进的点没想到&#xff0c;关键细节都想到了&#xff0c;当时以为是错的就没写&#xff0c;第二题没做出来确实好久没遇到过了&#xff0c;裂开 话不多说&…

WMCTF 2024 wp

WEB PasswdStealer 前言 本来题目叫PasswdStealer的&#xff1a;) 考点就是CVE-2024-21733在SpringBoot场景下的利用。 漏洞基本原理参考 https://mp.weixin.qq.com/s?__bizMzg2MDY2ODc5MA&mid2247484002&idx1&sn7936818b93f2d9a656d8ed48843272c0不再赘述。 Spri…

谷歌发布了日语版的 Gemma2 模型——gemma-2-2b-jpn-it

Gemma 是一系列同类最佳的开放式模型&#xff0c;其灵感和技术源自 Gemini 系列模型。 它们是具有开放权重的文本到文本、纯解码器大型语言模型。 Gemma 模型非常适合各种文本生成任务&#xff0c;包括问题解答、摘要和推理。 Gemma-2-JPN 是一个针对日语文本进行微调的 Gemma…

详细分析Spring Framework中 @ConditionalOnProperty的基本知识(附Demo)

目录 前言1. 基本知识2. Demo 前言 基本的Java知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 从实战中学习启发 1. 基本知识 Conditiona…

20分钟写一个链表

目录 前言1.带头结点的循环双链表1.1 链表的分类、线性表的对比1.2 双链表基本操作代码实现1.2.1 初始化1.2.2 销毁、打印链表 总结 前言 有一个学长在面试的时候被问到这样一个问题&#xff0c;“你可以用20分钟写一个链表吗&#xff1f;”学长第一反应是&#xff0c;至少要一…