RocketMQ 主从复制原理深度解析

news2024/11/15 15:39:59

提到主从复制,我们可能立马会联想到 MySQL 的主从复制。

MySQL 主从复制是 MySQL 高可用机制之一,数据可以从数据库服务器主节点复制到一个或多个从节点。

这篇文章,我们聊聊 RocketMQ 的主从复制,希望你读完之后,能够理解主从复制的精髓。

1 同步与异步

在 RocketMQ 的集群模式中,Broker 分为 Master 与 Slave,一个 Master 可以对应多个 Slave,但是一个 Slave 只能对应一个 Master。

每个 Broker 与 Name Server 集群中的所有节点建立长连接,定时注册 Topic 信息到所有 Name Server。

Master 节点负责接收客户端的写入请求,并将消息持久化到磁盘上。而 Slave 节点则负责从 Master 节点复制消息数据,并保持与 Master 节点的同步。

  • 同步复制

生产者发送消息后,Master 接收到存储消息请求,将消息数据同步给 Slave 后,才将存储结果返回给生产者。同步复制模式下,发送消息会有一定延迟,系统吞吐量也会降低。

  • 异步复制

生产者发送消息后,Master 接收到存储消息请求,将消息存储后,直接将存储结果返回给生产者。 Master 和 Slave 再通过异步的方式同步数据,这种复制模式具有较小的延迟,可以实现比较高的吞吐量。

若 Master 出现故障,有些数据可能未写入 Slave ,未同步的数据可能丢失。

复制流程分为两个部分:元数据复制消息数据复制

  • 主从服务器同步主题,消费者进度,延迟消费进度,消费者配置数据
  • 主从服务器同步消息数据

2 元数据复制

Slave Broker 定时任务每隔 10 秒会同步元数据,包括主题消费进度延迟消费进度消费者配置

同步主题时,Slave Broker 向 Master Broker 发送 RPC 请求,返回数据后,首先加入本地缓存里,然后持久化到本地。

3 消息数据复制

下图是 Master 和 Slave 消息数据同步的流程图。

1、Master 启动后监听指定端口;

Master 启动后创建 AcceptSocketService 服务,用来创建客户端到服务端的 TCP 链接。

RocketMQ 抽象了链接对象 HAConnection , HAConnection 会启动两个线程,分别用于读服务和写服务:

  • 读服务:处理 Slave 发送的请求
  • 写服务:用于向 Slave 传输数据

2、Slave 启动后,尝试连接 Master ,建立 TCP 连接;

HAClient 是客户端 Slave 的核心类 ,负责和 Master 创建连接和数据交互。

客户端在启动后,首先尝试连接 Master , 查询当前消息存储中最大的物理偏移量 ,并存储在变量 currentReportedOffset 里。

3、Slave 判定拉取间隔是否大于 5 秒,则向 Master 汇报已拉取消息偏移量;

上报进度的数据格式是一个 Long 类型的 Offset , 8 个字节,非常简洁 。

发送到 Socket 缓冲区后,修改最后一次的写时间 lastWriteTimestamp 。

4、Master 解析请求偏移量,从消息文件中检索该偏移量后的所有消息;

当 Slave 上报数据到 Master 时,触发 SelectionKey.OP_READ 事件,Master 将请求交由 ReadSocketService 服务处理:

当 Slave Broker 传递了自身 commitlog 的 maxPhyOffset 时,Master 会马上中断 selector.select(1000) ,执行 processReadEvent 方法。

processReadEvent 方法的核心逻辑是设置 Slave 的当前进度 offset ,然后通知复制线程当前的复制进度。

写服务 WriteSocketService 从消息文件中检索该偏移量后的所有消息,并将消息数据发送给 Slave。

5、Slave 接收到数据,将消息数据 append 到消息文件 commitlog 里 。

首先 HAClient 类中调用 dispatchReadRequest 方法 , 解析出消息数据 ;

然后将消息数据 append 到本地的消息存储。

4 同步的实现

从数据复制流程图,我们发觉数据复制本身就是一个异步执行的,但是同步是如何实现的呢?

Master Broker 接收到写入消息的请求后 ,调用 Commitlog 的 aysncPutMessage 方法写入消息。

这段代码中,当 commitLog 执行完 appendMessage 后, 需要执行刷盘任务同步复制两个任务。

