海量分布式数据库存储单元的利记博彩app【专利摘要】本发明提供一种海量分布式数据库存储单元,该存储单元从下到上划分为三个层次,即:数据存储层、数据抽象层、数据应用层;同时还设有元数据,通过管理元数据将数据块组织起来。数据存储层用于管理最基本的数据块;数据抽象层用于对数据块内数据记录进行排序和基于日志的数据修改;1)数据应用层通过调用不同的排序函数将排序规则传入数据抽象层,使得数据抽象层能够对数据块和日志块内的记录或指针排序;2)数据应用层通过定义的合并函数实现对数据的增加、删除、修改操作;3)负责将底层的所有数据块或日志块建立索引,将这些数据块或日志块串联起来,并提供数据检索入口;元数据是数据块和日志块的索引。本发明实现了高效存储。【专利说明】海量分布式数据库存储单元
技术领域:
[0001]本发明涉及一种数据存储结构,尤其是一种数据库存储单元的结构。【
背景技术:
】[0002]当前计算机中的数据存储介质主要有硬盘、SSD、FLASH等。结合存储容量、1(输入输出)性能、存储成本等因素综合考虑,硬盘是性价比最尚的存储介质;硬盘具有顺序访冋性能良好、随机访问性能低下的特点。[0003]结合1操作耗时公式:T=C+S/M,其中T为1操作耗时,C为磁盘平均寻道时间,S为数据大小,M为磁盘带宽。如果需要访问的数据较小,那么在整个访问时间中,磁头寻道时间所占据的比例就很高,若要在访问小文件场景下提高存储系统性能,则必须对数据存储逻辑进行优化,以进一步减少磁盘寻道时间C。【
发明内容】[0004]本发明的目的是克服现有技术中存在的不足,提供一种支持大容量、结构化数据、有序/无序存储、高1吞吐率的海量分布式数据库存储单元。鉴于该存储单元所具有的特性,可以在此基础上进一步扩展出分布式系统等高级应用,并由该存储单元为上层应用提供最基本的数据安全、高效存储等保证。本发明采用的技术方案是:一种海量分布式数据库存储单元,该存储单元从下到上划分为三个层次,即:数据存储层、数据抽象层、数据应用层;同时还设有元数据,通过管理元数据将数据块组织起来。[0005]数据存储层用于管理最基本的数据块;数据块中数据的基本单位以及存储格式为键值对(key-value),key是键对象,value是值对象;一个键值对就是一条数据记录;数据块存放于磁盘中,内存中会设置一个块缓存区,当块缓存区中的数据达到预设的数据块大小时就将这些数据作为一个完整数据块存入磁盘中;存储单元通过数据块编号对数据块进行管理,在文件中写入数据时通过数据块编号和块内偏移来定位,即<bid,0ffSet>;bid为块编号,offset为块内偏移;数据抽象层用于对数据块内数据记录进行排序和基于日志的数据修改;对数据记录排序操作时,排序的规则由数据应用层提供;基于日志的数据修改包括:不将数据修改行为立即作用在数据上,而是将这些修改操作以日志的方式记录下来;修改操作相应的日志记录位于日志块中,日志块存于磁盘上;当需要对数据块内数据修改时,对日志块进行提交,即将日志块与所对应的数据块进行合并,从而完成真正的数据修改;数据应用层主要负责:I)数据应用层通过调用不同的排序函数将排序规则传入数据抽象层,使得数据抽象层能够对数据块和日志块内的记录或指针排序;2)数据应用层通过定义的合并函数实现对数据的增加、删除、修改操作;3)负责将底层的所有数据块或日志块建立索引,将这些数据块或日志块串联起来,并提供数据检索入口;元数据是数据块和日志块的索引,负责记录组成数据表格的块信息,具体记录了组成数据表格的块序号以及块中键值对的键对象Key的范围。[0006]进一步地,数据块内数据记录组织形式包括三种:第一种是未排序块,块内数据按照生成的数据记录依次向后追加,直至达到数据块设置的大小上限后写入磁盘;第二种是后排序块,针对的是块内数据记录的key定长、value定长;这种数据块先按照生成的数据记录的顺序存放,待数据块满时通过上层数据抽象层对块内所有数据记录进行排序并与入磁盘;第三种数据记录组织形式是先按照数据记录的生成顺序依次存放,同时在数据块的末端生成一个指针指向当下写入的数据记录的位置,当数据块写满时通过上层数据抽象层统一对数据块末端的所有数据指针进行排序,然后把数据块内数据写入磁盘。[0007]更进一步地,日志块内日志记录组织形式同数据块内数据记录组织形式。[0008]进一步地,日志块提交过程的第一步是将磁盘中已有的日志块读入内存;第二步是将所有的日志块与其对应的数据块数据合并,即依次读取日志块中的修改操作,把这些修改操作应用到数据块中;第三步是将合并后的数据块内数据进行排序,组合成新的数据块。[0009]进一步地,所述数据应用层负责将底层的所有数据块或日志块建立索引,将这些数据块或日志块串联起来,并提供数据检索入口,具体包括:对于每一条数据记录,其索引结构为〈Key,bid,offset〉,其中,Key为该条数据记录的键对象,bid为该条数据记录所在的块编号,offset为块内偏移;数据应用层抽象为数据表格,在数据表格上将所有的数据记录的索引按照key的大小划分为多个索引组;多个索引组构成一索引表;在每个索引组上再建立一级顶级索引,索引内容为〈KeyL,KeyH,Id>,KeyL是该索引组最小Key,KeyH是该索引组最大Key,Id是该索引组的编号。[0010]更进一步地,顶级索引和索引组缓存在内存中。[0011]进一步地,数据块中数据存储的基本结构包括两种:当键对象key和值对象value都为定长时,采用第一种结构,即键对象key后紧跟值对象value;否则,采用第二种结构,在键对象key和值对象value前添加记录长度L,通过记录长度L指定key和value的总长度。[0012]进一步地,数据块只支持三种操作:整块写入、整块读取、块内区域读取。[0013]本发明的优点在于:I)数据读写使用了多种缓存来提高读写效率。[0014]2)数据归并和修改都通过归并排序完成,全都是流式读写,将绝大部分的随机1操作转化为顺序1操作,提高磁盘读写的效率。[0015]3)数据存储容量大,可达10TB,数据条数几十亿。[0016]4)错误数据恢复迅速。【附图说明】[0017]图1为本发明的数据记录格式示意图。[0018]图2为本发明的存储单元层次结构示意图。[0019]图3A为本发明的块内数据记录组织形式之一示意图。[0020]图3B为本发明的块内数据记录组织形式之二示意图。[0021]图3C为本发明的块内数据记录组织形式之三示意图。[0022]图4为本发明的数据抽象层对块内数据修改操作示意图。[0023]图5为本发明的数据索引结构示意图。[0024]图6为本发明的元数据结构。【具体实施方式】[0025]下面结合具体附图和实施例对本发明作进一步说明。[0026]存储单元在存储信息时,数据的基本单位以及存储格式为键值对(key-value),key是键对象,value是值对象;一个键值对就是一条数据记录;存储模式用以描述数据记录中的key和value的属性。可以将具有相同存储模式的键值对的集合组成逻辑上的数据表格(table),可以对数据表格中的数据进行排序。[0027]数据的存储单元为数据块,一个数据块对应于磁盘上的一个文件,一个文件则可能包含一个或多个数据块;若干个数据块在逻辑上组成一个数据表格。每个键值对只会存储在一个数据块中并且是完整的。如果单机上配置了多块磁盘,则数据块随机散落在这些磁盘中,并可为每个数据块设定大小的上限为了提高存储的可扩展性,本例中定义了二种数据存储的基本结构,如图1所示:键对象key为定长数据或以O结束的字符串,值对象value为定长或变长。当键对象key和值对象value都为定长时,可采用第一种结构,即键对象key后紧跟值对象value;否则,采用第二种结构,在键对象key和值对象value前添加记录长度L,通过记录长度L指定key和value的总长度;根据数据的存储逻辑,将本方案中的存储单元从下到上划分为三个层次,即:数据存储层、数据抽象层、数据应用层;同时还设有元数据,通过管理元数据将数据块组织起来;如图2所示;其中,数据存储层用于管理最基本的数据块;数据抽象层主要负责对存储层的数据进行排序以及对块内数据进行基于日志的修改操作,该层只对外暴露数据记录的Key,如果需要对数据记录进行排序,则需要根据应用层定义的合并函数进行排序,否则数据记录在存储层的数据块中只能向后追加;数据应用层主要负责:I)数据应用层通过调用不同的排序函数将排序规则传入数据抽象层,使得数据抽象层能够对数据块和日志块内的记录(数据块内的数据记录和日志块内的日志记录)或指针排序;2)数据应用层通过定义的合并函数实现对数据的增加、删除、修改操作;3)负责将底层的所有数据块或日志块建立索引,将这些数据块或日志块串联起来,并提供数据检索入口;元数据负责记录组成数据表格的块信息,它具体记录了组成数据表格的块序号以及块中键值对的键对象Key的范围等;此处的块是指数据块和日志块。[0028](一)数据存储层;在实际的机器中,每一个数据块对应文件系统中的一个文件;如果该机器配置了多块磁盘,则会将数据块随机存放在某一个磁盘中。内存中会设置一个块缓存区,当缓存区中的数据达到预设的数据块大小时就将这些数据作为一个完整数据块存入磁盘中。[0029]存储单元通过数据块编号对数据块进行管理,如果获得多个数据块编号,就可以在逻辑上得到一个大文件。理论上,单个文件大小可以扩展到所有磁盘容量的总和。在文件中写入数据时通过数据块编号和块内偏移来定位,即〈bid,offset〉;bid为块编号,offset为块内偏移;为了提高底层存储的效率,数据块只支持三种操作:整块写入、整块读取、块内区域读取。且规定已经生成成功的数据块是不能再做修改。这样做可以降低数据出现错误时进行修复和保证数据一致性的难度,在并发场景下也不需要对数据块进行加锁,从而避免了传统的并发开销。另外,数据块的修改操作由于是通过对块内数据和修改日志合并实现的,从而避免了磁盘的随机写开销,可极大提高I/O性能;数据块内数据记录组织形式主要分为三种,如图3A、图3B、图3C所示:第一种是未排序块,块内数据按照生成的记录依次向后追加,直至达到数据块设置的大小上限后写入磁盘,如图3A所示;第二种是后排序块,针对的是块内数据记录的key定长、value定长且数据记录较短,这种数据块先按照生成的记录的顺序存放,待数据块满时通过上层数据抽象层对块内所有数据记录进行排序并写入磁盘,如图3B所示;第三种数据组织形式是块内数据记录较长且长度波动较大时,则先按照数据记录的生成顺序依次存放,同时在数据块的末端生成一个指针指向当下写入的数据记录的位置,当数据块写满时通过上层数据抽象层统一对数据块末端的所有数据指针进行排序,然后把数据块内数据写入磁盘;如图3C所示。图3A、图3B、图3C中,K1,K2,…Kn代表键对象,V1,V2,…Vn代表值对象;pointer-Kl."pointer-Kn代表数据指针;由于数据块内的数据记录长度有差异并且数据块大小是固定的,所以有可能出现数据块内剩余空间不足以存储下一条完整数据记录(一个键值对),因而留下一些“块内碎片空间”;但由于数据记录的大小本身就很小,所以这些“块内碎片空间”的影响很小,可以忽略。将数据存储层的数据块的操作封装成统一的操作接口提供给上层调用者即数据抽象层使用。[0030](二)数据抽象层;数据抽象层最主要的功能是对数据块内数据记录进行排序和基于日志的数据修改;如果是排序操作,则排序的规则由数据应用层提供;另外,输出抽象层还提供对数据块内数据基于日志的修改操作;基于日志的数据修改最基本的思想是不将数据修改行为立即作用在数据上,而是将这些修改操作以日志的方式记录下来。修改操作相应的日志记录位于日志块中;通过这种处理方式可以将对数据的随机操作在一定程度上转化为顺序操作,可以节省1开销。但是,如果数据操作日志还没有作用在数据上,此时读取块内数据就需要将块内数据与操作日志合并才能读取到正确的数据,这会造成数据读取开销的增大。[0031]日志块内日志记录组织形式与数据块内数据记录组织形式相同,也可以对日志记录进行增、删、改操作。内存中也设置有日志缓冲块,日志缓冲块写满后会被存入磁盘。通常情况下日志块内的操作数据是有序的,即遵循图3C中的模式;日志块只是在块内局部有序,当磁盘中写入了多个日志块后为避免日志块数量越来越多从而对数据读取造成严重影响,需要对日志块进行提交,即将日志块与所对应的数据块进行合并,从而完成真正的数据修改;日志块提交过程的第一步是将磁盘中已有的日志块读入内存,因为日志块内日志记录已有序,所以可以遍历出所有日志块内日志记录的范围;第二步是将所有的日志块与其对应的数据块数据合并,即依次读取日志块中的修改操作,把这些修改操作应用到数据块中,一条日志记录对应一个修改操作;第三步是将合并后的数据块内数据进行排序,组合成新的数据块。日志块提交过程如图4所示,图4中,1gl…1gn是日志块,datab1ckl…datablockm是数据块;(三)数据应用层;1)数据应用层通过调用不同的排序函数将排序规则传入数据抽象层,使得数据抽象层能够对数据块和日志块内的记录(数据块内的数据记录和日志块内的日志记录)或指针排序;例如,数据应用层调用按字典排序接口sortByDict1nary(),如果数据抽象层同一个数据块内有两条记录,它们的键分别为“aaba”和“aaab”,排序后,“aaab”这条记录将会在“aaba”这条记录之前;2)数据应用层通过定义的合并函数实现对数据的增加、删除、修改操作;例如,数据应用层调用deleteFiIe(keyI)函数,该函数将把删除键为keyI的记录的操作写入日志块中,此时并没有将删除操作应用到实际的数据上,只是在日志块中进行了记录,等到日志块提交的时候,该删除操作将会被执行。[0032]3)数据应用层负责将底层的所有数据块或日志块建立索引,将这些数据块或日志块串联起来,并提供数据检索入口;对于每一条数据记录,其索引结构为〈Key,bid,offset〉,其中,Key为该条数据记录的键对象,bid为该条数据记录所在的块编号,offset为块内偏移;数据应用层可以抽象为数据表格,在数据表格上将所有的数据记录的索引按照key的大小划分为多个索引组(indexgroups);—个索引组可能包括多个块;多个索引组构成一索引表;在每个索引组上再建立一级顶级索引,索引内容为〈KeyL,KeyH,Id>,KeyL是该索引组最小Key,KeyH是该索引组最大Key,Id是该索引组的编号;Key的大小此处是指Key顺序的尚低;当查询一条数据时,通过内存中的顶级索引可以查找到该条数据记录的索引位于哪个索引组,然后在内存中查找该索引组,如果未找到就将该索引组从磁盘加载到内存;从索引组读出该条数据记录的索引信息后即可到相应的数据块和对应的偏移位置读取数据。[0033]其中,顶级索引和索引组可以缓存在内存中,并通过一定的缓存更新策略进行实时替换。缓存更新策略可采用LRU(最近最少使用机制)。数据索引结构如图5所示。由于图5中画面限制,图5中的“off”代表为块内偏移offset,特此说明。Block表示数据块。[0034](四)元数据管理;所有的数据都是存储在数据块中,大量的数据块散落在不同的磁盘上,通过管理元数据将这些数据块组织起来。元数据其实就是数据块和日志块的索引,包含的信息有块编号、块中的数据记录范围,即<bid,Keyl/,Key#>;bid为块编号,Keyl/,Key!T分别为块(数据块或日志块)的最小key和最大key;将每一个数据块或日志块的key范围视作一个节点,即[Keyl/,KeyH7];所有的块节点信息可以组织成一颗排序树,通过对这颗排序树的查找即可得到相应的数据块或日志块。[0035]由于对块大小设置了上限,所以频繁的对块内数据进行增删改会出现数据块不断地被分拆;过多的数据块会对数据查询带来较高的开销,所以应该限制数据块的增长。例如,数据存储层会定期检查所有数据块内数据的大小,如果某个数据块内容纳的数据较小且与它相邻的数据块大小也未达到上限,则将这个数据块中的数据拆分到相邻的数据块中,以减少块数量。【主权项】1.一种海量分布式数据库存储单元,其特征在于:该存储单元从下到上划分为三个层次,即:数据存储层、数据抽象层、数据应用层;同时还设有元数据,通过管理元数据将数据块组织起来。2.如权利要求1所述的海量分布式数据库存储单元,其特征在于:数据存储层用于管理最基本的数据块;数据块中数据的基本单位以及存储格式为键值对(key-value),key是键对象,value是值对象;一个键值对就是一条数据记录;数据块存放于磁盘中,内存中会设置一个块缓存区,当块缓存区中的数据达到预设的数据块大小时就将这些数据作为一个完整数据块存入磁盘中;存储单元通过数据块编号对数据块进行管理,在文件中写入数据时通过数据块编号和块内偏移来定位,即〈bid,offset〉;bid为块编号,offset为块内偏移;数据抽象层用于对数据块内数据记录进行排序和基于日志的数据修改;对数据记录排序操作时,排序的规则由数据应用层提供;基于日志的数据修改包括:不将数据修改行为立即作用在数据上,而是将这些修改操作以日志的方式记录下来;修改操作相应的日志记录位于日志块中,日志块存于磁盘上;当需要对数据块内数据修改时,对日志块进行提交,即将日志块与所对应的数据块进行合并,从而完成真正的数据修改;数据应用层主要负责:I)数据应用层通过调用不同的排序函数将排序规则传入数据抽象层,使得数据抽象层能够对数据块和日志块内的记录或指针排序;2)数据应用层通过定义的合并函数实现对数据的增加、删除、修改操作;3)负责将底层的所有数据块或日志块建立索引,将这些数据块或日志块串联起来,并提供数据检索入口;元数据是数据块和日志块的索引,负责记录组成数据表格的块信息,具体记录了组成数据表格的块序号以及块中键值对的键对象Key的范围。3.如权利要求2所述的海量分布式数据库存储单元,其特征在于:数据块内数据记录组织形式包括三种:第一种是未排序块,块内数据按照生成的数据记录依次向后追加,直至达到数据块设置的大小上限后写入磁盘;第二种是后排序块,针对的是块内数据记录的key定长、value定长;这种数据块先按照生成的数据记录的顺序存放,待数据块满时通过上层数据抽象层对块内所有数据记录进行排序并与入磁盘;第三种数据记录组织形式是先按照数据记录的生成顺序依次存放,同时在数据块的末端生成一个指针指向当下写入的数据记录的位置,当数据块写满时通过上层数据抽象层统一对数据块末端的所有数据指针进行排序,然后把数据块内数据写入磁盘。4.如权利要求3所述的海量分布式数据库存储单元,其特征在于:日志块内日志记录组织形式同数据块内数据记录组织形式。5.如权利要求2所述的海量分布式数据库存储单元,其特征在于:日志块提交过程的第一步是将磁盘中已有的日志块读入内存;第二步是将所有的日志块与其对应的数据块数据合并,即依次读取日志块中的修改操作,把这些修改操作应用到数据块中;第三步是将合并后的数据块内数据进行排序,组合成新的数据块。6.如权利要求2所述的海量分布式数据库存储单元,其特征在于:所述数据应用层负责将底层的所有数据块或日志块建立索引,将这些数据块或日志块串联起来,并提供数据检索入口,具体包括:对于每一条数据记录,其索引结构为〈Key,bid,offset〉,其中,Key为该条数据记录的键对象,bid为该条数据记录所在的块编号,offset为块内偏移;数据应用层抽象为数据表格,在数据表格上将所有的数据记录的索引按照key的大小划分为多个索引组;多个索引组构成一索引表;在每个索引组上再建立一级顶级索引,索引内容为〈KeyL,KeyH,Id>,KeyL是该索引组最小Key,KeyH是该索引组最大Key,Id是该索引组的编号。7.如权利要求6所述的海量分布式数据库存储单元,其特征在于:顶级索引和索引组缓存在内存中。8.如权利要求2所述的海量分布式数据库存储单元,其特征在于:数据块中数据存储的基本结构包括两种:当键对象key和值对象value都为定长时,采用第一种结构,即键对象key后紧跟值对象value;否则,采用第二种结构,在键对象key和值对象value前添加记录长度L,通过记录长度L指定key和value的总长度。9.如权利要求2所述的海量分布式数据库存储单元,其特征在于:数据块只支持三种操作:整块写入、整块读取、块内区域读取。【文档编号】G06F17/30GK105912687SQ201610243341【公开日】2016年8月31日【申请日】2016年4月19日【发明人】王辉,刘斌,台宪青【申请人】江苏物联网研究发展中心