一种分布式数据存储架构及数据存储方法和数据查询方法与流程

文档序号:12598044阅读:251来源:国知局
本发明涉及数据存储计算领域,特别涉及一种分布式数据存储架构及数据存储方法和数据查询方法。
背景技术
::传统的行式数据库,是按照行存储的。行式存储一般用在关系数据库中,其优势在于处理OLTP型业务。而列式数据库恰恰相反,列式数据库的数据是按照列存储,每一列单独存放,数据访问某些列时,只需要访问查询涉及的列,大大降低了系统的数据传输量。而且,由于数据类型一致,数据特征相似,极大方便压缩,提到了压缩率。行式数据库擅长随机读和更新操作,列式数据库则更擅长大批量数据量查询。而行列混合存储兼顾了行存储和列存储的优点。行列存储中一个重要的问题,就是如何索引数据,以达到数据快速定位。以及如何在有索引情况下,降低内存使用量。现有技术技术一方案:CN201310296167数据库系统的行列混合存储方法。这个方法是行列混合存储是以表为单位。也就是说,一个表要么整个表都是行存储,要么整个表都是列存储。该方法在数据库系统的存储层分别设立一个行存储引擎和一个列存储引擎,然后由访问接口层将两者封装起来,对列表进行元组物化,对行表进行投影,向查询引擎提供统一的数据访问接口,从而隐藏存储差别,实现查询处理的统一化。行列混合存储查询流程。根据创建表时的存储模型,在查询语句的解析阶段,获取表的存储模式;结合查询分析的相关信息生成<文件ID,存储模式,属性列表,选择条件列表>四个访问参数。执行引擎在访问数据时将访问参数传给存储引擎,存储引擎根据参数选择适当的方法读取数据并作选择、投影处理后返回数据。现有技术技术一方案缺点:由于一个表要么是整个表都是行存储,要么整个表都是列存储。已定的存储方案并不能够很好的应对对表的更新后的存储。比如,原定于适应于行存储的表,由于表的更新,列存储更加适合。此时,表需要重新存储。表重新存储代价大。现有技术技术二方案:Hyper数据库管理系统提出数据组织方式——《DataBlocks:HybridOLTPandOLAPonCompressedStorageusingbothVectorizationandCompilation》。其数据组织结构头部中,设定了数据相对部分的偏移量。分别是SMA、字典、数据压缩策略,和字符数据的偏移量。Hyper提出的存储结构包括:tuplecount、smaoffset、dictoffset、dataoffset、stringoffset。tuplecount是该存储单元中的存储的单列数据的行数,smaoffset、dictoffset、dataoffset、stringoffset分别是SMA、字典、非字符类型数据、字符类型数据对应于存储单元起始位置的偏移量,compression是数据的压缩方式。现在技术二方案缺点:其数据组织结构头部中,设定了数据相对部分的偏移量。分别是SMA、字典、数据压缩策略,和字符数据的偏移量。这么设定,限定了接下来数据的组织方式必须有SMA等。虽然这些字段只是偏移量,如果我们不用字典,可以通过将字典偏移量字段设置为一个无效值。但是,如此一来,字典偏移量字段本身占用了额外空间。其数据的索引采用的是SMA作为自己的索引。其优点是在数据值小的情况下,能够很好的索引到所需要的数据。但是数据值相对较大情况下,落在同一个索引区间的数据多,那么索引范围扩大,索引准确度降低。以查找998这个数据为例,和998所属的同一个索引区间的值理论有2^8个,准确度很低。除此之外,当源数据倾斜严重的情况下,如果数据没有排序,即使是有SMA作索引,依然需要遍历整个列。技术实现要素:本发明提供一种分布式数据存储架构及数据存储方法和数据查询方法,本发明主要解决的问题是分布式环境下,数据库中数据索引和存储问题。达到的效果是:高效索引,即使在数据偏移情况下,通过值读取位置时间复杂度是O(logN),通过数据的位置取值的时间复杂度是O(1)。一种分布式数据存储架构,包括:主控节点:用于建立数据存储单元Block到所在的物理机器的映射关系、统计全局负载情况以及生成数据存储单元Block的ID;数据导入管理器:用于对外部数据进行缓冲,将外部数据按照数据值排序,生成索引Groupkey和数据,然后生成数据存储单元Block存储索引Groupkey和数据,最后导入数据存储单元Block到存储节点;存储节点:存储数据存储单元Block,对查询者提供查询功能;存储节点包括子元数据管理器、数据存储单元Block、数据读取器模块;子元数据管理器:用于维护存储节点内部由数据库名、表名、列名唯一确定的列到数据存储单元Block的映射、维护数据存储单元Block的生命周期;数据存储单元Block:用于存储索引Groupkey和数据;数据读取器模块:用于按照存储的索引Groupkey提供范围查询和等值查询接口,为外部提供了数据访问,具有指向真实数据的指针。本发明利用数据导入管理器导入外部数据,并生成数据存储单元Block和元数据,数据存储单元Block存储了索引Groupkey和数据;利用存储节点存储数据存储单元Block;利用存储节的子元数据管理器维护存储节点内部的库表列到数据存储单元Block的映射;利用主控节点建立数据存储单元Block到所在的物理机器的映射关系。通过以上部件构建起一个分布式数据存储架构。其中存储节点一般为多个,每个存储节点接受数据导入管理器数据,受到主控节点管制,每个存储节点有包含子元数据管理器、数据读取器以及多个数据存储单元Block,存储数据单元Block可以提供范围和等值查询。数据存储单元Block按照值的大小进行存储,且每个范围都标有对应的数据存储单元Block的ID,这样能大幅提高查询时间,达到高效索引的目的。优选的,所述主控节点的元数据组织为由数据库名、表名、列名唯一确定的列以及每个存储节点存储的数据中包含的列的列值范围到存储节点的地址的映射,主控节点的元数据组织的结构为:<数据库名、表名字,列名、列值范围、存储节点的地址>。存储节点的元数据组织为数据库名、表名、列名唯一确定的列到数据存储单元Block的映射,存储节点的元数据组织的结构为:<数据库名、表名字、列名、列值范围、数据存储单元Block的ID>。优选的,数据存储单元Block存储数据的方式为:以索引Groupkey加数据的方式存储在数据存储单元Block当中,一个数据存储单元Block包含一张表的若干列或全部的列,每张表的所有的列都会在数据存储单元Block中存储,在数据导入管理器生成这个数据存储单元Block的时候,生成这个数据存储单元Block对应的元数据,在存储节点存储数据存储单元Block的时候,记录元数据到子元数据管理器中。数据存储单元Block的头部结构分为定长结构和变长两个部分:定长部分包括:block_id、begin_rowid、rows。block_id:表示数据存储单元block的编号,由数据导入管理器生成,全局唯一:每个数据存储单元Block对应着一个全局唯一的block_id;begin_rowid:指明了这个数据存储单元Block中所存储的数据的起始的rowid。rows:表明这个数据存储单元Block中一共有多少行的数据。变长部分包括:column_offset。column_offset:column_offset为一个数组,第i个值表示这个数据存储单元Block中的第i个列的物理位置相对于数据存储单元Block起始头部的偏移量。数据存储单元Block中有的库表列是由外部元数据所描述的,因为如果每个数据存储单元Block中都存储一份会浪费空间;因此,在存储节点生成这个数据存储单元Block的时候,会生成这个数据存储单元Block对应的库名、表名和列名数据信息注册到子元数据管理器中。所述column_offset的内部逻辑结构包括column_type部分和其余约定部分,column_type部分表示头部,其余约定部分是根据column_type部分由使用人员根据具体的需求具体约定。所述column_type的数据组织方式是以索引Groupkey方式组织或者是以键值对方式组以及其对应的压缩方式,所述压缩方式是字节压缩或者是位压缩;一般的,column_type目前设定为4个字节,前一个字节表示是索引Groupkey或者其他压缩方式。第二个字节标识是字节压缩还是位压缩。第三个和第四个字节为保留字节。今后如果业务需求变化,column_type字节大小可以重新设置。该方案中的方式列举出以索引Groupkey方式组织数据并配合以字节压缩或者位压缩。索引Groupkey:是一种在内存分布式列数据库中的数据组织方式,其采用字典压缩对每列内容进行压缩,采用索引向量index对字典向量中某个值对应在position向量中的范围进行界定,采用位置向量position存储字典向量对应的行号rowid的集合。同时,有一个行表向量rowtable,行表向量rowtable是维持行关系的向量,行表向量rowtable里面存储的是元素值在字典向量中的下标;结合索引Groupkey的特性,对于索引向量index,存储对应的位压缩或者字节压缩后的值;对于位置向量position,我们只存储其值相对于begin_rowid的偏移量;对于行表向量rowtable,其每一行与原始表一一对应,行表向量rowtable中的值是字典的下标,索引向量index、位置向量position、行表向量rowtable采用位压缩或者字节压缩。例如:自定义的column头部信息:index_width:index字段位宽或者字节宽度;position_width:position字段位宽或者字节宽度;rowtable_width:rowtable字段位宽或者字节宽度。数据体:dictionary:Groupkey的字典向量;index:Groupkey的索引向量;position:Groupkey的位置向量;rowtable:行表向量。其中,如果这个列是字符串类型,对于字典向量,则将每个字符串的值拼接为一个大的字符串(dictionary_string),同时配合以每个字符串在大字符串中的域值向量(dictionary_region)的方式存储。根据一种分布式数据存储架构的数据存储方法,S1、主控节点根据每张表的列的宽度和有多少列决定每个数据存储单元Block中表的行数和列数,以及所要发往的存储节点的IP,将这些信息告诉数据导入管理器;S2、数据导入管理器将外部数据源读取上来的数据排序,生成数据字典,确定索引向量index、位置向量position、行表向量rowtable的压缩的位宽或者字节宽度;S3、数据导入管理器根据压缩的位宽或者字节宽度,生成压缩的索引向量index、位置向量position、行表向量rowtable,同时统计元数据。根据数据存储单元Block的内部设计,依次在数据存储单元Block内填入头部信息和上述数据体;S4、数据导入管理器将一个数据存储单元Block的数据和数据存储单元Block对应的元数据信息发送给存储节点,同时发送一份对应的元数据信息给主控节点;S5、存储节点存储数据导入管理器发送的数据存储单元Block,将对应的元数据信息记录到子元数据管理器。如果采用的运行时库提供了归还操作系统未使用的内存的接口,最后调用相应接口,释放多余内存;S6、主控节点将导入管理器发送的对应的元数据记录下来。根据所述的一种分布式数据存储架构的数据查询方法,查找数据库ID为db_id,表名为table_name,列名为col_name的查找数据存储单元Block的过程是:D1、访问主控节点,发送所要访问的数据的库表列信息,以及包含对应列的范围的消息给主控节点,查询包括以下两种:通过值查询rowid:通过给定值范围或者定值查询匹配的rowid;通过rowid查询值:通过给定rowid集合查询每个rowid对应的值;D2、主控节点返回这次查询请求涉及到的存储节点的IP地址;D3、查询客户端与对应的存储节点建立连接,并向对应的存储节点发送对应的查询请求;D4、存储节点收到查询请求后,访问子元数据管理器,得到数据存储单元Block的指针。然后,存储节点通过数据读取器读取到指定数据;D5、存储节点返回结果给查询客户端,查询客户端收到了所有的数据后,本次查询完毕。对于值交叠的情况,查询客户端连接的存储节点将是所有覆盖了结果集的存储节点。如图8所示:查询客户端需要查询某列值小于4的对应rowid集合,其将需要与0、1、4号存储节点连接(存储节点中,尖括号中指定了该存储节点上面的值范围,表格中左边为排序了的值,右边是rowid)。这样,当值比较分散情况下,连接数将会上升。值得说明的是,由于我们的原始数据经过了排序。查找值的过程的时间复杂度是O(logN)。其次,在rowtable中,rowtable数组中的每一个元素值和原表中的相应行是一一对应的。rowtable就是原表,不过存储的不是原表实际值,而是存储了原表实际值对应于字典的下标,也就是字典的key。通过数据的rowid来查询值的过程是O(1)。本发明技术方案带来的有益效果:实现分布式的索引和数据组织方式。系统支持横向拓展,能够满足未来新的数据组织方式,快速数据读取,高内存使用率,低内存消耗。设定的数据格式具有扩展性,新的索引和数据存储方法只需要修改数据存储单元Block的column_type字段,并在数据存储单元Block的column内部自定义自己的数据存储协议即可。数据在数据存储单元Block内部有序,通过数据值查询数据的rowid的时间复杂度是O(logN)。通过rowid查找到指定的时间复杂度是O(1)。对数据倾斜的情况,时间复杂度上不变。数据存储单元Block将索引Groupkey的字典、index等向量通过拼接方式存储在内存里面的连续区域,而不是由指针分散存储。如果索引Groupkey的几个向量各自由一片连续区域存储,一般运行时库(比如Glibc)会给每个向量分配多余内存空间,造成了内部碎片。将这些向量拼接在一起达到了内存紧凑的目的,在一定层度上,降低了内存碎片。将TPC-H(版本2.17.1)的200G数据集导入到本系统中,采用Groupkey作为索引和文中提到的位压缩的方式,索引和数据的总空间是原始数据的0.9倍。也就是占用了180G左右的内存。而传统数据库索引,例如Mysql和Oracle数据库的索引(默认的B+树索引),光索引就是原始数据的3倍以上。本方法大大降低了内存的消耗。附图说明图1是本发明的整体架构示意图。图2是表横切和纵切示意图。图3是头部结构设计示意图。图4是column内部逻辑结构示意图。图5是字符串类型数据存储示意图。图6是字符串类型字典存储结构示意图。图7是数据查询流程图。图8是值交叠情况下查询数据查询流程图。具体实施方式下面结合实施例及附图,对本发明作进一步地的详细说明,但本发明的实施方式不限于此。实施例1:一种分布式数据存储架构,如图1所示,包括:主控节点:用于建立数据存储单元Block到所在的物理机器的映射关系、统计全局负载情况以及生成数据存储单元Block的ID;数据导入管理器:用于对外部数据进行缓冲,将外部数据按照数据值排序,生成索引Groupkey和数据,然后生成数据存储单元Block存储索引Groupkey和数据,最后导入数据存储单元Block到存储节点;存储节点:存储数据存储单元Block,对查询者提供查询功能;存储节点包括子元数据管理器、数据存储单元Block、数据读取器模块;子元数据管理器:用于维护存储节点内部由数据库名、表名、列名唯一确定的列到数据存储单元Block的映射、维护数据存储单元Block的生命周期;数据存储单元Block:用于存储索引Groupkey和数据;数据读取器模块:用于按照存储的索引Groupkey提供范围查询和等值查询接口,为外部提供了数据访问,具有指向真实数据的指针。本发明利用数据导入管理器导入外部数据,并生成数据存储单元Block和元数据,数据存储单元Block存储了索引Groupkey和数据;利用存储节点存储数据存储单元Block;利用存储节的子元数据管理器维护存储节点内部的库表列到数据存储单元Block的映射;利用主控节点建立数据存储单元Block到所在的物理机器的映射关系。通过以上部件构建起一个分布式数据存储架构。其中存储节点一般为多个,每个存储节点接受数据导入管理器数据,受到主控节点管制,每个存储节点有包含子元数据管理器、数据读取器以及多个数据存储单元Block,存储数据单元可以提供范围和等值查询。数据存储单元Block按照值的大小进行存储,且每个范围都标有对应的数据存储单元Block的ID,这样能大幅提高查询时间,达到高效索引的目的。优选的,所述主控节点的元数据组织为由数据库名、表名、列名唯一确定的列以及每个存储节点存储的数据中包含的列的列值范围到存储节点的地址的映射,主控节点的元数据组织的结构为:<数据库名、表名字,列名、列值范围、存储节点的地址>。存储节点的元数据组织为数据库名、表名、列名唯一确定的列到数据存储单元Block的映射,存储节点的元数据组织的结构为:<数据库名、表名字、列名、列值范围、数据存储单元Block的ID>。优选的,数据存储单元Block存储数据的方式为:以索引Groupkey加数据的方式存储在数据存储单元Block当中,如图2所示,一个数据存储单元Block包含一张表的若干列或全部的列,每张表的所有的列都会在数据存储单元Block中存储,在存储节点存储这个数据存储单元Block的时候,会同时记录这个数据存储单元Block对应的库名、表名、列名、列值范围和rowid范围到子元数据管理器中。如图3所示,数据存储单元Block的头部结构分为定长结构和变长两个部分:定长部分包括:block_id、begin_rowid、rows。block_id:表示数据存储单元block的编号,由数据导入管理器生成,全局唯一:每个数据存储单元Block对应着一个全局唯一的block_id。begin_rowid:指明了这个Block中所存储的数据的起始的rowid。rows:表明这个数据存储单元Block中一共有多少行的数据;变长部分包括:column_offset,column_offset:column_offset为一个数组,第i(i为自然数)个值表示这个数据存储单元Block中的第i个列的物理位置相对于Block起始头部的偏移量。数据存储单元Block中的库表列由外部元数据所描述,因为如果每个数据存储单元Block中都存储一份元数据会浪费空间。存储节点接收这个数据存储单元Block的时候,将数据存储单元Block对应的库名、表名、列名、列值范围和rowid范围注册到子元数据管理器中。如图4所示,所述column_offset的内部逻辑结构包括column_type部分和其余约定部分,column_type部分表示头部信息,其余约定部分是根据column_type部分由使用人员根据具体的需求具体约定。所述column_type指明数据组织方式是以索引Groupkey方式组织或者是以键值对方式组以及其对应的压缩方式,所述压缩方式是字节压缩或者是位压缩。一般的,column_type目前设定为4个字节,前一个字节表示是索引Groupkey或者其他压缩方式。第二个字节标识是位压缩还是字节压缩。第三个和第四个字节为保留字节。今后如果业务需求变化,column_type字节大小可以重新设置。该专利中的方式列举出索引Groupkey方式组织数据并配合以字节压缩或者位压缩。索引Groupkey:是一种在内存分布式列数据库中的数据组织方式,其采用字典压缩对每列内容进行压缩,采用索引向量index对字典向量中某个值对应在position向量中的范围进行界定,采用位置向量position存储字典向量对应的行号rowid的集合。同时,有一个行表向量rowtable,行表向量rowtable是维持行关系的向量,行表向量rowtable里面存储的是元素值在字典向量中的下标;结合索引Groupkey的特性,对于索引向量index,存储对应的位压缩或者字节压缩后的值;对于位置向量position,我们只存储其值相对于begin_rowid的偏移量;对于行表向量rowtable,其每一行与原始表一一对应,行表向量rowtable中的值是字典的下标,索引向量index、位置向量position、行表向量rowtable采用位压缩或者字节压缩。例如:自定义的column头部信息:index_width:index字段位宽或者字节宽度;position_width:position字段位宽或者字节宽度;rowtable_width:rowtable字段位宽或者字节宽度;数据体:dictionary:Groupkey的字典向量;index:Groupkey的索引向量;position:Groupkey的位置向量;rowtable:行表向量。其中,如果这个列是字符串类型,对于字典向量,则将每个字符串的值拼接为一个大的字符串(dictionary_string),同时配合以每个字符串在大字符串中的域值向量(dictionary_region)。如图5所示,展示了如何将“China”和“America”存储为大字符串加域值向量的方式存储。读取“China”字符的步骤是在dictionary_region取出0和5,dictionary_string中的[0,5)就是“China”字符。如果列是字符串类型,dictionary部分存储如图6所示:string_offset:dictionary_string相对于dictionary的偏移量。region_width:dictionary_region字段的位宽或者字节宽度。如果列不是字符串类型,dictionary存储的就是排序字典。结合索引Groupkey的特性,对于index向量,存储对应的位压缩或者字节压缩后的值。对于position向量,我们只存储其值相对于begin_rowid的偏移量。对于rowtable,其每一个值与原始表该列的一行一一对应。rowtable中的值是该行字典的下标。index、position、rowtable采用位压缩或者字节压缩。实施例2:根据一种分布式数据存储架构的数据存储方法。S1、主控节点根据每张表的列的宽度和有多少列决定每个数据存储单元Block中表的行数和列数,以及所要发往的存储节点的IP,将这些信息告诉数据导入管理器;S2、数据导入管理器将外部数据源读取上来的数据排序,生成数据字典,确定索引向量index、位置向量position、行表向量rowtable的压缩的位宽或者字节宽度;S3、数据导入管理器根据压缩的位宽或者字节宽度,生成压缩的索引向量index、位置向量position、行表向量rowtable,同时统计元数据。根据数据存储单元Block的内部设计,依次在数据存储单元Block内填入头部信息和上述数据体;S4、数据导入管理器将一个数据存储单元Block的数据和数据存储单元Block对应的元数据信息发送给存储节点,同时发送一份对应的元数据信息给主控节点;S5、存储节点存储数据导入管理器发送的数据存储单元Block,将对应的元数据信息记录到子元数据管理器。如果采用的运行时库提供了归还操作系统未使用的内存的接口,最后调用相应接口,释放多余内存;S6、主控节点将导入管理器发送的对应的元数据记录下来。主控节点根据每张表的列的宽度(比如列是定长的含有两个字节的类型,char(2)类型,则该列宽度为2byte)和有多少列决定每个数据存储单元Block中表的行数和列数,以及所要发往的存储节点的IP,将这些信息告诉数据导入管理器。一般行数取2^16行,每个数据存储单元Block大小不超过L3-cache大小。实施例3:如图7所示,根据所述的一种分布式数据存储架构的数据查询方法,查找数据库ID为db_id,表名为table_name,列名为col_name的查找数据存储单元Block的过程是:D1、访问主控节点,发送所要访问的数据的库表列信息,以及包含对应列的范围的消息给主控节点,查询方式如下:通过值查询rowid:通过给定值范围或者定值查询匹配的rowid;通过rowid查询值:通过给定rowid集合查询每个rowid对应的值。例如查询语句结构如下:通过值查询rowid:<数据库名,表名字,列名,范围查询或者等值查询条件>,其中,范围查询或者等值查询条件例如:姓名=“张三”;通过rowid查询值:<数据库名,表名字,列名,范围查询或者等值查询条件>,其中,范围查询或者等值查询条件例如:rowid>10000,D2、主控节点返回这次查询请求涉及到的存储节点的IP地址,主控节点返回给查询者的结构为:<IP,数据库名,表名字,列名>;D3、查询客户端与对应的存储节点建立连接,并向对应的存储节点发送对应的查询请求,存储节点收到查询请求后,访问子元数据管理器,最后得到数据存储单元Block的指针,然后,存储节点通过数据读取器读取到指定数据;D4、存储节点返回结果给查询客户端,查询客户端收到了所有的数据后,本次查询完毕。如图8所示,需要查询某列值小于4的对应rowid集合,其将需要与0、1、4号存储节点连接(存储节点中,尖括号中指定了该存储节点上面的值范围,表格中左边为排序了的值,右边是rowid)。这样,当值比较分散情况下,连接数将会上升。值得说明的是,由于我们的原始数据经过了排序。查找值的过程的时间复杂度是O(logN)。其次,在rowtable中,rowtable数组中个每一个元素和原表中对应的行是一一对应关系。rowtable就是原表,不过存储的不是原表实际值,而是存储了原表数据对应于字典的下标,也就是字典的key。知道了数据的rowid来查询值的过程是O(1)。总的来说:本发明公开了一种分布式数据存储架构,主控节点:用于建立数据存储单元Block到所在的物理机器的映射关系、统计全局负载情况以及生成数据存储单元Block的ID。数据导入管理器:对外部数据进行缓存,生成数据存储单元Block,导入数据存储单元Block到存储节点。存储节点:存储数据存储单元Block,对查询者提供查询功能。存储节点包括子元数据管理器、数据存储单元Block、数据读取器模块。子元数据管理器:用于维护存储节点内部由数据库名、表名、列名唯一确定的列到数据存储单元Block的映射。数据存储单元Block:用于存储索引Groupkey和数据。数据读取器模块:用于按照存储的索引Groupkey提供范围查询和等值查询接口,为外部提供了数据访问。以上所述,仅是本发明的较佳实施例,并非对本发明做任何形式上的限制,凡是依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化,均落入本发明的保护范围之内。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1