RocketMQ 集群与高可用性:深入解析与实践指南

目录

前言

RocketMQ集群与高可用性

一、主从同步机制

1.1 使用场景

1.2 原理机制

1.3 数据同步流程

1.4 优缺点

二、RocketMQ 故障转移机制(Failover)

2.1 使用场景

2.2 原理机制

2.3 故障转移的注意事项

2.4 优缺点

三、主从架构和故障转移的代码示例

Broker 配置文件示例

启动 Docker 容器

代码示例:生产者与消费者

消息存储与持久化

一、消息存储机制概述

二、消息存储的工作流程

三、磁盘存储与内存映射

3.1 内存映射的工作原理

3.2 Page Cache 和 MappedFile 的关系

四、消息存储的文件结构

4.1 CommitLog

4.2 ConsumeQueue

4.3 IndexFile

五、内存映射的优缺点

优点

缺点

六、总结


前言

在分布式消息中间件的设计与部署中,高可用性是确保系统稳定运行和业务连续性的关键因素。RocketMQ,作为一款高性能的分布式消息中间件,具备多种机制来实现高可用性。本文将从Broker集群部署Name Server的高可用性消息存储与持久化三个方面,详细讲解RocketMQ的高可用性特性及其实现机制。


RocketMQ集群与高可用性

一、主从同步机制
1.1 使用场景
  • 高可用性:避免单点故障,确保消息服务在主节点宕机后能够快速恢复。
  • 数据一致性保障:通过主从同步,确保从节点的数据与主节点一致。
  • 读写分离:主节点负责写操作,从节点负责读操作,提高性能。
1.2 原理机制

RocketMQ 的主从架构包括主节点(Master)和从节点(Slave),其中主节点负责处理生产者的写入请求,从节点主要用于冗余存储和故障转移。RocketMQ 主要支持两种同步模式:

  1. 同步复制(SYNC Master-Slave)

    • 机制:在消息写入主节点后,主节点会同步将消息复制到从节点。只有当从节点成功接收到消息并确认后,主节点才会认为写入操作完成。
    • 数据一致性:同步复制模式能够确保主从节点之间的数据强一致性。如果主节点发生故障,从节点可以无损接管服务。
    • 延迟和性能:由于需要等待从节点的确认,写入操作的延迟较高,适用于对数据一致性要求高的场景。
  2. 异步复制(ASYNC Master-Slave)

    • 机制:主节点在接收到消息并存储后,立即返回响应给生产者,之后异步将消息复制到从节点。如果主节点宕机,可能有少量未同步到从节点的数据丢失。
    • 数据一致性:异步复制模式提供最终一致性,可能会丢失部分数据,但性能更高,适用于对数据一致性要求不高的场景。
    • 延迟和性能:由于无需等待从节点确认,写入操作的延迟较低,写入性能较好。
1.3 数据同步流程
  • 数据写入主节点:生产者发送消息到 Broker 的主节点,主节点将消息写入存储文件中。
  • 同步到从节点:根据配置的同步模式,主节点将消息同步到从节点。同步过程中,主节点通过日志复制的方式将消息同步到从节点的存储文件中。
  • 从节点确认:在同步复制模式下,从节点收到数据后会向主节点返回确认信号,完成一次消息的完整写入。
  • 主从延迟监控:RocketMQ 提供主从延迟监控,方便检测主从之间的同步延迟情况。
1.4 优缺点
  • 同步复制优点

    • 数据安全性高:主从节点保持数据强一致性,避免数据丢失。
    • 可靠性高:适用于高可靠性要求的场景,主节点宕机后从节点可无损接管。
  • 同步复制缺点

    • 性能较低:由于需要等待从节点确认,写入延迟较高,吞吐量会有所下降。
  • 异步复制优点

    • 性能高:主节点无需等待从节点确认,写入操作快速,适用于高性能场景。
    • 适合高并发:在高并发场景下,异步复制模式能够提供更高的消息吞吐量。
  • 异步复制缺点

    • 数据安全性较低:如果主节点发生故障,可能丢失少量未同步到从节点的消息,数据一致性无法保证。

