BOB(中国)官方入口-BOB体育娱乐平台

BOB综合登陆入口 新闻的存储

202110月06日

BOB综合登陆入口 新闻的存储

RocketMQ存储摘要设计 BOB综合登陆入口

RocketMQ主要存储的文件包括commitlog文件、consumeQueue文件、IndexFile文件。

CommitLog是新闻存储文件,一切新闻主题的新闻都存储在CommitLog文件中;该文件默认最大为1GB,超过1GB后会轮到下一个CommitLog文件。经由过程CommitLog,RocketMQ将一切新闻存储在一首,以挨次IO的手段写入磁盘,足够行使了磁盘挨次写缩短了IO争用挑高数据存储的性能。

RocketMQ的Broker机器磁盘上的文件存储结构

新闻在CommitLog中的存储格式如下:

存储一切新闻内容,写满一个文件后生成新的commitlog文件。一切topic的数据存储在一首,逻辑视图如下:

CommitLog代码

private static final Logger log = LoggerFactory.getLogger; // Non fair Sync 

ConsumeQueue是新闻消耗队列文件,新闻达到commitlog文件后将被异步转发到新闻消耗队列,供新闻消耗者消耗;一个ConsumeQueue外示一个topic的一个queue,相通于kafka的一个partition,但是rocketmq在新闻存储上与kafka有着专门大的分别,RocketMQ的ConsumeQueue中不存储详细的新闻,详细的新闻由CommitLog存储,ConsumeQueue中只存储路由到该queue中的新闻在CommitLog中的offset,新闻的大幼以及新闻所属的tag的hash,统统只占20个字节,整个数据包如下:

ConsumeQueue代码

public static final int CQ_STORE_UNIT_SIZE = 20;     private static final Logger log = LoggerFactory.getLogger;      private final DefaultMessageStore defaultMessageStore;     /**      * 映射文件队列      */     private final MappedFileQueue mappedFileQueue;     /**      * Topic      */     private final String topic;     /**      * 队列号      */     private final int queueId;     /**      * 新闻位相新闻ByteBuffer      */     private final ByteBuffer byteBufferIndex;     /**      * 文件存储地址      */     private final String storePath;     /**      * 每个映射文件大幼      */     private final int mappedFileSize;     /**      * 最大重放新闻commitLog存储位置      */     private long maxPhysicOffset = -1;     private volatile long minLogicOffset = 0; 

ConsumeQueue文件结构,如图所示:

ConsumeQueue文件结构暗示图

根据topic和queueId结构文件,图中TopicA有两个队列0,1,那么TopicA和QueueId=0构成一个ConsumeQueue,TopicA和QueueId=1构成另一个ConsumeQueue。 根据消耗端的GroupName分组重试队列,倘若消耗端消耗战败,新闻将被发去重试队列中,比如图中的%RETRY%ConsumerGroupA。 根据消耗端的GroupName分组物化信队列,倘若消耗端消耗战败,并重试指定次数后,照样战败,则发去物化信队列,比如图中的%DLQ%ConsumerGroupA。

物化信队列清淡用于存放由于某栽因为无法传递的新闻,比如处理战败或者已经过期的新闻。

IndexFile是新闻索引文件,主要存储的是key和offset的对答有关。

IndexFile挑供了一栽能够经由过程key或时间区间查询新闻的手段。

文件名fileName所以创建时的时间戳命名的,固定的单个IndexFile文件大幼约为400M,一个IndexFile能够保存2000W个索引,IndexFile的底层存储设计为在文件体系中实现HashMap结构,故rocketmq的索引文件其底层实现为hash索引。

private static final Logger log = LoggerFactory.getLogger;     private static int hashSlotSize = 4;     private static int indexSize = 20;     private static int invalidIndex = 0;     private final int hashSlotNum;     private final int indexNum;     private final MappedFile mappedFile;     private final FileChannel fileChannel;     private final MappedByteBuffer mappedByteBuffer;     private final IndexHeader indexHeader; 

IndexFile的存储结构:

从上面的分析能够望出,RocketMQ采用的是同化型的存储结构,即为Broker单个实例下一切的队列共用一个日志数据文件针对Producer和Consumer别离采用了数据和索引片面相别离的存储结构,Producer发送新闻至Broker端,然后Broker端行使同步或者异步的手段对新闻刷盘持久化,保存至CommitLog中。

只要新闻被刷盘持久化至磁盘文件CommitLog中BOB综合登陆入口,那么Producer发送的新闻就不会丢失。

正由于这样,Consumer也就肯定有机会去消耗这条新闻。当无法拉取到新闻后,能够等下一次新闻拉取,同时服务端也声援长轮询模式,倘若一个新闻拉取乞求未拉取到新闻,Broker批如期待30s的时间,只要这段时间内有新新闻到达,将直接返回给消耗端。这边,RocketMQ的详细做法是,行使Broker端的后台服务线程—ReputMessageService不息地分发乞求并异步构建ConsumeQueue数据。

Broker端收到新闻后,将新闻原首新闻保存在CommitLog文件对答的MappedFile中,然后异步刷新到磁盘

ReputMessageServie线程异步的将CommitLog中MappedFile中的新闻保存到ConsumerQueue和IndexFile中

