本发明涉及分布式数据库
技术领域:
:,具体提供一种分布式数据库事务数据存储优化的方法。
背景技术:
::cockroachdb(crdb)是一个基于googlespanner思想构建的开源分布式数据库系统,具有nosql对海量数据的存储管理能力,又保持了传统数据库支持的acid和sql等特性。cockroachdb的存储层rocksdb引擎采用lsm(日志结构树)的存储结构,写请求的数据先写入内存表中,内存表数据写满64mb(默认)之后会持久化到磁盘上的sst(sortedsequencetable-排序序列表)文件。磁盘上的sst文件以层次方式组织,并有后台线程进行逐层合并的操作。在cockroachdb的事务处理中,sql层每写一行数据都会在rocksdb存储中插入两条数据,即写意图数据和多版本数据,其中,写意图数据记录了当前事务相关的元数据信息,在事务结束时会进行delete清理。但是由于lsm结构的逐层合并过程,delete清理可能需要到最后一层才能确保从底层文件中删除写意图数据,从而占用大量不必要的存储空间,及写意图数据多次合并过程中产生的数据写放大问题。技术实现要素:本发明是针对上述现有技术的不足,提供一种实用性强的分布式数据库事务数据存储优化的方法。本发明解决其技术问题所采用的技术方案是:一种分布式数据库事务数据存储优化的方法,其特征在于,具有以下步骤:s1、增加半固化内存表;s2、半固化内存表由内存block与sst文件组成;s3、内存block数据合并执行compaction操作;s4、半固化内存表的内存block为空时,从存储引擎中移除该内存表;s5、半固化内存表设置一个最长生命周期时间阈值;s6、系统发生故障并重启后,根据wal恢复为只读内存表的数据;s7、半固化内存表对外提供与只读内存表相同的读接口;s8、收到读请求后,确保最新写入的数据优先被读取。进一步的,在步骤s1中,增加新的半固化内存表,在只读内存表需要持久化时,进行compaction处理后转换为半固化内存表,写意图数据驻留在内存中,多版本数据写入sst文件。进一步的,在步骤s2中,半固化内存表由内存block与sst文件组成,其中,内存block记录的是事务中写意图的数据,sst文件中记录的则是正常的多版本数据。进一步的,在步骤s3中,当有新的只读内存表进行flush操作时,会与所有半固化内存表中的内存block数据合并执行compaction操作,清理已经删除的写意图数据。进一步的,在步骤s4中,当半固化内存表的内存block为空时,则将半固化内存表中的sst文件移动到存储引擎的l0层,并从存储引擎中移除该内存表;同时修改manifest摘要文件,将sst文件加入到存储引擎实例中,移除对wal的引用,使得存储引擎在之后的操作中删除内存表关联的wal文件。进一步的,在步骤s5中,半固化内存表设置一个最长的生命周期时间阈值,当从只读内存表转换为半固化内存表后,会启动后台定时线程监测半固化内存表的存活时间;当存活时间超过阈值后,如果内存表中的内存block不为空,则强制删除内存中的写意图数据,移动sst文件到存储引擎l0层,从存储引擎中删除该内存表,相当于丢弃事务数据;内存表的生命周期时间阈值大于事务的超时时间,在存储引擎层丢弃写意图数据之后,根据事务隔离级别的不同,对sql层发送的清理操作可以不处理或返回错误。进一步的,在步骤s6中,当系统发生故障并重启后,存储引擎需要根据wal恢复为只读内存表的数据,再重新compaction后转换为半固化内存表,而故障前半固化内存表中的sst文件则直接删除。进一步的,在步骤s7中,半固化内存表对外提供与只读内存表相同的读接口,外部读写通过接口读取内存表中的内存block和sst文件数据。进一步的,在步骤s8中,当接收到读取请求后,存储引擎将按照活动内存表>只读内存表>半固化内存表>sst文件的顺序逐层处理,保持与数据写入的顺序一致。本发明的一种分布式数据库事务数据存储优化的方法和现有技术相比,具有以下突出的有益效果:1、本发明提出的方法将写意图事务数据驻留在内存中,并在事务结束或超时后,从内存中直接清理,减轻存储层压力,提升分布式数据库的整体性能。2、增加半固化内存表,将写意图数据驻留内存的同时,多版本数据持久化到sst文件,减少内存占用压力。3、增加的半固化内存表同样有关联的wal,在系统故障时由wal恢复数据,保证内存数据不丢失。4、半固化内存表采用与只读内存表相同的读接口,存储引擎客户端接口不用修改,完全兼容已有应用。附图说明为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。附图1是一种分布式数据库事务数据存储优化的方法中写请求处理流程图;附图2是一种分布式数据库事务数据存储优化的方法中读请求处理流程图。具体实施方式为了使本
技术领域:
:的人员更好的理解本发明的方案,下面结合具体的实施方式对本发明作进一步的详细说明。显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例都属于本发明保护的范围。下面给出一个最佳实施例:如图1-2所示,本实施例中的一种分布式数据库事务数据存储优化的方法,具有以下步骤:s1、增加半固化内存表:增加新的半固化内存表,在只读内存表需要持久化时,进行compaction处理后转换为半固化内存表,写意图数据驻留在内存中,多版本数据写入sst文件。s2、半固化内存表由内存block与sst文件组成:其中,内存block记录的是事务中写意图的数据,而sst文件中记录的则是正常的多版本数据,在保证写意图数据驻留内存的情况下,减少内存占用压力。s3、内存block数据合并执行compaction操作:当有新的只读内存表进行flush操作时,会与所有半固化内存表中的内存block数据合并执行compaction操作,清理已经删除的写意图数据。s4、半固化内存表的内存block为空时,从存储引擎中移除该内存表:当半固化内存表的内存block为空时,则将半固化内存表中的sst文件移动到存储引擎的l0层,并从存储引擎中移除该内存表。同时修改manifest摘要文件,将sst文件加入到存储引擎实例中。然后移除对wal(预写日志文件)的引用,使得存储引擎可以在之后的操作中删除内存表关联的wal文件。s5、半固化内存表设置一个最长生命周期时间阈值:半固化内存表可以设置一个最长的生命周期时间阈值,当从只读内存表转换为半固化内存表后,会启动后台定时线程监测半固化内存表的存活时间,当存话时间超过阈值后,如果内存表中的内存block依然不为空,则强制删除内存中的写意图数据,移动sst文件到存储引擎l0层,然后从存储引擎中删除该内存表,相当于丢弃事务数据。内存表的生命周期时间阈值应大于事务的超时时间,在存储引擎层丢弃了写意写意图数据之后,根据事务隔离级别的不同,对sql层发送的清理操作可以不处理或返回错误。s6、系统发生故障并重启后,根据wal恢复为只读内存表的数据:当系统发生故障并重启后,存储引擎首先根据wal恢复为“只读内存表”的数据,再重新compaction后转换为半固化内存表,保证内存中的数据不会丢失。而故障前“半固化内存表”中的sst文件则可以直接删除。s7、半固化内存表对外提供与只读内存表相同的读接口:半固化内存表对外提供与只读内存表相同的读接口,外部读写只能通过接口读取内存表中的内存block和sst文件数据。s8、收到读请求后,确保最新写入的数据优先被读取:当接收到读取请求后,存储引擎将按照“活动内存表->只读内存表->半固化内存表->sst文件”的顺序逐层处理,保持与数据写入的顺序一致,保证最新写入的数据优先被读取到。由于写意图事务数据只是随着事务生命周期而临时存在的,事务结束后写意图数据就可以丢弃。通过本发明提出的方法,可以将写意图数据驻留在内存直到事务结束或超时,从而减少磁盘持久化的数据量,优化了数据存储的性能。上述具体的实施方式仅是本发明具体的个案,本发明的专利保护范围包括但不限于上述具体的实施方式,任何符合本发明的一种分布式数据库事务数据存储优化的方法权利要求书的且任何所述
技术领域:
:普通技术人员对其做出的适当变化或者替换,皆应落入本发明的专利保护范围。尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。当前第1页1 2 3 当前第1页1 2 3 
技术特征:1.一种分布式数据库事务数据存储优化的方法,其特征在于,具有以下步骤:
s1、增加半固化内存表;
s2、半固化内存表由内存block与sst文件组成;
s3、内存block数据合并执行compaction操作;
s4、半固化内存表的内存block为空时,从存储引擎中移除该内存表;
s5、半固化内存表设置一个最长生命周期时间阈值;
s6、系统发生故障并重启后,根据wal恢复为只读内存表的数据;
s7、半固化内存表对外提供与只读内存表相同的读接口;
s8、收到读请求后,确保最新写入的数据优先被读取。
2.根据权利要求1所述的一种分布式数据库事务数据存储优化的方法,其特征在于,在步骤s1中,增加新的半固化内存表,在只读内存表需要持久化时,进行compaction处理后转换为半固化内存表,写意图数据驻留在内存中,多版本数据写入sst文件。
3.根据权利要求1所述的一种分布式数据库事务数据存储优化的方法,其特征在于,在步骤s2中,半固化内存表由内存block与sst文件组成,其中,内存block记录的是事务中写意图的数据,sst文件中记录的则是正常的多版本数据。
4.根据权利要求1所述的一种分布式数据库事务数据存储优化的方法,其特征在于,在步骤s3中,当有新的只读内存表进行flush操作时,会与所有半固化内存表中的内存block数据合并执行compaction操作,清理已经删除的写意图数据。
5.根据权利要求1所述的一种分布式数据库事务数据存储优化的方法,其特征在于,在步骤s4中,当半固化内存表的内存block为空时,则将半固化内存表中的sst文件移动到存储引擎的l0层,并从存储引擎中移除该内存表;
同时修改manifest摘要文件,将sst文件加入到存储引擎实例中,移除对wal的引用,使得存储引擎在之后的操作中删除内存表关联的wal文件。
6.根据权利要求1所述的一种分布式数据库事务数据存储优化的方法,其特征在于,在步骤s5中,半固化内存表设置一个最长的生命周期时间阈值,当从只读内存表转换为半固化内存表后,会启动后台定时线程监测半固化内存表的存活时间;
当存活时间超过阈值后,如果内存表中的内存block不为空,则强制删除内存中的写意图数据,移动sst文件到存储引擎l0层,从存储引擎中删除该内存表,相当于丢弃事务数据;
内存表的生命周期时间阈值大于事务的超时时间,在存储引擎层丢弃写意图数据之后,根据事务隔离级别的不同,对sql层发送的清理操作可以不处理或返回错误。
7.根据权利要求1所述的一种分布式数据库事务数据存储优化的方法,其特征在于,在步骤s6中,当系统发生故障并重启后,存储引擎需要根据wal恢复为只读内存表的数据,再重新compaction后转换为半固化内存表,而故障前半固化内存表中的sst文件则直接删除。
8.根据权利要求1所述的一种分布式数据库事务数据存储优化的方法,其特征在于,在步骤s7中,半固化内存表对外提供与只读内存表相同的读接口,外部读写通过接口读取内存表中的内存block和sst文件数据。
9.根据权利要求1所述的一种分布式数据库事务数据存储优化的方法,其特征在于,在步骤s8中,当接收到读取请求后,存储引擎将按照活动内存表>只读内存表>半固化内存表>sst文件的顺序逐层处理,保持与数据写入的顺序一致。
技术总结本发明涉及分布式数据库技术领域,具体提供了一种分布式数据库事务数据存储优化的方法,具有以下步骤:S1、增加半固化内存表;S2、半固化内存表由内存Block与SST文件组成;S3、内存Block数据合并执行Compaction操作;S4、半固化内存表的内存Block为空时,从存储引擎中移除该内存表;S5、半固化内存表设置一个最长生命周期时间阈值;S6、系统发生故障并重启后,根据WAL恢复为只读内存表的数据;S7、半固化内存表对外提供与只读内存表相同的读接口;S8、收到读请求后,确保最新写入的数据优先被读取。与现有技术相比,本发明可以将写意图数据驻留在内存直到事务结束或超时,从而减少磁盘持久化的数据量,优化了数据存储的性能。
技术研发人员:贾德星;孙思清;张晖;刘佳星;张炜刚
受保护的技术使用者:浪潮云信息技术股份公司
技术研发日:2020.12.09
技术公布日:2021.03.12