二、RocketMQ 故障转移机制(Failover)
2.1 使用场景
  • 主节点宕机时服务不中断:当主节点因硬件故障或网络问题宕机时,系统能迅速将流量切换到从节点,保障消息服务的持续可用性。
  • 多副本备份和容灾:在异地多机房的场景下,支持自动的跨机房故障切换。
2.2 原理机制

RocketMQ 通过 Name Server 和 Broker 的协作来实现故障转移。当 Broker 的主节点宕机时,生产者或消费者可以自动连接到从节点,继续发送或接收消息。

  1. 主节点故障检测

    • 机制:Name Server 定期检测 Broker 主节点的健康状况。主节点如果发生宕机,Name Server 会将主节点标记为不可用,同时通知客户端进行故障转移。
    • 实现:生产者和消费者会与多个 Name Server 保持连接,一旦某个 Name Server 发现主节点不可用,会通知客户端切换到从节点。
  2. 切换到从节点

    • 机制:当主节点不可用时,生产者或消费者将自动切换到从节点进行操作。
    • 实现:Name Server 提供主从节点的地址信息,客户端在故障发生后从 Name Server 获取可用的从节点地址,并将请求转发给从节点。
  3. 故障恢复

    • 机制:在主节点恢复后,系统可以自动恢复到正常的主从架构,继续执行主从同步操作。
    • 实现:主节点恢复后,重新与 Name Server 进行注册,同时开始同步未处理的消息,恢复正常的主从复制。
2.3 故障转移的注意事项
  • 只读模式:在 RocketMQ 的主从架构中,从节点默认是只读的,因此故障转移只适用于消费者读取数据的场景。写操作仍然需要等主节点恢复。
  • 数据丢失风险:在异步复制模式下,如果主节点宕机,可能会丢失一部分未同步到从节点的数据,因此异步模式下的故障转移会有一定的数据丢失风险。
2.4 优缺点
  • 优点

    • 高可用性:通过故障转移机制,确保主节点宕机后系统能够快速切换到从节点,减少服务中断时间。
    • 自动恢复:主节点恢复后可以自动恢复到正常的主从同步状态,减少人工干预。
  • 缺点

    • 从节点的只读限制:从节点在故障转移期间是只读的,写操作会受限。
    • 异步复制的风险:在异步复制模式下,故障转移存在一定的数据丢失风险。

三、主从架构和故障转移的代码示例

下面是使用 Docker 搭建 RocketMQ 主从架构的一个简单示例,展示如何配置主从同步和故障转移。

Broker 配置文件示例

Master 配置文件 broker-a.properties

brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0  # 0表示Master
namesrvAddr=localhost:9876
autoCreateTopicEnable=true
storePathRootDir=/rocketmq/store
storePathCommitLog=/rocketmq/store/commitlog

Slave 配置文件 broker-a-s.properties

brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=1  # 1表示Slave
namesrvAddr=localhost:9876
autoCreateTopicEnable=false
storePathRootDir=/rocketmq/store-slave
storePathCommitLog=/rocketmq/store-slave/commitlog
haMasterAddress=localhost:10911  # 指定Master的地址
启动 Docker 容器

启动 Name Server:

docker run -d -p 9876:9876 --name rmqnamesrv rocketmqinc/rocketmq:latest sh mqnamesrv

启动 Broker 主节点:

docker run -d -p 10911:10911 -p 10909:10909 --name rmqbroker rocketmqinc/rocketmq:latest sh mqbroker -c /etc/rocketmq/broker-a.properties

启动 Broker 从节点:

docker run -d -p 20911:10911 -p 20909:10909 --name rmqbroker-s rocketmqinc/rocketmq:latest sh mqbroker -c /etc/rocketmq/broker-a-s.properties
代码示例:生产者与消费者

生产者代码示例

DefaultMQProducer producer = new DefaultMQProducer("producer_group");
producer.setNamesrvAddr("localhost:9876");
producer.start();Message msg = new Message("TopicTest", "TagA", ("Hello RocketMQ").getBytes());
SendResult sendResult = producer.send(msg);
System.out.printf("%s%n", sendResult);producer.shutdown();

消费者代码示例

DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer_group");
consumer.setNamesrvAddr("localhost:9876");
consumer.subscribe("TopicTest", "*");
consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {for (MessageExt msg : msgs) {System.out.printf("%s%n", new String(msg.getBody()));}return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
});consumer.start();