ConsumerQueue和IndexFile只是原首文件的索引新闻

内存映射和数据刷盘

内存映射文件MappedFile经由过程AllocateMappedFileService创建 MappedFile的创建是典型的创造者-消耗者模型 MappedFileQueue调用getLastMappedFile获取MappedFile时,将乞求放入队列中 AllocateMappedFileService线程不息监听队列,BOB综合登陆入口队列有乞求时创建出MappedFile对象 末了将MappedFile对象预炎底层调用force手段和mlock手段。

异步刷盘:新闻被写入内存的PAGECACHE返回写成功状态当内存里的新闻量积累到肯定水平时联相符触发写磁盘操作迅速写入。吞吐量高当磁盘损坏时会丢失新闻 同步刷盘:新闻写入内存的PAGECACHE后立刻报告刷盘线程刷盘然后期待刷盘完善刷盘线程实走完善后唤醒期待的线程给行使返回新闻写成功的状态。吞吐量矮但不会造成新闻丢失。

producer发送给broker的新闻保存在MappedFile中然后经由过程刷盘机制同步到磁盘中。

刷盘分为同步刷盘和异步刷盘。

异步刷盘后台线程按一准时间阻隔实走。

同步刷盘也是创造者-消耗者模型。broker保存新闻到MappedFile后创建GroupCommitRequest乞求放入列外并壅塞期待。后台线程从列外中获取乞求并刷新磁盘成功刷盘后报告期待线程。

RocketMQ文件存储模型层次结构

文件存储模型层次结构图

RocketMQ文件存储模型层次结构如上图所示根据类别和作用从概念模型上大致能够划分为5层下面将从各个层次别离进走分析和阐述:

RocketMQ营业处理器层:Broker端对新闻进走读取和写入的营业逻辑入口比如前置的检查和校验步骤、构造MessageExtBrokerInner对象、decode逆序列化、构造Response返回对象等;

RocketMQ数据存储组件层;该层主要是RocketMQ的存储中央类—DefaultMessageStore其为RocketMQ新闻数据文件的访问入口经由过程该类的“putMessage等;

RocketMQ存储逻辑对象层:该层主要包含了RocketMQ数据文件存储直接有关的三个模型类IndexFile、ConsumerQueue和CommitLog。IndexFile为索引数据文件挑供访问服务ConsumerQueue为逻辑新闻队列挑供访问服务CommitLog则为新闻存储的日志数据文件挑供访问服务。这三个模型类也是构成了RocketMQ存储层的集体结构;

封装的文件内存映射层:RocketMQ主要采用JDKNIO中的MappedByteBuffer和FileChannel两栽手段完善数据文件的读写。其中采用MappedByteBuffer这栽内存映射磁盘文件的手段完善对大文件的读写在RocketMQ中将该类封装成MappedFile类。这边局限的题目在上面已经讲过;对于每类大文件;

磁盘存储层:主要指的是安放RocketMQ服务器所用的磁盘。这边必要考虑分别磁盘类型对挨次写/随机读操作带的影响;

文件存储的高可用

联相符个topic上的数据会分成多个queue分布在分别的broker上而且每个queue都有副本机制。

RocketMQ的主从同步机制如下:

1.最先启动Master并在指定端口监听;

2.客户端启动主动连接Master竖立TCP连接;

3.客户端以每隔5s的阻隔时间向服务端拉取新闻倘若是第一次拉取的话先获取本地commitlog文件中最大的偏移量以该偏移量向服务端拉取新闻;

4.服务端解析乞求并返回一批数据给客户端;

5.客户端收到一批新闻后将新闻写入本地commitlog文件中然后向Master汇报拉取进度并更新下一次待拉取偏移量;

6.然后重复第3步;

文件存储的优化技术

RocketMQ存储层采用的几项优化技术方案在肯定水平上能够缩短PageCache的弱点带的影响主要包括内存预分配文件预炎和mlock体系调用。

在新闻写入过程中CommitLog会先从MappedFileQueue队列中获取一个MappedFile倘若异国就新建一个。

RocketMQ中预分配MappedFile的设计专门神奇下次获取时候直接返回就能够不必期待MappedFile创建分配所产生的时间延长。

mlock体系调用:其能够将进程行使的片面或者通盘的地址空间锁定在物理内存中防止其被交换到swap空间。对于RocketMQ这栽的高吞吐量的分布式新闻队列说谋求的是新闻读写矮延长那么肯定期待尽能够地多行使物理内存挑高数据读写访问的操作效率。

?RocketMQ的做法是在做Mmap内存映射的同时进走madvise体系调用主意是使OS做一次内存映射后对答的文件数据尽能够多的预添载至内存中从而达到内存预炎的成果。

本文转载自微信公多号「幼汪哥写代码」能够经由过程以下二维码关注。转载本文请有关幼汪哥写代码公多号。

聊聊iSCSI存储制定的发展简史 在Kubernetes中手动恢复Rook存储集群 企业的六栽数据存储相符规性策略 分解式存储的详细指南 DASNASSAN三栽存储技术比较
回到顶部

Powered by BOB(中国)官方入口-BOB体育娱乐平台 @2018 RSS地图 HTML地图