一种写入batch group串行化逻辑的优化方法

文档序号:189819 发布日期:2021-11-02 浏览:14次 >En<

阅读说明:本技术 一种写入batch group串行化逻辑的优化方法 (Optimization method for writing in batch group serialization logic ) 是由 刘梦真 于 2021-07-26 设计创作,主要内容包括:本发明涉及数据库领域,具体提供了一种写入batch group串行化逻辑的优化方法,每个batch使用独立的线程,基于滑动窗口机制来实现WAL的并发写入,多次并发访问小IO,维护一个WAL目录,每个batch对应生成一个单独的小log文件。与现有技术相比,本发明优化了RocksDB中WAL写入时batch group串行化逻辑导致的batch写入性能瓶颈问题,不再使用RocksDB内部组提交机制,而是基于滑动窗口机制支持实现batch并发写入WAL,可以通过设置窗口大小来控制并发程度,将一次大IO转换为并发访问小IO。充分利用了SSD的高读写速度和具有并发特性的性能优势,很大程度上提升了存储引擎的写性能。(The invention relates to the field of databases, and particularly provides an optimization method for writing in batch group serialization logic. Compared with the prior art, the method optimizes the bottleneck problem of batch write performance caused by batch group serialization logic during WAL write in the RocksDB, does not use an internal group submission mechanism of the RocksDB any more, supports realization of concurrent write of batch in the WAL based on a sliding window mechanism, can control the concurrency degree by setting the window size, and converts one-time large IO into concurrent access small IO. The high read-write speed and the performance advantage with the concurrency characteristic of the SSD are fully utilized, and the write performance of the storage engine is improved to a great extent.)

一种写入batch group串行化逻辑的优化方法

技术领域

本发明涉及数据库领域,具体提供一种写入batch group串行化逻辑的优化方法。

背景技术

RocksDB是使用C++编写的持久化的、嵌入式的KV存储引擎,主要由MemTable、Immutable MemTable、SSTable和WAL组成。插入KV数据时,首先需要将数据写到WAL文件中,然后将其刷新到磁盘以保证数据的持久性和安全性。

如果每次提交事务都需要调用一次sync将日志刷入磁盘,那么事务提交将会很大程度上限制数据库的写入性能。可以考虑将好几个事务的提交合并成一次sync来做,从而提高数据库系统的TPS。所以在RocksDB内部,使用batch-commit机制来批量写入事务日志,这样就可以使用一个sync调用来同时提交多个事务。但由于WAL的写入需要保证不同batchgroup之间的顺序性,因此只能通过单线程进行写入。这种batch group串行化逻辑导致WAL写入成为RocksDB的batch写入性能的瓶颈点。

发明内容

本发明是针对上述现有技术的不足,提供一种实用性强的写入batch group串行化逻辑的优化方法。

本发明解决其技术问题所采用的技术方案是:

一种写入batch group串行化逻辑的优化方法,每个batch使用独立的线程,基于滑动窗口机制来实现WAL的并发写入,多次并发访问小IO,维护一个WAL目录,每个batch对应生成一个单独的小log文件。

进一步的,具体步骤如下:

S1、以WriteBatch对象为载体;

S2、每个写线程生成一个WriteThread::Write的实例;

S3、维护一个窗口,链表中的Writer对象可以被分为4类;

S4、链表中的每个Writer设置SequenceNumber的过程是串行的;

S5、窗口内的写线程开始并发写入WAL时,生成log之后需要判断前面的batch是否已经全部写入完成;

S6、完成WAL写入后开始写入MemTable;

S7、完成MemTable写入后,需要更新VersionSet中last_sequence_的值;

S8、Writer对象在完成MemTable写入之后退出。

进一步的,在步骤S1中,在数据库系统中,会涌入接连不断的写请求,每个写请求包含一条或者多条操作,将一条或者多条操作的记录封装到WriteBatch,RocksDB的每次写入都以一个WriteBatch对象为载体。