但这两个任务并不是同步执行,而是异步的方式,使用了 CompletableFuture 这个异步神器

当 HAConnection 读服务接收到 Slave 的进度反馈,发现消息数据复制成功,则唤醒 future 。

最后 Broker 组装响应命令 ,并将响应命令返回给客户端。

5 总结

1、主从复制包含元数据复制和消息数据复制两个部分;

2、元数据复制

​ Slave Broker 定时任务每隔 10 秒向 Master Broker 发送 RPC 请求,将元数据同步到缓存后,然后持久化到磁盘里;

3、消息数据复制

  • Master 启动监听指定端口
  • Slave 启动 HaClient 服务,和 Master 创建 TCP 链接
  • Slave 向 Master 上报存储进度
  • Master 接收进度,消息文件中检索该偏移量后的所有消息,并传输给 Slave
  • Slave 接收到数据后,将消息数据 append 到本地的消息存储。

4、同步的实现

​ 当 commitLog 执行完 appendMessage 后, 需要执行刷盘任务同步复制两个任务,这里用到了 CompletableFuture 这个异步神器。

​ 当 HAConnection 读服务接收到 Slave 的进度反馈,发现消息数据复制成功,则唤醒 future 。最后 Broker 组装响应命令 ,并将响应命令 返回给客户端 。

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

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

相关文章

与苹果力杠?微软AI PC全面升级

KlipC报道:5月21日,在召开的Build开发者前瞻活动中,微软CEO称全面升级AI PC,将Copilot融入Windows 11系统,GPT-4o 模型加持。 微软称即将发布全新款Surface电脑,将采用其Copilot标准,以支持人工…

IND-ID-CPA 和 IND-ANON-ID-CPA Game

Src: https://eprint.iacr.org/2017/967.pdf

【web网页官网】原创200套html+css网页制作尽在IT黄大大官网(持续更新中)

200套HTMLCSS网页制作开发 🍔涉及知识🥤写在前面🌈 网站效果 (持续更新...)🍧 一、涉及主题🌳二、具体访问方式访问入口1:威信公众号【IT黄大大】访问入口2、访问网址访问入口3、直接点击下面链接访问入口4…

操作教程|通过DataEase开源BI工具对接金山多维表格

前言 金山多维表格是企业数据处理分析经常会用到的一款数据表格工具,它能够将企业数据以统一的列格式整齐地汇总至其中。DataEase开源数据可视化分析工具可以与金山多维表格对接,方便企业更加快捷地以金山多维表格为数据源,制作出可以实时更…

交流负载箱:电力系统的稳定利器

交流负载箱是电力系统中的一种重要设备,主要用于模拟电网中的负载情况,以便对电力系统进行各种性能测试和分析。它是电力系统的稳定利器,对于保障电力系统的稳定运行起着至关重要的作用。 交流负载箱可以模拟电网中的负载情况,为电…

灵狐剪辑软件,视频AI剪辑+去水印裁剪+视频 分割+批量合成+智能混剪(教程+软件)

1.介绍: 【灵狐剪辑】是一款视频编辑工具,能够帮助用户轻松地制作出专业级别的视频作品。这款软件拥有丰富的视频编辑功能,包括剪辑、合并、添加特效、调整音频等,让用户能够充分发挥创意,打造出独具特色的视频内容。…

【Django】从零开始学Django【2】

五. CBV视图 Django植入了视图类这一功能,该功能封装了视图开发常用的代码,无须编写大量代码即可快速完成数据视图的开发,这种以类的形式实现响应与请求处理称为CBV(Class Base Views)。 1. 数据显示视图 数据显示视图是将后台的数据展示…

深圳比创达EMC|EMI电磁干扰行业:行业发展的关键与挑战

在当今的高科技时代,电子产品无处不在,它们为我们的生活带来了极大的便利。然而,随着电子设备的普及和集成度的提高,电磁干扰(EMI)问题也日益凸显。 一、EMI电磁干扰行业:无处不在的挑战 电磁…

人脸防欺骗——基于皮肤斑块的快速安全的生物识别实现人脸识别防欺骗方法

1. 概述 深度学习的进步促使面部识别技术在许多领域得到应用,例如在线身份验证(eKYC)和电子设备的安全登录。面部识别是一种生物识别技术,对安全性要求很高。近年来,为了提高人脸识别技术的可靠性,人们引入…