通过该主从同步和故障转移机制的详细讲解,可以有效帮助理解 RocketMQ 的高可用部署,并应用到生产环境中。


消息存储与持久化

一、消息存储机制概述

RocketMQ 的消息存储机制依赖于以下核心组件:

  1. CommitLog:消息的存储位置,所有消息都首先写入 CommitLog。
  2. ConsumeQueue:为消费消息而构建的索引文件,提供了从 CommitLog 中快速定位消息的方式。
  3. IndexFile:为消息生成索引(如基于消息 Key 或时间戳)的辅助文件,便于消息快速检索。
二、消息存储的工作流程

消息存储在 RocketMQ 中是如何工作的呢?以下是存储流程的详细步骤:

  1. 消息写入 CommitLog

    • 当生产者发送消息时,Broker 将消息以字节数组的形式写入 CommitLog 文件。消息被顺序写入到磁盘,这使得写入速度极高,因为顺序写入比随机写入更快(顺序写不需要磁盘寻道)。
  2. 构建 ConsumeQueue

    • CommitLog 中的每条消息被存储后,会异步地在 ConsumeQueue 中为每个消费者构建一个索引。ConsumeQueue 文件包含指向 CommitLog 文件中消息的物理偏移量,帮助消费者快速定位消息,而无需遍历整个 CommitLog。
  3. 更新 IndexFile(可选):

    • 如果消息带有 Key 或 Tag,RocketMQ 还会更新 IndexFile。该文件用于基于 Key 或时间戳来查找消息,生成的索引也指向 CommitLog 中的物理地址。
三、磁盘存储与内存映射

RocketMQ 在存储消息时,通过操作系统的**内存映射文件(Memory Mapped File, Mmap)**机制来加速读写操作。内存映射文件是一种将磁盘文件的部分或全部内容直接映射到进程的虚拟地址空间中的技术,这种方式极大地提高了 IO 的效率。

3.1 内存映射的工作原理
  1. 映射 CommitLog 和 ConsumeQueue

    • RocketMQ 会将 CommitLogConsumeQueue 映射到内存中。尽管消息最终是存储在磁盘上的,但通过映射,操作系统将文件的一部分直接加载到内存中,因此读写时无需手动读写磁盘,而是对内存进行操作。
  2. 读写流程

    • 写入时:消息被写入 CommitLog 映射的内存区域。由于这是直接在内存中进行的操作,写入速度非常快。
    • 写入后:操作系统通过 Page Cache 机制在后台将内存中的数据异步刷入磁盘,这使得即使大量写入操作也不会影响磁盘的性能。
    • 读取时:消费者读取消息时,RocketMQ 直接从映射的内存区域中读取数据,而不需要从磁盘读取,提高了消息的消费速度。
  3. 刷盘策略(Flush Disk Strategy)

    • RocketMQ 提供了两种刷盘策略来控制何时将内存中的消息写入磁盘:
      1. 同步刷盘(SYNC_FLUSH):每次写入消息后,Broker 等待消息被写入磁盘后才返回给客户端。确保数据持久性,但影响性能。
      2. 异步刷盘(ASYNC_FLUSH):写入消息后立即返回给客户端,由后台线程异步地将数据刷盘。性能高,但在极端情况下可能会有少量消息丢失。
3.2 Page Cache 和 MappedFile 的关系
  • Page Cache:RocketMQ 依赖操作系统的 Page Cache 来缓存文件。Page Cache 是 OS 级别的文件缓存,能够大大加速文件的读写。RocketMQ 的内存映射机制利用了 Page Cache,使得文件的读写操作可以直接在内存中进行,减少磁盘 IO 操作。

  • MappedFile:RocketMQ 自己实现了一套 MappedFile 机制,用于将磁盘文件映射到内存中。MappedFile 类负责维护内存映射文件,并通过 mmap 系统调用将文件部分映射到内存中。

MappedFile 是一个抽象层,封装了操作系统的 mmap 机制,并提供了一些高级功能,如自动扩展映射文件大小、定期 flush、磁盘分配等。

四、消息存储的文件结构

RocketMQ 的消息存储由三个核心文件组成:CommitLogConsumeQueueIndexFile