进一步的,在步骤S2中,每个写线程生成一个WriteThread::Write的实例,关联到对应的一个WriteBatch对象,将多个Writer对象用链表串起来,从而处理并发。

进一步的,在步骤S3中,维护一个窗口,链表中的Writer对象可以被分为4类:

(1)、开始写入事务日志,且已收到确认;

(2)、开始写入事务日志,但未收到确认;

(3)、尚未写入事务日志,但允许写入;

(4)、尚未写入事务日志,且不允许写入;

其中,类型(2)和类型(3)都位于窗口范围内;

窗口大小代表允许并发写入WAL的最大线程数,窗口在接收到确认序号后,才会移动窗口的左边界。

进一步的,在步骤S4中,每个Writer设置一个SequenceNumber,第一个进入队列的Writer的SequenceNumber等于当前VersionSet中的last_allocated_sequence_值,后续Writer的SequenceNumber则等于前一个Writer的SequenceNumber加上前一个Writer的batch中记录的数目;

为链表中的每个Writer设置SequenceNumber的过程是串行的。

进一步的,在步骤S5中,窗口内的写线程开始并发写入WAL时,生成log之后需要判断前面的batch是否已经全部写入完成:

当还有前面序号的batch未完成写入但已经有后面序号的batch完成写入的情况下,不会返回确认序号,并且也不会对后续的写入进行确认;此时,当前的log文件也不会刷入磁盘,而是进行缓存,只有当前序号的batch全部写入完成后,才会与累积在缓存中的log文件一起进行刷盘操作,更新SequenceNumber,等于原本的SequenceNumber加上该batch的记录数目,然后将新的SequenceNumber返回。

进一步的,如果前面的batch已经全部写入完成,则当前batch生成的log文件直接刷入磁盘并且返回新的SequenceNumber,即原本的SequenceNumber加上该batch的记录数目。

进一步的,在步骤S6中,窗口接收到返回的SequenceNumber确认后,更新当前的last_allocated_sequence_为返回的SequenceNumber,并将窗口滑动至SequenceNumber的位置。得到确认后的Writer对象即为完成了WAL写入,开始写入MemTable。

进一步的,在步骤S7中,完成MemTable写入后,需要更新VersionSet中last_sequence_的值:

同last_allocated_sequence_一样,last_sequence_也需要保证其顺序性,因此在并发写入MemTable时,也需要维护一个滑动窗口,窗口大小代表了允许并发写入MemTable的最大线程数;

同并发写入WAL时维护的滑动窗口机制相同,窗口只有在接收到确认序号后,才会更新last_sequence_的值并移动窗口的左边界,当还有前面序号的batch未完成写入但已经有后面序号的batch完成写入的情况下,不会返回确认序号,并且也不会对后续的写入进行确认。

本发明的一种写入batch group串行化逻辑的优化方法和现有技术相比,具有以下突出的有益效果:

本发明优化了RocksDB中WAL写入时batch group串行化逻辑导致的batch写入性能瓶颈问题,不再使用RocksDB内部组提交机制,而是基于滑动窗口机制支持实现batch并发写入WAL,可以通过设置窗口大小来控制并发程度,将一次大IO转换为并发访问小IO。充分利用了SSD的高读写速度和具有并发特性的性能优势,很大程度上提升了存储引擎的写性能。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

附图1是本发明中RocksDB内部的batch-commit机制的流程图;

附图2是本发明基于滑动窗口机制实现WAL并发写入的流程图;

附图3是本发明中窗口接收确认序号后向前移动的示意图。

具体实施方式

为了使本技术领域的人员更好的理解本发明的方案,下面结合具体的实施方式对本发明作进一步的详细说明。显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例都属于本发明保护的范围。

下面给出一个最佳实施例:

