RocketMQ源码-主从同步复制和异步复制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RocketMQ源码-主从同步复制和异步复制相关的知识,希望对你有一定的参考价值。

参考技术A 1 概述
2 相关类介绍
3 同步复制原理
4 异步复制原理
5 注意事项

为了提供系统的可靠性,RocketMQ采用了主从复制机制,对于每个主Broker,可配置多个从Broker,主Broker接收生产者消息保存后,可通过同步或者异步的方式复制到从Broker,以此实现高可用。

采用同步复制,可以最大程度保证消息的可靠性,但是每次写消息都必须等待至少该消息被同步至一个从Broker中,因此也会影响系统吞吐量。异步复制则和同步复制正好相反,主Broker写完消息之后立刻返回,不用管该消息是否已经被复制到从Broker,因此吞吐量会高一点,但是如果在消息被复制到从Broker之前主Broker发生故障,那么有可能会造成未来得及复制到从Broker的信息丢失。

本文会简单介绍下RocketMQ主从同步的实现。

是主从复制服务的主要实现类,通过内部相关组件实现接受从Broker连接请求、记录从Broker上报的复制进度等功能。

主要负责接受从Broker的连接请求,接受到的每个从Broker的连接之后会新建 HAConnection 对象实例。

主Broker管理的一系列从Broker连接,内部持有一个 ReadSocketService 对象实例,负责接收从Broker定时上报的自己当前复制进度,也持有一个 WriteSocketService 负责在通道可写时向从Broker发送需要复制的数据,完成主从复制。

一个 ServiceThread 实现类,如果是从Broker,则会尝试向主Broker建立连接,并定时向主Broker汇报自己的复制进度,之后监听 OP_READ 事件(可参考笔者文章 NIO SelectionKey事件理解 ),处理主Broker通过 HAConnection.WriteSocketService 发送过来的需要复制的数据。

主从同步复制的实现类,如果是主从同步复制,则会向该类提交一个复制任务请求,并进入阻塞等待状态,该任务主要封装了当前主Broker的消息写进度, GroupTransferService 也是一个 ServiceThread ,会定时获取 HAConnection.ReadSocketService 接受到的从Broker的最大复制进度,然后对比所有的复制任务请求,如果已经从Broker最大复制进度已经大于请求内的进度要求,则唤醒该同步复制阻塞,阻塞和唤醒是通过 CountDownLatch 实现的。

BrokerController 通过 DefaultMessageStore.putMessage 存储消息,后者则通过调用 CommitLog.putMessage 进行实际的消息存储处理, CommitLog.putMessage 在将消息写入内存缓冲之后会先调用 handleDiskFlush 进行同步或异步刷盘,之后会调用 handleHA 进行主从复制处理。

handlerHA 方法定义如下:

GroupTransferService 接受了复制等待请求任务之后会在 run 方法中定时查看从Broker上报的最大复制进度,会唤醒那些等待进度已达到的等待任务。

其实异步复制原理比较简单,如果Broker配置为异步复制,则在 CommitLog.putMessage 写入消息之后,调用 handleHA 方法不会做任何操作,写入之后根本不用管从Broker的复制进度,复制完全是由后台 HAConnection.WriteSocketService 服务在监听到有从Broker连接可写时,向其写待复制的数据。每个从Broker发送进度则由从Broker定时汇报的自身当前已复制进度控制,该汇报由 HAConnection.ReadSocketService 负责处理,从Broker汇报上来的最大复制进度则用于第3节介绍的同步复制的等待复制任务阻塞的线程。

RocketMQ各组件通信比如Broker和Namesrv、Producer和Namesrv、Consumer和Namesrv、Producer以及Consumer和Broker之间的通信都是基于Netty实现的,但是本文介绍的主从复制实现中的网络交互都是基于原生Java NIO实现的。

mysql主从复制的异步复制与同步复制

异 步复制:MySQL本身支持单向的、异步的复制。异步复制意味着在把数据从一台机器拷贝到另一台机器时有一个延时 – 最重要的是这意味着当应用系统的事务提交已经确认时数据并不能在同一时刻拷贝/应用到从机。通常这个延时是由网络带宽、资源可用性和系统负载决定的。然 而,使用正确的组件并且调优,复制能做到接近瞬时完成。

 

同步复制:同步复制可以定义为数据在同一时刻被提交到一台或多台机器,通常这是通过众所周知的“两阶段提交”做到的。虽然这确实给你在多系统中保持一致性,但也由于增加了额外的消息交换而造成性能下降。

使用MyISAM或者InnoDB存储引擎的MySQL本身并不支持同步复制,然而有些技术,例如分布式复制块设备(简称DRBD),可以在下层的文件系 统提供同步复制,允许第二个MySQL服务器在主服务器丢失的情况下接管(使用第二服务器的复本)。要了解更多信息,请参 见:http://www.drbd.org/

以上是关于RocketMQ源码-主从同步复制和异步复制的主要内容,如果未能解决你的问题,请参考以下文章

我理解的RocketMQ:主从复制HA(High Availability)原理

RocketMQ高可用设计之主从复制和读写分离

mysql主从复制的异步复制与同步复制

MySQL主从复制半同步复制和主主复制

mysql主从之半同步复制和lossless无损复制

MySQL学习(二十四)主从同步-半同步