0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

聊聊RocketMQ的主从复制

OSC开源社区 来源:勇哥java实战分享 2023-07-04 09:42 次阅读

1 同步与异步

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

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

53cfb9da-198f-11ee-962d-dac502259ad0.jpg

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

1、同步复制

53f1edfc-198f-11ee-962d-dac502259ad0.jpg

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

这种模式的优缺点如下:

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

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

2、异步复制

5404f672-198f-11ee-962d-dac502259ad0.jpg

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

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

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

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

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

主从服务器同步消息数据

2 元数据复制

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

541b28ca-198f-11ee-962d-dac502259ad0.jpg

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

54308472-198f-11ee-962d-dac502259ad0.jpg

3 消息数据复制

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

544f7b66-198f-11ee-962d-dac502259ad0.jpg

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

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

5470ee9a-198f-11ee-962d-dac502259ad0.jpg

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

读服务:处理 Slave 发送的请求

写服务:用于向 Slave 传输数据

5492f058-198f-11ee-962d-dac502259ad0.png

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

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

54b28698-198f-11ee-962d-dac502259ad0.jpg

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

3、Slave 向 Master 汇报拉取消息偏移量;

54d59994-198f-11ee-962d-dac502259ad0.jpg

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

54f2d554-198f-11ee-962d-dac502259ad0.jpg

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

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

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

550fb840-198f-11ee-962d-dac502259ad0.jpg

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

552c8cc2-198f-11ee-962d-dac502259ad0.jpg

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

写服务 WriteSocketService 从消息文件中检索该偏移量后的所有消息(传输批次数据大小限制),并将消息数据发送给 Slave。

554f932a-198f-11ee-962d-dac502259ad0.jpg

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

5588c88e-198f-11ee-962d-dac502259ad0.jpg

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

55b7de3a-198f-11ee-962d-dac502259ad0.jpg

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

55d048c6-198f-11ee-962d-dac502259ad0.jpg

4 同步的实现

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

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

55fbe33c-198f-11ee-962d-dac502259ad0.jpg

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

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

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

5622ae4a-198f-11ee-962d-dac502259ad0.jpg

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

5 总结

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

核心要点如下:

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 组装响应命令 ,并将响应命令返回给客户端 。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RPC
    RPC
    +关注

    关注

    0

    文章

    111

    浏览量

    11533
  • TCP协议
    +关注

    关注

    1

    文章

    91

    浏览量

    12070
  • TCP通信
    +关注

    关注

    0

    文章

    146

    浏览量

    4223

原文标题:聊聊 RocketMQ 主从复制

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Redis主从复制的作用和步骤

    Redis青铜修炼手册(五) --- Redis的主从复制
    发表于 06-27 07:20

    基于二进制安装MySQL的主从复制

    二进制安装MySQL实现主从复制
    发表于 03-10 09:43

    mysql的主从复制

    mysql 主从复制
    发表于 04-28 14:30

    基于mycat的Mysql主从复制读写分离全攻略

    基于mycat的Mysql主从复制读写分离全攻略
    发表于 09-08 10:10 4次下载
    基于mycat的Mysql<b class='flag-5'>主从复制</b>读写分离全攻略

    详解Redis主从复制和哨兵机制

    Redis主从复制主要有两个角色,主机(master)对外提供读写功能,从机(slave)对外只提供读功能,主机定期把数据同步到从机上保证数据一致性。
    的头像 发表于 05-03 18:14 1955次阅读
    详解Redis<b class='flag-5'>主从复制</b>和哨兵机制

    利用MySQL进行一主一从的主从复制

    本文讲述了如何使用MyBatisPlus+ShardingSphereJDBC进行读写分离,以及利用MySQL进行一主一从的主从复制
    的头像 发表于 07-28 09:47 1035次阅读

    MySQL主从复制原理详解

    简单讲,MySQL主从复制就是数据写入一台服务器(主服务器)后,同时还会额外写入另外的服务器(从服务器)。也就是说数据会写多份,这样做的目的主要有两个:
    的头像 发表于 02-06 10:27 1085次阅读

    一个操作把MySQL主从复制整崩了

    最近公司某项目上反馈mysql主从复制失败,被运维部门记了一次大过,影响到了项目的验收推进,那么究竟是什么原因导致的呢?而主从复制的原理又是什么呢?本文就对排查分析的过程做一个记录。
    的头像 发表于 05-11 11:14 547次阅读
    一个操作把MySQL<b class='flag-5'>主从复制</b>整崩了

    什么是Redis主从复制

    Redis主从复制 来自灵魂的拷问:什么是Redis主从复制? 简言之就是: 主对外从对内,主可写从不可写 主挂了,从不可为主 看下面的图加深下理解: 对,你没看错,Redis主从复制没有动态选举
    的头像 发表于 10-09 15:09 417次阅读
    什么是Redis<b class='flag-5'>主从复制</b>

    mysql主从复制三种模式

    MySQL主从复制是一种常见的数据同步方式,它可以实现将一个数据库的更改同步到其他多个数据库的功能。主从复制可以提高数据库的可用性和性能,以及提供故障恢复和数据备份的支持。在MySQL中,有三种
    的头像 发表于 11-16 14:04 1538次阅读

    mysql如何实现主从复制的具体流程

    主从复制是MySQL数据库中常用的数据复制技术之一,它的主要目的是将一个数据库服务器上的数据复制到其他服务器上,以实现数据的备份、高可用和分布式部署。下面将详细介绍MySQL主从复制
    的头像 发表于 11-16 14:10 785次阅读

    mysql主从复制主要有几种模式

    MySQL主从复制是MySQL数据库中常用的一种数据复制方式,用于实现数据的备份、负载均衡、故障恢复等目的。主从复制主要有以下几种模式: 异步复制 异步
    的头像 发表于 11-16 14:15 1169次阅读

    mysql主从复制的原理

    MySQL主从复制是一种数据库复制技术,它允许将一个MySQL数据库的更新操作自动复制到其他MySQL数据库上的过程。主要通过MySQL的binlog(二进制日志)和relay log(中继日志)来
    的头像 发表于 11-16 14:18 488次阅读

    mysql主从复制 混合类型的复制

    MySQL主从复制是一种常用的数据复制技术,可以实现数据从一个MySQL服务器(主服务器)复制到另一个MySQL服务器(从服务器)。在主从复制中,混合类型的
    的头像 发表于 11-16 14:20 554次阅读

    配置MySQL主从复制和读写分离

    配置MySQL主从复制和读写分离
    的头像 发表于 10-23 11:44 438次阅读
    配置MySQL<b class='flag-5'>主从复制</b>和读写分离