如图1-3所示,本实施例中的一种写入batch group串行化逻辑的优化方法,该方法放弃使用RocksDB内部的batch-commit机制,不再批量写入事务日志,而是每个batch使用独立的线程,基于滑动窗口机制来实现WAL的并发写入,以多次并发访问小IO取代一次大IO。同时,写事务日志不再使用追加的方式。取而代之的是,维护一个WAL目录,每个batch对应生成一个单独的小log文件。

具体的实现过程如下:

S1、以WriteBatch对象为载体:

在数据库系统中,会涌入接连不断的写请求。每个写请求可以包含一条或者多条的操作,将一条或者多条操作的记录封装到WriteBatch,RocksDB的每次写入都以一个WriteBatch对象为载体。

S2、每个写线程生成一个WriteThread::Write的实例:

每个写线程生成一个WriteThread::Write的实例,关联到对应的一个WriteBatch对象。将多个Writer对象用链表串起来,从而处理并发。

S3、维护一个窗口,链表中的Writer对象可以被分为4类:

维护一个窗口,链表中的Writer对象可以被分为4类:(1)开始写入事务日志,且已收到确认;(2)开始写入事务日志,但未收到确认;(3)尚未写入事务日志,但允许写入;(4)尚未写入事务日志,且不允许写入。其中类型(2)和(3)都位于窗口范围内。窗口大小代表了允许并发写入WAL的最大线程数。窗口在接收到确认序号后,才会移动窗口的左边界。

S4、链表中的每个Writer设置SequenceNumber的过程是串行的:

每个Writer设置一个SequenceNumber,第一个进入队列的Writer的SequenceNumber等于当前VersionSet中的last_allocated_sequence_值,后续Writer的SequenceNumber则等于前一个Writer的SequenceNumber加上前一个Writer的batch中记录的数目。为链表中的每个Writer设置SequenceNumber的过程是串行的。

S5、窗口内的写线程开始并发写入WAL时,生成log之后需要判断前面的batch是否已经全部写入完成:

当还有前面序号的batch未完成写入但已经有后面序号的batch完成写入的情况下,不会返回确认序号,并且也不会对后续的写入进行确认。此时当前的log文件也不会刷入磁盘,而是进行缓存。

只有当前面序号的batch全部写入完成后,才会与累积在缓存中的log文件一起进行刷盘操作,更新SequenceNumber,等于原本的SequenceNumber加上该batch的记录数目,然后将新的SequenceNumber返回。

如果前面的batch已经全部写入完成,则当前batch生成的log文件直接刷入磁盘并且返回新的SequenceNumber,即原本的SequenceNumber加上该batch的记录数目。

S6、完成WAL写入后开始写入MemTable:

窗口接收到返回的SequenceNumber确认后,更新当前的last_allocated_sequence_为返回的SequenceNumber,并将窗口滑动至SequenceNumber的位置。得到确认后(即滑出窗口外)的Writer对象即为完成了WAL写入,开始写入MemTable。

S7、完成MemTable写入后,需要更新VersionSet中last_sequence_的值:

同last_allocated_sequence_一样,last_sequence_也需要保证其顺序性。因此在并发写入MemTable时,也需要维护一个滑动窗口,窗口大小代表了允许并发写入MemTable的最大线程数。同并发写入WAL时维护的滑动窗口机制相同,窗口只有在接收到确认序号后,才会更新last_sequence_的值并移动窗口的左边界。当还有前面序号的batch未完成写入但已经有后面序号的batch完成写入的情况下,不会返回确认序号,并且也不会对后续的写入进行确认。

S8、Writer对象在完成MemTable写入之后退出。

上述具体的实施方式仅是本发明具体的个案,本发明的专利保护范围包括但不限于上述具体的实施方式,任何符合本发明的一种监控告警方法权利要求书的且任何所述技术领域普通技术人员对其做出的适当变化或者替换,皆应落入本发明的专利保护范围。

尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。

8页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:一种同时记录CAN协议数据与Modbus协议数据的数据记录方法

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!

技术分类