4.1 CommitLog
  • 功能:保存所有的消息数据,消息存储的主文件。
  • 存储方式:消息被顺序写入 CommitLog。每条消息包含消息体、消息属性(如 Tag 和 Key)、生产者信息等。
  • 文件组织:CommitLog 被分成多个固定大小(默认1GB)的文件。每个文件有一个唯一的起始偏移量,用来确定消息的物理位置。
4.2 ConsumeQueue
  • 功能:保存消费者的消费记录,用于快速定位消息。
  • 存储方式:ConsumeQueue 是 CommitLog 的索引文件。每个消费队列(即每个 Topic 的每个分区和消费者组)都有一个独立的 ConsumeQueue 文件。
  • 文件结构:ConsumeQueue 中每个条目记录了消息在 CommitLog 中的物理偏移量、消息大小和 Tag 的哈希值。
4.3 IndexFile
  • 功能:保存消息的索引,用于快速查找特定的消息。
  • 存储方式:IndexFile 使用哈希索引来根据消息的 Key 或时间戳来定位消息。
  • 文件结构:IndexFile 通过链式哈希存储 Key 和消息在 CommitLog 中的偏移量。通过 Key 或时间戳可以快速找到消息的位置。
五、内存映射的优缺点
优点
  1. 高性能读写:利用内存映射文件,RocketMQ 可以避免频繁的磁盘 IO 操作,提升了消息的读写速度。
  2. 顺序写入优化:RocketMQ 采用顺序写入磁盘的方式,最大化了磁盘的写入效率。
  3. 高效利用内存:操作系统通过 Page Cache 实现内存的自动管理,RocketMQ 不需要手动管理大量内存分配。
缺点
  1. 内存压力:内存映射文件依赖于物理内存和 Page Cache,如果消息积压严重,可能会导致内存不足。
  2. 数据丢失风险:在异步刷盘模式下,操作系统可能会延迟将内存中的数据刷到磁盘,宕机时可能会丢失部分数据。

RocketMQ 的消息存储机制结合了磁盘和内存映射的优势,确保了高效的消息读写性能。通过顺序写入和内存映射,RocketMQ 能够在处理高吞吐量的同时保证较低的延迟,同时利用刷盘策略和 Page Cache 来平衡数据一致性和性能。在分布式消息系统中,这种存储机制有效提升了系统的可扩展性和可靠性。

总结

对于RocketMQ整体的的介绍及学习内容目前便暂时更新至此,如果大家对此感兴趣也可在RocketMQ官网进行继续学习,后期也会再准备一些深层次的核心原理分析讲解,如感兴趣点个关注,也可发表一下自己想要学习的内容。​​​​​​​

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

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

相关文章

MySQL的 where 1=1会不会影响性能

MySQL的 where 11会不会影响性能? 一、引言 在编写SQL语句时,我们经常会遇到需要动态拼接查询条件的情况,尤其是在使用MyBatis这类ORM框架时。为了简化代码,很多开发者会使用where 11来开始他们的查询语句,然后通过程…

VSCode学习笔记

1. 快捷键 KeyDescriptionPlatformF1打开命令面板(Command Palette)Win10Shift Delete剪切当前光标所在的代码行Win10 2. 文件 2.1 在文件列表中定位当前文件 操作路径:右键单击文件名 ⇒ 在右键菜单中点击 【Reveal in Explorer View】

云计算第四阶段----CLOUD 01-03

CLOUD Day01 一、虚拟化平台搭建 虚拟化技术产品介绍 #黄线标注的,都是比较主流且常用的虚拟化平台。 虚拟化与云计算的关系 虚拟化是一种技术,它允许在单个物理服务器上创建和运行多个虚拟机(VMs),每个虚拟机都有其…

python编程知识(实现数据加密和解密)

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

JavaScript使用高德API显示地图

前言 在JavaScript中,使用Leaflet库显示地图是一种常见的做法。Leaflet是一个开源的JavaScript库,用于在Web应用程序中创建互动地图。它非常轻量级,易于使用,并且提供了多种功能,使开发者能够轻松地将地图集成到他们的…

银行结算业务