迈向F5G-A,开启全光万兆新时代——南通移动完成全市首个50G-PON技术验证

近日,南通移动在崇川区完成全市首个50G-PON万兆技术现网验证,标志着南通成为首批具备F5G-A(The 5th GenerationFixed Network-advanced)的万兆光网城市,使其成为网速最快、覆盖最全、时延最低的城市之一。 作为全光万兆的关键技术&#xff0c…

sonar3 使用 api/measures/componet 获取代码当,Java实现

最近团队在做一个技术架构相关的优化,当前的目标是想要通过代码量,系统架构入手。先统计到部门的代码量,如何进行代码行数的统计呢,因为我们采用的是Java技术栈,我就Java技术栈进行说明。 1、如何统计代码行数 要统计…

[C][自定义类型][二][位段][枚举][联合体]详细讲解

目录 1.位段1.什么是位段?2.位段的内存分配3.位段的跨平台问题4.位段的应用 2.枚举1.什么是枚举?2.枚举类型的定义3.枚举的优点4.枚举的使用 3.联合体(共用体)1.联合类型的定义 1.位段 1.什么是位段? 位段的声明和结构是类似的,…

振弦采集仪在岩土工程地质灾害监测中的可行性研究

振弦采集仪在岩土工程地质灾害监测中的可行性研究 引言: 岩土工程地质灾害是指在岩土体中由于自然力和人类活动等因素引起的,对人类生活、财产以及环境造成威胁的灾害。为了及时发现并准确监测地质灾害的发生和演化过程,振弦采集仪作为一种新…

24年gdcpc省赛C题

1279:DFS 序 先不考虑多节点,先看着颗二叉树,假设他们的父亲节点是第k个被访问的点,如果先访问左子树,那么得到的结果是a1*ka2*(k1)b1*(2k)b2*(2k1),可以发现,先访问左子树,那么右子树每次的乘以的p值实际上是左子树乘以的p值加上左子树的节点个数,比如a1*k和b1*(2k),如果不看2…

Ethr:一款TCP、UDP和HTTP网络性能测量工具

Ethr Ethr是一个用golang编写的跨平台网络性能测量工具。该项目的目标是提供本机工具,用于跨多种协议(如TCP,UDP,HTTP,HTTPS和跨多个平台)对带宽,连接,数据包,延迟&…

软件测试经理工作日常随记【6】-利用python连接禅道数据库并自动统计bug数据到钉钉群

测试管理_利用python连接禅道数据库并统计bug数据到钉钉 这篇不多赘述,直接上代码文件。 另文章基础参考博文:参考博文 加以我自己的需求优化而成。 统计的前提 以下代码统计的前提是禅道的提bug流程应规范化 bug未解决不删除bug未关闭不删除 db_…

解锁 AI 潜力:香橙派 AIpro 评测与实操指南

解锁 AI 潜力:香橙派 AIpro 评测与实操指南 引言 在智能科技飞速发展的今天,AI 技术正逐渐改变我们的生活方式。作为开发者,找到一款高性能、易用且经济实惠的开发板至关重要。香橙派 AIpro(OrangePi AIpro)凭借其卓越…

云下到云上,丽迅物流如何实现数据库降本50% | OceanBase案例

在2024年3月20日的首场OceanBase数据库城市行活动中,专注于物流及供应链解决方案的丽迅物流的架构师阳磊,围绕“OB Cloud在丽迅物流的实践”这一主题,进行了精彩的演讲。本文为此次演讲的内容回顾。 在丽迅物流(Lesoon Logistics…

triton之paged attention

一 原理 图解大模型计算加速系列之:vLLM核心技术PagedAttention原理 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/691038809 二 源码分析 1 测试参数设置 test_paged_attention(num_seqs32,num_heads(64, 64),head_size64,block_size16,dtypetorch.float16,…

java的变量关系~使用和扩展

一、变量的概述 1、什么是变量 白话:变量就是一个装东西的盒子。 通俗:变量是用于存放数据的容器。我们通过变量名 获取数据,甚至数据可以修改。 2、变量在内存中的存储 本质:变量是程序在内存中申请的一块用来存放数据的空间,类似我们酒店的房间&a…