Redian新闻
>
聊聊 RocketMQ 主从复制

聊聊 RocketMQ 主从复制

公众号新闻

RocketMQ 主从复制是 RocketMQ 高可用机制之一,数据可以从主节点复制到一个或多个从节点。

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

1 同步与异步

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

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

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

1、同步复制

每个 Master 配置一个 Slave ,有多对 Master-Slave ,HA 采用同步双写方式,即只有主备都写成功,才向应用返回成功。

这种模式的优缺点如下:

  • 优点:数据与服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高;

  • 缺点:性能比异步复制模式略低(大约低10%左右),发送单个消息的 RT 会略高,且目前版本在主节点宕机后,备机不能自动切换为主机。

2、异步复制

每个 Master 配置一个 Slave ,有多对 Master-Slave ,HA 采用异步复制方式,主备有短暂消息延迟(毫秒级),这种模式的优缺点如下:

  • 优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,同时Master宕机后,消费者仍然可以从Slave消费,而且此过程对应用透明,不需要人工干预,性能同多 Master 模式几乎一样;

  • 缺点:Master 宕机,磁盘损坏情况下会丢失少量消息 。

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

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

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 向 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 总结

RocketMQ 主从复制的实现思路非常简洁,Slave 启动一个线程,不断从 Master 拉取 Commit Log 中的数据,然后在异步 build 出 Consume Queue 数据结构。

核心要点如下:

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

2、元数据复制

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

3、消息数据复制

  1. Master 启动监听指定端口

  2. Slave  启动 HaClient 服务,和 Master 创建 TCP 链接

  3. Slave 向 Master 上报存储进度

  4. Master 接收进度,消息文件中检索该偏移量后的所有消息,并传输给 Slave

  5. Slave 接收到数据后,将消息数据 append 到本地的消息存储。

4、同步的实现

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

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


END



DragGAN开源仅一天,star数超2万,史上最强AI修图工具




这里有最新开源资讯、软件更新、技术干货等内容

点这里 ↓↓↓ 记得 关注✔ 标星⭐ 哦


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
35年来首次换帅!BlackRock三位CEO候选人超强履历曝光实习资讯|BlackRock暑期实习开启!23-26届毕业生均可申请!恭喜!DBC职梦学员已收到BlackRock (US) 2024校招实习二面邀请一文总结 MetaQ/RocketMQ 原理恭喜Boston College学员斩获BlackRock (US)暑期实习OfferRocketMQ在业务消息场景的优势详解岗位播报 | 资管BlackRock开放金融中后台全职网申,2022届可申RocketMQ事务消息初体验岗位播报 | 资管BlackRock开放2024 Spring Week网申渠道,不限专业订单量高速增长,如祺如何用RocketMQ应对挑战一文搞懂TCP、HTTP、Socket、Socket连接池枪和抖音8月最新!McKinsey、BlackRock...200+公司开岗,最快3周拿Offer资管巨头 | BlackRock(US)2023全职岗招聘启动全职招聘 | BlackRock -「业务经理助理(全职)」招聘RocketMQ 最佳实践之坑CNN、GRNN、CLSTM、TD-LSTM/TC-LSTM…你都掌握了吗?一文总结情感分析必备经典模型(一)资管巨头 | BlackRock 2024全职岗位招聘已开,本/硕速投BlackRock,紧急官宣!业务高速增长,如祺出行如何用腾讯云消息队列 RocketMQ 应对挑战“演唱会门票”应该说concerts' tickets还是concert tickets?第一百一十四章 突围资管巨头 | BlackRock 2024 Summer Internship Program开启面试官:如何使用Dockerfile去构建自定义的Docker镜像?问倒一堆Docker容器超全详解,别再说不会用Docker了!克罗地亚克尔卡国家公园(Krka National Park),大小瀑布第一百一十三章 疑杀英国秋招大爆发!高盛、BlackRock、BCG、Meta...新开300+岗位!双林奇案录第三部之长命锁: 第十六节这一次,Blackrock盯上了中国留学生全职招聘 | BlackRock -「全栈和后端Java软件工程师(全职)」招聘资管一哥 | BlackRock 2024 Summer Internship Program开启Rocket Boy 诺亚:小小又上翘的白毛双马尾兔女郎!面试官:如何使用 Dockerfile 去构建自定义的 Docker 镜像?问倒一大片。。。陌上花开975 Knock Knock~有空吗,我想和你谈个恋爱 | 罗德岛设计学院,善解人意,美剧粉
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。