1.1 银行本票 银行本票是由银行签发的,承诺自己在见票时无条件支付票款给收款人或持票人的业务。银行本票按票面划分为定额本票和不定额本票,按币种划分为人民币银行本票和外币银行本票。人民币银行本票仅在同一交换区域内使用,资金清算利用当地人民银行组织的资金清算形式…

2024 年高教社杯全国大学生数学建模竞赛 C 题 农作物的种植策略(可视化代码)

持续更新中,2024年数学建模比赛思路代码论文都会发布到专栏内,只需订阅一次! 完整论文+代码+数据结果链接在文末! 订阅后可查看代码文件 1、描述性统计分析 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from scipy…

用SpringBoot API实现识别pdf文件是否含有表格

要使用Spring Boot API 实现一个识别 PDF 文件是否含有表格的功能,你可以结合 PDF 解析库(如 Apache PDFBox)来解析 PDF 文件内容,并通过分析文本或线条来判断 PDF 是否包含表格。然后使用 Spring Boot 提供的 REST API 来实现上传…

Windows——不利用任何软件,打开局域网服务器的文件夹方法

第一步: windows 键 R 键,打开左下角运行窗口 第二步: \\ip地址

Android14音频进阶之定制ramdisk文件系统init服务(八十三)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+…

Three 渲染器(二)

WebGL1Renderer 构造函数 WebGL1Renderer( parameters : Object ) Creates a new WebGL1Renderer. 属性 See the base WebGLRenderer class for common properties. 方法 See the base WebGLRenderer class for common methods. WebGLRenderTarget render target是一个…

vite+vue3+typescript+elementPlus前端实现电子证书查询系统

实现背景:之前电子证书的实现是后端实现的,主要采用GD库技术,在底图上添加文字水印和图片水印实现的。这里采用前端技术实现电子证书的呈现以及点击证书下载,优点是:后端给前端传递的是一组数据,不需要传证…

数据分析训练模型后输出模型评估报告

数据分析训练模型后输出模型评估报告 1、模型评估指标 1.1、概念: A:n个正样本,检测到是真值的数量 B:m个负样本,检测到是真值的数量 C:n个正样本,检测到假值的数量 D:m个负样本,检测到假值的数量 1.2、准确率(Accuracy) 正确预测的样本数量与总样本数量的比值。…

笔记整理—内核!启动!—kernel部分(1)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。 内核起始部分代码被解压代码调用&#xff0c…

Pinterest账号被封?试试这几种解封方法

Pinterest作为一个充满创意与灵感的视觉社交平台,吸引着大量用户和企业前来展示、收藏和分享他们的作品。然而,如同其他社交媒体平台一样,Pinterest也设立了一套严格的使用规则和监测机制,以保障平台内容的质量和用户的良好体验。…

2024 年keil5 注册机

注册鸡地址 百度网盘

Helm Deploy Online Rancher v2.9.1

文章目录 准备安装查看下载 准备 $ kubectl get node NAME STATUS ROLES AGE VERSION kube-master01 Ready control-plane 19d v1.29.5 kube-node01 Ready <none> 19d v1.29.5 kube-node02 Ready <none&…

SpringBoot+Redis极简整合

1 前言 Redis是现在最受欢迎的NoSQL数据库之一&#xff0c;下面将以最简洁的代码演示&#xff0c;在SpringBoot中使用redis。 2 下载安装Redis 2.1 下载 Redis3.x windows安装版下载地址 2.2 安装到任意位置 一直Next到完即可。 2.3 启动 打开安装目录&#xff0c;点击…

Bootstrap前端框架Glyphicons字体图标

115工具网收集提供Bootstrap前端框架Glyphicons字体图标库对照表​​​​​​​&#xff0c;Bootstrap前端UI,Glyphicons字体图标调用,Bootstrap按钮字体图标对照表,包括250多个来自Glyphicon Halflings的字体图标.项目中引用Bootstrap相关文件后即可直接调用下列图标class&quo…

使用图论技巧——有遍数限制的最短路

给定一个 n个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c; 边权可能为负数。 请你求出从 11 号点到 n 号点的最多经过 k 条边的最短距离&#xff0c;如果无法从 1 号点走到 n 号点&#xff0c;输出 impossible。 注意&#xff1a;图中可能 存在负权回路…