CN107633097B - 一种数据库表的动态扩容方法及*** - Google Patents

一种数据库表的动态扩容方法及*** Download PDF

Info

Publication number
CN107633097B
CN107633097B CN201710958921.2A CN201710958921A CN107633097B CN 107633097 B CN107633097 B CN 107633097B CN 201710958921 A CN201710958921 A CN 201710958921A CN 107633097 B CN107633097 B CN 107633097B
Authority
CN
China
Prior art keywords
record
current
subscript
level
database
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201710958921.2A
Other languages
English (en)
Other versions
CN107633097A (zh
Inventor
邓成东
刘洪政
陈国锋
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Mashang Consumer Finance Co Ltd
Original Assignee
Mashang Consumer Finance Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Mashang Consumer Finance Co Ltd filed Critical Mashang Consumer Finance Co Ltd
Priority to CN201710958921.2A priority Critical patent/CN107633097B/zh
Publication of CN107633097A publication Critical patent/CN107633097A/zh
Application granted granted Critical
Publication of CN107633097B publication Critical patent/CN107633097B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种数据库表的动态扩容方法及装置,该方法包括:若数据容量达到单库无法承载,使用一致性哈希算法结合虚拟节点方式实现数据库存储扩容并得到多级表;当需要增加记录至除最后一级表外的其他任一级表时确定该表为当前表,确定当前表的下一级表中表名的下标最大的表为目标表,确定当前表与目标表的记录对应记录的条数是否小于预先计算得到的阈值,如果是,则确定需增加的记录对应目标表并将需增加的记录写入至当前表中,如果否,则创建表名的下标等于目标表的下标加预设间隔值的表,确定需增加的记录对应创建的表并将需增加的记录写入至当前表中;当需要增加记录至最后一级表时直接将记录写入至该表中。从而有效的实现了表的扩容。

Description

一种数据库表的动态扩容方法及***
技术领域
本发明涉及数据管理技术领域,更具体地说,涉及一种数据库表的动态扩容方法及***。
背景技术
一般的***都是由小到大逐步发展的。业务少时数据量也较小,开始使用一个数据库,而后随着业务发展数据量逐渐增大,单库单表已经不能满足存储和联机查询的性能要求了,此时就需要采取分库分表的方案。在分库表过程中经常使用对特定的键值进行hash的办法进行分库分表。但是使用hash来进行分库分表在需要实现表的扩容时需要考虑到不同级的表的情况及各表之间的依赖关系等,导致表的扩容难以实现,因此急需一种技术方案来实现有效的表的扩容。
综上所述,如何提供一种能够有效实现表的扩容的技术方案,是目前本领域技术人员亟待解决的问题。
发明内容
本发明的目的是提供一种数据库表的动态扩容方法及***,以有效实现表的扩容。
为了实现上述目的,本发明提供如下技术方案:
一种数据库表的动态扩容方法,包括:
当数据容量达到单库无法承载的情况时,使用一致性哈希算法结合虚拟节点方式实现数据库存储扩容并得到数据库对应的多级表;其中,除第一级表之外的每一级表中存储有与该每一级表的上一级表中每条记录对应的记录;
当需要增加记录至除最后一级表之外的其他任一级表时确定该任一级表为当前表,确定当前表的下一级表中表名的下标最大的一个表为目标表,确定所述当前表中与目标表中的记录对应的记录的条数并判断该条数是否小于预先计算得到的阈值,如果是,则确定需增加的记录对应目标表并将需增加的记录写入至当前表中,如果否,则在当前表的下一级表创建表名的下标等于目标表的下标加预设间隔值的表,确定需增加的记录对应创建的表并将需增加的记录写入至当前表中;其中,多级表中每个表均具有不同于其他表的表名,表名包括对应的下标,且除最后一级表之外的其他任一级表的下一级表的表名按照表的先后创建时间对应选取由小到大的下标;
当需要增加记录至最后一级表时确定该最后一级表为当前表,并直接将记录写入至当前表中。
优选的,确定当前表的下一级表中表名的下标最大的一个表为目标表,包括:
获取需要增加的记录中记录的第一级表对应标识信息,并对该标识信息做一致性哈希运算得到对应数据库的标识信息;
由得到的标识信息对应数据库中实时更新维护的下标计数字典表中获取记录的当前表的下一级表中对应的最大下标,并确定该下标对应的表为目标表,其中所述下标计数字典表为预先创建的记录有对应数据库下除第一级表之外其他每级表中对应的最大下标。
优选的,得到数据库对应的多级表之后,还包括:
以Redis的Hash结构作为缓存存储载体来记录每级表对应标识信息与表名之间的对应关系以实现对应查询。
优选的,预先计算得到阈值,包括:
确定当前表的容量上限为MS条记录,基于当前表的上一级表与当前表间的数据关系确定一条当前表的上一级表中的记录最大对应M条当前表中的记录,确定当前表对应的阈值为MS/M。
优选的,得到数据库对应的多级表之后,还包括:
当需要查询某级表中某条记录对应该级表的下一级表中的哪个表时,则获取需要查询的某条记录中携带的下一级的表名,以确定需要查询的某条记录对应的下一级表。
一种数据库表的动态扩容***,包括:
存储扩容模块,用于:当数据容量达到单库无法承载的情况时,使用一致性哈希算法结合虚拟节点方式实现数据库存储扩容并得到数据库对应的多级表;其中,除第一级表之外的每一级表中存储有与该每一级表的上一级表中每条记录对应的记录;
第一表扩容模块,用于:当需要增加记录至除最后一级表之外的其他任一级表时确定该任一级表为当前表,确定当前表的下一级表中表名的下标最大的一个表为目标表,确定所述当前表中与目标表中的记录对应的记录的条数并判断该条数是否小于预先计算得到的阈值,如果是,则确定需增加的记录对应目标表并将需增加的记录写入至当前表中,如果否,则在当前表的下一级表创建表名的下标等于目标表的下标加预设间隔值的表,确定需增加的记录对应创建的表并将需增加的记录写入至当前表中;其中,多级表中每个表均具有不同于其他表的表名,表名包括对应的下标,且除最后一级表之外的其他任一级表的下一级表的表名按照表的先后创建时间对应选取由小到大的下标;
第二表扩容模块,用于:当需要增加记录至最后一级表时确定该最后一级表为当前表,并直接将记录写入至当前表中。
优选的,第一表扩容模块包括:
目标表确定模块,用于:获取需要增加的记录中记录的第一级表对应标识信息,并对该标识信息做一致性哈希运算得到对应数据库的标识信息;由得到的标识信息对应数据库中实时更新维护的下标计数字典表中获取记录的当前表的下一级表中对应的最大下标,并确定该下标对应的表为目标表,其中所述下标计数字典表为预先创建的记录有对应数据库下除第一级表之外其他每级表中对应的最大下标。
优选的,还包括:
记录模块,用于:得到数据库对应的多级表之后,以Redis的Hash结构作为缓存存储载体来记录每级表对应标识信息与表名之间的对应关系以实现对应查询。
优选的,还包括:
阈值计算模块,用于:确定当前表的容量上限为MS条记录,基于当前表的上一级表与当前表间的数据关系确定一条当前表的上一级表中的记录最大对应M条当前表中的记录,确定当前表对应的阈值为MS/M。
优选的,还包括:
查询模块,用于:得到数据库对应的多级表之后,当需要查询某级表中某条记录对应该级表的下一级表中的哪个表时,则获取需要查询的某条记录中携带的下一级的表名,以确定需要查询的某条记录对应的下一级表。
本发明提供了一种数据库表的动态扩容方法及装置,其中该方法包括:当数据容量达到单库无法承载的情况时,使用一致性哈希算法结合虚拟节点方式实现数据库存储扩容并得到数据库对应的多级表;当需要增加记录至除最后一级表之外的其他任一级表时确定该任一级表为当前表,确定当前表的下一级表中表名的下标最大的一个表为目标表,确定所述当前表中与目标表中的记录对应的记录的条数并判断该条数是否小于预先计算得到的阈值,如果是,则确定需增加的记录对应目标表并将需增加的记录写入至当前表中,如果否,则创建表名的下标等于目标表的下标加预设间隔值的表,确定需增加的记录对应创建的表并将需增加的记录写入至当前表中;当需要增加记录至最后一级表时确定该最后一级表为当前表,并直接将记录写入至当前表中。本申请公开的技术方案中,当数据容量达到单库无法承载的情况时,使用一致性哈希算法结合虚拟节点方式实现数据库存储扩容并得到数据库对应的多级表;并且在需要增加新的记录至除最后一级表之外的其他级表时,确定该级表的下一级表是否能够为其提供对应容量,如果是则实现新记录的加入,否则创建新的下一级表后实现新记录的加入,且在需要增加新的记录至最后一级表时直接加入即可,从而通过上述技术方案有效的实现了表的扩容。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本发明实施例提供的一种数据库表的动态扩容方法的流程图;
图2为本发明实施例提供的一种数据库表的动态扩容方法中实现存储扩容后的各节点及表的示意图;
图3为本发明实施例提供的一种数据库表的动态扩容方法中具体示例图;
图4为本发明实施例提供的一种数据库表的动态扩容***的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参阅图1,其示出了本发明实施例提供的一种数据库表的动态扩容方法的流程图,可以包括:
S11:当数据容量达到单库无法承载的情况时,使用一致性哈希算法结合虚拟节点方式实现数据库存储扩容并得到数据库对应的多级表。
其中使用一致性哈希算法结合虚拟节点方式实现数据库存储扩容并得到数据库对应的多级表的实现原理与现有技术中对应技术方案相同;以图2为例进行说明,对于任一数据库,第一级表即为直接与该数据库对应的表,第一级表中存储有数据库对应的记录,如T_A;第二级表即为直接与第一级表对应的表,第二级表中存储有第一级表中每条记录下的更细的记录,如T_B,以此类推;一般可以设置第一级表与数据库为一一对应关系,当然也可以根据实际需要进行其他设定,均在本发明的保护范围之内。举例对不同级表之间的数据关系进行说明,如一级表存的记录为各订单,则该级表的下一级表存的记录则为各订单的明细。
S12:当需要增加记录至除最后一级表之外的其他任一级表时确定该任一级表为当前表,确定当前表的下一级表中表名的下标最大的一个表为目标表,确定所述当前表中与目标表中的记录对应的记录的条数并判断该条数是否小于预先计算得到的阈值,如果是,则确定需增加的记录对应目标表并将需增加的记录写入至当前表中,如果否,则创建表名的下标等于目标表的下标加预设间隔值的表,确定需增加的记录对应创建的表并将需增加的记录写入至当前表中。
每个表都具有自己的表名,该表名中包括对应的下标,如图2中的T_A_001即为表T_A的表名,其中001即为该表名包括的下标,另外不同表的表名互不相同,且对于任一级表来说,该表的下一级表的表名中包含的下标一般都是按照创建时间由早到晚而选取由小到大的下标,相邻时间创建的表对应下标可以相差根据实际需要设定的预设间隔值(如1),也可以不同相邻时间创建的表对应下标相差不同值,均在本发明的保护范围之内。其中,与当前表对应的阈值为根据实际需要预先计算得到的,确定目标表中包含的记录与当前表中的记录的对应关系,如果该当前表中与目标表中记录对应的记录的条数小于对应阈值,则认为目标表中还可以为当前表中新增的记录提供更细化的记录的容量,因此,直接将需要增加的记录加入至当前表中,并且确定该记录对应更细化的记录均存储至目标表中,否则,则认为目标表中已经不可以为当前表中新增的记录提供更细化的记录的容量,因此创建新的当前表的下一级表,并确定需增加的记录与该创建的表具有对应关系,将需增加的记录加入至当前表中。
S13:当需要增加记录至最后一级表时确定该最后一级表为当前表,并直接将记录写入至当前表中。
如果需要在最后一级表中增加新的记录,则直接加入至最后一级表中即可。具体来说,可以由需要增加的记录中获取其携带的最后一级表之上每一级表对应的标识信息,对第一级表对应标识信息做一致性哈希获取对应的数据库,并由第一级表中根据第一级对应标识查询到一条第一级表记录,并从第一级表记录中存放关联表名的字段中取值得到其关联表名字段的值,该值即为与该条第一级表记录对应的第二级表的下标;由该下标对应第二级表中确定出与携带的第二级表对应标识对应的记录,并得到其关联表名字段的值,该值即为与该条第二级表记录对应的第三级表的下标;以此类推,直至确定出新的记录需增加至的最后一级表,并将该新的记录增加至对应表中。
本申请公开的技术方案中,当数据容量达到单库无法承载的情况时,使用一致性哈希算法结合虚拟节点方式实现数据库存储扩容并得到数据库对应的多级表;并且在需要增加新的记录至除最后一级表之外的其他级表时,确定该级表的下一级表是否能够为其提供对应容量,如果是则实现新记录的加入,否则创建新的下一级表后实现新记录的加入,且在需要增加新的记录至最后一级表时直接加入即可,从而通过上述技术方案有效的实现了表的扩容。
本发明实施例提供的一种数据库表的动态扩容方法,确定当前表的下一级表中表名的下标最大的一个表为目标表,可以包括:
获取需要增加的记录中记录的第一级表对应标识信息,并对该标识信息做一致性哈希运算得到对应数据库的标识信息;
由得到的标识信息对应数据库中实时更新维护的下标计数字典表中获取记录的当前表的下一级表中对应的最大下标,并确定该下标对应的表为目标表,其中所述下标计数字典表为预先创建的记录有对应数据库下除第一级表之外其他每级表中对应的最大下标。
可以在每个数据库设计一张下标计数字典表(T_INDEX),该字典表中存储了对应数据库下除第一级表之外其他每级表的表名中包括的最大下标,并且当任一级表对应最大下标发生改变时,实时更新维护下标计数字典表中的对应最大下标为新的最大下标;如图2中T_B表最大下标为010,T_C表最大下标为058;从而可以由这些下标计数字典表快速获取对应最大下标。而上述所说的标识信息可以为表中对应记录的ID,具体来说,可以设置以下规则:除第一级表之外的每级表的记录需要携带对应第一级表中对应的记录至该级表的上一级表中对应的记录的标识信息,而第一级表中的记录可以携带自身的标识信息,如图2中Object_1、Object_2等记录中需要携带能哈希路由到某数据库的T_A表中对应记录的ID,即T_A_ID;写入T_B表的记录需要携带T_A表中对应记录的T_A_ID;写入T_C表的记录需要携带T_A表中对应记录的T_A_ID、T_B表中对应记录的T_B_ID;以此类推;其中每个ID均是该条记录在数据库中对应表的位置索引信息。从而能够由记录中携带的标识信息一致性哈希运算得到对应数据库的标识信息(可以为ID),方便了对于数据库的定位及相关数据的查询。
本发明实施例提供的一种数据库表的动态扩容方法,得到数据库对应的多级表之后,还可以包括:
以Redis的Hash结构作为缓存存储载体来记录每级表对应标识信息与表名之间的对应关系以实现快速查询。
为了在实际应用中达到更好的性能要求,可以使用缓存来加速记录标识信息与对应表名之间的查找速度,本申请中以Redis的Hash结构来作为缓存存储载体,该结构中Key为某条记录对应数据库节点名、Field为某条记录携带的ID(具体可以为该条记录对应其所属表的上一级表中对应记录的ID)、Value为某条记录所属表的表名。对应的使用过程可以包括:操作某条记录时该记录所属的表是未知的,但是可以由该记录中获取其携带的标识信息,然后通过第一级表对应标识信息一致性哈希得到对应记录存储的数据库,然后通过Redis的Hash结构命令:hget DB:数据库对应编号第一级表的标识信息获取到值,该值即为该某条记录所属的表,进而确定该表中与记录中携带的该表对应标识信息对应的记录即为需要***作的记录。而对记录的操作具体可以包括增、删、改、查等操作。Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value结构的内存数据库,拥有较丰富的数据结构,并提供多种语言的API。从而可以实现标识信息及表名之间的快速查询。具体来说,设计的上述缓存存储载体的KV结构可以如以下的表1所示:
表1
对应的使用过程可以包括:
操作T_B_011表的记录时,通过T_B_ID的父业务关系T_A_ID一致性哈希得到数据库N-1,然后通过Redis的Hash结构命令:hget DB:N-1T_A_ID获取到值T_B_011。
操作T_C_023表的记录时,通过T_B_ID的父业务关系T_A_ID一致性哈希得到数据库N-1,然后通过Redis的Hash结构命令:hget DB:N-1T_B_ID获取到值T_C_023。
本发明实施例提供的一种数据库表的动态扩容方法,预先计算得到的阈值,可以包括:
确定当前表的容量上限为MS条记录,基于当前表的上一级表与当前表间的数据关系确定一条当前表的上一级表中的记录最大对应M条当前表中的记录,确定当前表对应的阈值为MS/M。
需要说明的是,对应单个数据库,可以结合预留磁盘空间大小、数据库服务器I/O性能高低、对该数据库数据读写频率高低等软硬件性能指标,再根据表与表之间的数据关系(如假设订单表VS订单明细表,一条订单记录对应订单明细表记录上限为30W条)来确定单表的数据容量上限,具体来说,一般与单个数据库对应的软硬件性能指标能够提供给该数据库对应表的空间具有一个最大限,进而可以在该最大限内根据实际需要设定该数据库对应表的空间,进而基于表的空间确定出每个表的数据容量上限,如可以设置将同一业务的数据对应N条记录存储在同一张数据表中,具体来说可以将每个第一级表与多个业务对应数据设置为一一对应关系,即每个第一级表存储对应业务数据和下级关系(具体包括下级表名),对应的,可以将预估的业务会具有的最大数据容量作为对应第一级表的数据容量上限,基于业务数据的情况预估第一级表的一条记录最大对应第二级表的记录条数,然后将该第一级表的数据容量上限除以第一级表的一条记录最大对应第二级表的记录条数得到的即为该第二级表的数据容量上限,以此类推,以确保同一业务的数据对应的N条记录存储在同一张数据表中。以图2包含的各表进行举例说明:
T_A表一个数据库一张,容量上限MS设定1000W条记录;
T_B_001--T_B_*表,单表容量上限MS设定1000W条记录,根据数据情况,一条T_A表记录最大对应M条T_B表记录,即一张T_B表能存放的对应T_A表记录数为MS/M=N条T_A表记录;
T_C_001--T_C_*,单表容量上限MS设定2000W,根据数据情况,一条T_B表记录最大对应M条T_C表记录,即一张T_C表能存放的对应T_B表记录数为MS/M=N条T_B表记录。
本发明实施例提供的一种数据库表的动态扩容方法,得到数据库对应的多级表之后,还可以包括:
当需要查询某级表中某条记录对应该级表的下一级表中的哪个表时,则获取需要查询的某条记录中携带的下一级的表名,以确定需要查询的某条记录对应的下一级表。
需要说明的是,每级表的每一条记录中均可以携带其相关数据(即更细化的数据)存在于下一级表的哪个表中,如图2中,T_A表中每一条记录中记录了其相关业务数据存在T_B的某张表中的表名(如T_B_002),T_B_001表中每一条记录中记录了其相关业务数据存在T_C的某张表中的表名(如T_C_005),并以此类推。从而实现了某条记录所在表的快速查询。
另外针对本申请公开的上述技术方案,以图2为例进行具体说明:
1、路由规则:
Object_1、Object_2等记录中首先需要携带能hash路由到某数据库的T_A表的业务ID信息T_A_ID,其中Object_1、Object_2等记录是一个泛指,可以代表任一个表的记录,可以理解为每个表的记录均需携带T_A_ID;写入T_B表的记录需要携带T_A_ID;写入T_C表的记录需要携带T_A_ID、T_B_ID;其他层级关系表以此类推。
2、新增一条T_A表记录(对应上述实施例中需要增加记录至除最后一级表之外的其他任一级表时):
对需新增的记录中携带的T_A_ID(T_A_ID为数据的主键)做一致性哈希运算得到对应的数据库;
从得到的数据库的下标计数字典表(T_INDEX)中查询T_B对应的最大下标(如为010);
在T_B_010表中的记录均有一个字段记录了对应的T_A表的记录ID(T_A_ID),基于统计SQL(SELECT COUNT(DISTINCT T_A_ID)FROM T_B_010)得到统计数据Q;
如果Q<N(N为T_A表对应的阈值),则说明当前T_B_010未达到预计容量上限,则将该记录写入T_A表时添加关联表名字段内容为“T_B_010”;
如果Q>=N,则说明当前T_B_010达到预计容量上限,则动态创建T_B_011表,并将该记录写入T_A表时添加关联表名字段内容为“T_B_011”(注意此时T_B_011表中无记录),并更新下标计数字典表(T_INDEX)中T_B对应的最大下标为011。
3、新增一条T_B表记录(对应上述实施例中需要增加记录至除最后一级表之外的其他任一级表时):
对新增的记录中携带的T_A_ID做一致性哈希运算得到对应的数据库;
根据T_A_ID的值从T_A表中查询出对应的一条唯一TA记录,通过该TA记录中得到维护的关联表名字段的值(如T_B_011);
从数据库的下标计数字典表(T_INDEX)中查询T_C对应的最大下标(如为058);
在T_C_058表中按照与T_B表的关联字段去重后统计出记录条数Q;
如果Q<N(T_B表对应阈值),则说明当前T_C_058未达到预计容量上限,则将新增的T_B记录写入到T_B_011表中时添加关联表名字段内容为“T_C_058”;
如果Q>=N,则说明当前T_C_058达到预计容量上限,则动态创建T_C_059表,并将该记录写入T_B_011表时添加关联表名字段内容为“T_C_059”(注意此时T_C_059表中无记录),并更新下标计数字典表(T_INDEX)中T_C对应的最大下标为059。
4、新增一条T_C表记录(需要增加记录至最后一级表时)
由需要新增的记录中获取其携带的T_A_ID、T_B_ID;
对T_A_ID做一致性哈希获取对应的数据库;
从T_A表中根据T_A_ID查询到一条T_A记录,并从T_A记录中存放关联表名的字段中取值得到其关联表名字段的值T_B_XXX(即确定出与T_A记录对应的T_B表);
根据T_B_ID从T_B_XXX中查询到记录,并得到其关联表名字段的值T_C_XXX(即确定出与T_B记录对应的T_C表);
将新增记录写入到T_C_XXX表中。
5、数据查询:查询下级数据需要带上所有父级的ID信息。
查询第一级表中的记录,可以确定该记录对应的标识信息并由第一级表中查找到与该标识对应的记录;对应图2,查询T_A表记录,需要明确T_A_ID,根据T_A_ID作为查询主键来查找到在T_A表的对应记录;
查询除第一级表之外其他表的记录,可以确定该记录对应第一级表中记录的标识信息,然后确定该标识信息在第一级表中的对应记录,再从该记录中确定出对应的第二级表,再确定该记录对应第二级表中记录的标识信息在第二级表中的对应记录,以此类推,直至查找到该记录为止。对应图2,查询T_B表记录,需要明确T_A_ID、(T_B_ID可选),首先根据T_A_ID作为查询主键来查找到在T_A表的对应记录(如XX),再从记录XX的关联字段中取出的值(如YY),该值YY即为T_B的某一张具体表(如T_B_011),最后也可以根据T_B_ID从T_B_011表中查询到对应的T_B记录;
查询T_C表记录,需要明确T_A_ID、T_B_ID、(T_C_ID可选),首先根据T_A_ID从T_A表查到一条T_A记录,再从T_A记录中得到对应的T_B_XXX表,再用T_B_ID从T_B_XXX表中查到一条T_B记录,再从T_B记录中得到对应的T_C_XXX表,再用T_C_ID从T_C_XXX表中查到一条T_C记录。
如有更多的层级,同上方案以此类推即可。另外需要说明的是,以图2为例进行具体说明的上述标号1至5的过程中涉及到的具体实现方式上位到第一级表、第二级表、第三级表等也在本发明的保护范围之内,也即将T_A表对应到第一级表、T_B表对应到第二级表、T_C表对应到第三级表等实现上述技术方案也在本发明的保护范围之内。
需要说明的是,本文中阐明的基于业务主键的数据库表的动态扩容方法可以应用在消费金融的资产打包抵押过程。资产打包过程涉及到一个资产包下可能存在N个资产明细(也称为合同),每个资产明细又可能存在N条还款记录。从查询角度来说需要能排序分页查看一个资产包下的所有资产明细,能分页查看一个资产明细下的所有还款记录。从更新角度来说需要在一个事务里批量更新一个资产包下的多条资产明细记录的字段数据。如果采用基于单纯的取模哈希算法或者一致性哈希+虚拟节点算法会导致一个资产包下的资产明细会因平衡性而被分散存储在了多个库的多张表中。因而导致出现如下问题:
排序分页查看数据困难,需要遍历所有库的所有资产明细表,聚合困难且查询效率低下;
不支持批量更新数据;
还会面临处理分布式事务的场景;
资产明细表和还款记录表的扩容也面临在存储节点间的迁移。
而在采用本文提出的方案后,将能解决这些问题。
结合图3进行说明,在消费金融的资产包业务场景中,数据量增长最快的两张业务表就是资产明细表和还款记录表,1个资产包对应约20W个资产明细(合同),1个合同对应约30条还款记录,即1个资产包≈20W个合同≈600W条还款记录。
容量规划:
单表容量划定原则:大量查询、少量更新的表约1000W记录/张,可接受上限浮动20%即1200W/张;频繁更新的表约500W记录/张,可接受上限浮动20%即600W/张;所以还款明细表(apm_repay_detail)1000W/张,资产包明细表(apm_detail)500W/张。
限定一张资产包明细表只存25个资产包的记录。[500W/20W≈25个资产包]
限定一张还款记录表里只存2个资产包的记录。[1000W/(20W合同*30条还款明细)≈2个资产包]
库表拆分:根据实际业务发展情况预计1年后能达到1W个资产包,即可推算出需要1W/25=400张资产包明细表,1W/2=5000张还款记录表。再根据数据库磁盘、网络I/O处理能力初始设定虚拟数据库节点128个,实际数据库节点16个,限定单库400张表左右。
数据路由及操作:
操作人员在***新增一个资产包时,***根据资产包编号的哈希值与模数128做取模运算得到其应该存储在某个数据库的资产包表中;然后通过统计、计算确定该资产包的资产明细记录具体存放的表名,表不存在则***主动创建,最后将该资产包记录包括资产明细记录表名一起存入资产包表中。
操作人员在***新增一个资产明细项(合同)时,需要指定一个所属资产包。通过资产包编号确定数据库和对应存放资产明细的表名,然后通过统计、计算确定该资产明细项的还款记录应该存放的具体表名,表不存在则***主动创建,最后将该资产明细记录包括存放还款流水的表名一起存入资产明细表中。
用户在***分期偿还一笔流水后,通过资产包编号确定数据库和对应存放资产明细的表名,通过资产明细(合同)号确定存放还款记录的表名,然后将还款流水***到还款记录表中。
实施本文提出的方案后,在该项目中达到了如下有益的效果:
一个资产包的资产明细和还款记录均在分别在一张表中,便于快速分页和聚合数据;
支持对一张资产明细表或者还款记录表数据的批量更新、删除操作;
因所有数据在一张表中,不存在分布式事务的场景;
因资产明细的还款记录在一定时间后不会再发生变化而处于冻结状态,该表就不会再有***和更新操作,也不存在因业务发展而拆分挪动该表数据的情况。
本发明实施例还提供了一种数据库表的动态扩容***,如图4所示,可以包括:
存储扩容模块11,用于:当数据容量达到单库无法承载的情况时,使用一致性哈希算法结合虚拟节点方式实现数据库存储扩容并得到数据库对应的多级表;
第一表扩容模块12,用于:当需要增加记录至除最后一级表之外的其他任一级表时确定该任一级表为当前表,确定当前表的下一级表中表名的下标最大的一个表为目标表,确定所述当前表中与目标表中的记录对应的记录的条数并判断该条数是否小于预先计算得到的阈值,如果是,则确定需增加的记录对应目标表并将需增加的记录写入至当前表中,如果否,则创建表名的下标等于目标表的下标加预设间隔值的表,确定需增加的记录对应创建的表并将需增加的记录写入至当前表中;
第二表扩容模块13,用于:当需要增加记录至最后一级表时确定该最后一级表为当前表,并直接将记录写入至当前表中。
本发明实施例提供的一种数据库表的动态扩容***,第一表扩容模块可以包括:
目标表确定模块,用于:获取需要增加的记录中记录的第一级表对应标识信息,并对该标识信息做一致性哈希运算得到对应数据库的标识信息;由得到的标识信息对应数据库中实时更新维护的下标计数字典表中获取记录的当前表的下一级表中对应的最大下标,并确定该下标对应的表为目标表,其中所述下标计数字典表为预先创建的记录有对应数据库下除第一级表之外其他每级表中对应的最大下标。
本发明实施例提供的一种数据库表的动态扩容***,还可以包括:
记录模块,用于:得到数据库对应的多级表之后,以Redis的Hash结构作为缓存存储载体来记录每级表对应标识信息与表名之间的对应关系以实现对应查询。
本发明实施例提供的一种数据库表的动态扩容***,还可以包括:
阈值计算模块,用于:确定当前表的容量上限为MS条记录,基于当前表的上一级表与当前表间的数据关系确定一条当前表的上一级表中的记录最大对应M条当前表中的记录,确定当前表对应的阈值为MS/M。
本发明实施例提供的一种数据库表的动态扩容***,还可以包括:
查询模块,用于:得到数据库对应的多级表之后,当需要查询某级表中某条记录对应该级表的下一级表中的哪个表时,则获取需要查询的某条记录中携带的下一级的表名,以确定需要查询的某条记录对应的下一级表。
本发明实施例提供的一种数据库表的动态扩容***中相关部分的说明请参见本发明实施例提供的一种数据库表的动态扩容方法中对应部分的详细说明,在此不再赘述。另外本发明实施例提供的上述技术方案中与现有技术中实现原理一致的部分并未详细说明,以免过多赘述。
对所公开的实施例的上述说明,使本领域技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

Claims (10)

1.一种数据库表的动态扩容方法,其特征在于,包括:
当数据容量达到单库无法承载的情况时,使用一致性哈希算法结合虚拟节点方式实现数据库存储扩容并得到数据库对应的多级表;其中,除第一级表之外的每一级表中存储有与该每一级表的上一级表中每条记录对应的记录;
当需要增加记录至除最后一级表之外的其他任一级表时确定该任一级表为当前表,确定当前表的下一级表中表名的下标最大的一个表为目标表,确定所述当前表中与目标表中的记录对应的记录的条数并判断该条数是否小于预先计算得到的阈值,如果是,则确定需增加的记录对应目标表并将需增加的记录写入至当前表中,如果否,则在当前表的下一级表创建表名的下标等于目标表的下标加预设间隔值的表,确定需增加的记录对应创建的表并将需增加的记录写入至当前表中;其中,多级表中每个表均具有不同于其他表的表名,表名包括对应的下标,且除最后一级表之外的其他任一级表的下一级表的表名按照表的先后创建时间对应选取由小到大的下标;
当需要增加记录至最后一级表时确定该最后一级表为当前表,并直接将记录写入至当前表中。
2.根据权利要求1所述的方法,其特征在于,确定当前表的下一级表中表名的下标最大的一个表为目标表,包括:
获取需要增加的记录中记录的第一级表对应标识信息,并对该标识信息做一致性哈希运算得到对应数据库的标识信息;
由得到的标识信息对应数据库中实时更新维护的下标计数字典表中获取记录的当前表的下一级表中对应的最大下标,并确定该下标对应的表为目标表,其中所述下标计数字典表为预先创建的记录有对应数据库下除第一级表之外其他每级表中对应的最大下标。
3.根据权利要求2所述的方法,其特征在于,得到数据库对应的多级表之后,还包括:
以Redis的Hash结构作为缓存存储载体来记录每级表对应标识信息与表名之间的对应关系以实现对应查询。
4.根据权利要求1所述的方法,其特征在于,预先计算得到阈值,包括:
确定当前表的容量上限为MS条记录,基于当前表的上一级表与当前表间的数据关系确定一条当前表的上一级表中的记录最大对应M条当前表中的记录,确定当前表对应的阈值为MS/M。
5.根据权利要求4所述的方法,其特征在于,得到数据库对应的多级表之后,还包括:
当需要查询某级表中某条记录对应该级表的下一级表中的哪个表时,则获取需要查询的某条记录中携带的下一级的表名,以确定需要查询的某条记录对应的下一级表。
6.一种数据库表的动态扩容***,其特征在于,包括:
存储扩容模块,用于:当数据容量达到单库无法承载的情况时,使用一致性哈希算法结合虚拟节点方式实现数据库存储扩容并得到数据库对应的多级表;其中,除第一级表之外的每一级表中存储有与该每一级表的上一级表中每条记录对应的记录;
第一表扩容模块,用于:当需要增加记录至除最后一级表之外的其他任一级表时确定该任一级表为当前表,确定当前表的下一级表中表名的下标最大的一个表为目标表,确定所述当前表中与目标表中的记录对应的记录的条数并判断该条数是否小于预先计算得到的阈值,如果是,则确定需增加的记录对应目标表并将需增加的记录写入至当前表中,如果否,则在当前表的下一级表创建表名的下标等于目标表的下标加预设间隔值的表,确定需增加的记录对应创建的表并将需增加的记录写入至当前表中;其中,多级表中每个表均具有不同于其他表的表名,表名包括对应的下标,且除最后一级表之外的其他任一级表的下一级表的表名按照表的先后创建时间对应选取由小到大的下标;
第二表扩容模块,用于:当需要增加记录至最后一级表时确定该最后一级表为当前表,并直接将记录写入至当前表中。
7.根据权利要求6所述的***,其特征在于,第一表扩容模块包括:
目标表确定模块,用于:获取需要增加的记录中记录的第一级表对应标识信息,并对该标识信息做一致性哈希运算得到对应数据库的标识信息;由得到的标识信息对应数据库中实时更新维护的下标计数字典表中获取记录的当前表的下一级表中对应的最大下标,并确定该下标对应的表为目标表,其中所述下标计数字典表为预先创建的记录有对应数据库下除第一级表之外其他每级表中对应的最大下标。
8.根据权利要求7所述的***,其特征在于,还包括:
记录模块,用于:得到数据库对应的多级表之后,以Redis的Hash结构作为缓存存储载体来记录每级表对应标识信息与表名之间的对应关系以实现对应查询。
9.根据权利要求6所述的***,其特征在于,还包括:
阈值计算模块,用于:确定当前表的容量上限为MS条记录,基于当前表的上一级表与当前表间的数据关系确定一条当前表的上一级表中的记录最大对应M条当前表中的记录,确定当前表对应的阈值为MS/M。
10.根据权利要求9所述的***,其特征在于,还包括:
查询模块,用于:得到数据库对应的多级表之后,当需要查询某级表中某条记录对应该级表的下一级表中的哪个表时,则获取需要查询的某条记录中携带的下一级的表名,以确定需要查询的某条记录对应的下一级表。
CN201710958921.2A 2017-10-16 2017-10-16 一种数据库表的动态扩容方法及*** Active CN107633097B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201710958921.2A CN107633097B (zh) 2017-10-16 2017-10-16 一种数据库表的动态扩容方法及***

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201710958921.2A CN107633097B (zh) 2017-10-16 2017-10-16 一种数据库表的动态扩容方法及***

Publications (2)

Publication Number Publication Date
CN107633097A CN107633097A (zh) 2018-01-26
CN107633097B true CN107633097B (zh) 2018-09-25

Family

ID=61105360

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201710958921.2A Active CN107633097B (zh) 2017-10-16 2017-10-16 一种数据库表的动态扩容方法及***

Country Status (1)

Country Link
CN (1) CN107633097B (zh)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110928900B (zh) * 2018-09-17 2021-02-19 马上消费金融股份有限公司 多表数据的查询方法、装置、终端以及计算机存储介质
CN110059080B (zh) * 2019-04-29 2021-12-14 珠海天燕科技有限公司 一种数据处理的方法和装置
CN111782628A (zh) * 2020-06-11 2020-10-16 国电南京自动化股份有限公司 电力***实时库动态扩充增量的方法、配置工具和***
CN112783860B (zh) * 2021-01-11 2023-08-08 网易(杭州)网络有限公司 构造镜像数据库的方法、装置、存储介质及计算机设备

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP1736904A2 (en) * 2005-06-15 2006-12-27 Alcatel Methods and data structure for indexed storage of hierarchically interrelated information in a relational database
CN102867071A (zh) * 2012-10-19 2013-01-09 烽火通信科技股份有限公司 一种网管海量历史数据管理方法
CN105989015A (zh) * 2015-01-28 2016-10-05 阿里巴巴集团控股有限公司 一种数据库扩容方法和装置以及访问数据库的方法和装置

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP1736904A2 (en) * 2005-06-15 2006-12-27 Alcatel Methods and data structure for indexed storage of hierarchically interrelated information in a relational database
CN102867071A (zh) * 2012-10-19 2013-01-09 烽火通信科技股份有限公司 一种网管海量历史数据管理方法
CN105989015A (zh) * 2015-01-28 2016-10-05 阿里巴巴集团控股有限公司 一种数据库扩容方法和装置以及访问数据库的方法和装置

Also Published As

Publication number Publication date
CN107633097A (zh) 2018-01-26

Similar Documents

Publication Publication Date Title
CN107633097B (zh) 一种数据库表的动态扩容方法及***
CN110334154A (zh) 基于区块链的分级存储方法及装置、电子设备
US9177004B2 (en) Balancing data across partitions of a table space during load processing
US10332075B2 (en) Nearest known person directory function
CN107644071A (zh) 缓存更新方法、装置及数据存储***
CN108009008A (zh) 数据处理方法和***、电子设备
CN107066393A (zh) 提高地址映射表中映射信息密度的方法
CN110347684A (zh) 基于区块链的分级存储方法及装置、电子设备
CN110347660A (zh) 基于区块链的分级存储方法及装置、电子设备
CN103577440A (zh) 一种非关系型数据库中的数据处理方法和装置
CN108228649A (zh) 用于数据访问的方法和设备
JP2004518225A (ja) 情報システムのためのデータ構造
US6584555B2 (en) Information storage and retrieval system
CN103064639A (zh) 数据存储方法及装置
CN106610903A (zh) 层级化存储器***、存储器控制器和去重及存储器层级化方法
CN107493327A (zh) 分布式缓存管理方法、***及数据管理***
CN108287840A (zh) 一种基于矩阵哈希的数据存储和查询方法
CN103020255A (zh) 分级存储方法和装置
CN104951462B (zh) 用于管理数据库的方法和***
CN105389367A (zh) 基于Mongo数据库的电网图形多时态多级分布式存储方法
CN104021223B (zh) 一种集群数据库测点的访问方法及装置
US7020782B2 (en) Size-dependent hashing for credit card verification and other applications
CN109828975A (zh) 一种基于区块链的大规模快速账本存取***
CN107426315A (zh) 一种基于BP神经网络的分布式缓存***Memcached的改进方法
CN109408416B (zh) 一种地址映射表项页管理方法及装置

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant