分布式数据库中子表分裂的方法、子表节点和系统的制作方法

文档序号:9597952阅读:596来源:国知局
分布式数据库中子表分裂的方法、子表节点和系统的制作方法
【技术领域】
[0001] 本发明涉及数据库领域,尤其涉及一种分布式数据库中子表分裂方法、子表节点 和系统。
【背景技术】
[0002] 在大多数分布式数据库中,通常采用KeyValue类型的存储方式,即将用户需要存 储的数据存放在Value部分,构建与Value对应的Key,当用户需要查找Value时,通过Key 索引查找对应的Value。在数据存储时,是按照Key的字典顺序自然排序的。
[0003] 数据存储在用户创建的相应用户表(Table)。一个Table中可以存储大量的数据, 为了方便分布式管理和维护,可以按照记录的Key值的字典顺序切割生成一个或多个子表 (Region),每个Region是一个Key区间数据的集合,也可以说是连续行数据的集合。每个 KeyValue所对应的Key只包括在一个Region区间。例如图1所示,图1为一个用户表中 子表的示意图,其中,图1中Region-Ι中的Key-A代表着在字典顺序上一个无穷小的值, Region-M中的Key-Y代表着在字典顺序上一个无穷大的值。
[0004] 目前,子表的分裂分为两种形式:第一,在建表初期,预设定分裂点(Split Points),子表会按照预设定的分裂点生成新的子表。例如:建表时建立Region[Key-A, Key-Y),预设定的分裂点为{B, C,......X}, Region[Key_A,Key-Υ)会按照预设定的分裂点 自动生成多个子表:Region-1 [Key-A,Key-B),Region2[Key_B,Key-C),Region3[Key_C, Key-D),......RegionM[Key-X,Key_Y),如图2所示。第二,当子表中存储的数据达到一定内 存时,会自动分为两个子表,或者通过用户手动触发子表分裂。例如:如图3所示,图3为 一个子表分裂为两个子表的不意图,分别将Region [,C),Region [C, E),Region [E, G),......, Region [X,)分裂为两个子表,依次分裂为 Region [,B)、Region [B, C),Region [C, D)、 Region [D, E),Region [E, F)、Region [F, G),......,Region [X,Y)、Region [Y, Z)。当一个用户 表中包括多个子表时,也可以按照第二种分裂方式将子表进行分裂,以提高读写数据的性 能。
[0005] 但是,如果在建表初期预设定的分裂点不合理,例如在建表时确定的分裂点为 {a, b, c, d, e, f},基于这些分裂点的子表为(_ °°,a),[a, b),[b, c),[c, d),[d, e),[e, f), [f,+ 0 )。运行一段时间之后,发现原来的分裂点是不合理的,更加合理的分裂点应该为 {g,h,i,j,k,1,m},而原来的子表中又已经存在用户数据了,此时对子表进行分裂,读取一 个文件中的数据,然后存放到两个或多个文件中,子表分裂速度慢,且读写数据的性能较 差,如果将子表分裂的越多,读写数据的性能会越差,且分裂后的子表也依然会造成数据分 布不均匀的问题。

【发明内容】

[0006] 本发明实施例提供一种分布式数据库中子表分裂的方法、子表节点和系统,通过 在用户表中预留一个子表,该子表在当前数据存储时保持为空子表。当需要将数据存储到 该子表中时,将该子表进行分裂,以实现用户表中子表的快速多点分裂,提升用户表的读写 性能。
[0007] -方面,本申请的实施例提供一种分布式数据库中子表分裂的方法,当数据按照 键-值类型存储的方式进行存储时,根据预设条件,例如业务类型,预估计当前业务类型存 储数据的Key值范围,设置空子表,该空子表为存储新的键-值类型的数据预留的空表,即 当前存储的数据不会存储在该空表中。该方法包括:当以键-值类型存储的数据需要存储 到空子表中时,接收子表分裂命令,该子表分裂命令可以为用户调用的一个接口或者一个 命令,该子表分裂命令中包括空子表分裂的分裂点信息。根据子表分裂命令将状态表中 记录的空子表的状态标识为不再提供读写服务,也可以理解为不支持提供读写服务。根据 空子表分裂点的信息,将空子表分裂为两个或者两个以上的新子表,并将状态表中记录的 新生成的子表的状态标识为可提供读写服务,可理解为支持提供读写服务。并指示将新生 成的子表存储的子表节点(或存储节点)的位置信息记录在元数据表中,以便于用户根据 元数据表中记录的新生成子表所在的子表节点的位置信息,获取存储在新生成子表中的数 据。
[0008] 基于上述方案,通过在用户表中预留一个子表,该子表在当前数据存储时保持为 空子表。当需要将数据存储到该子表中时,将该子表进行分裂,分裂完成之后再存入数据, 实现了用户表中子表的快速多点分裂,提升了用户表的读写性能。
[0009] 在一个可能的设计中,当接收到子表分裂命令时,向共享状态机发送一个可以表 征空子表开始分裂的信息。当共享状态机接收到该信息时,将记录的空子表的状态标识为 空子表开始分裂,以明确该子表的服务状态,避免向该空子表中写入数据,造成数据丢失。
[0010] 在另一个可能的设计中,当子表分裂完成之后,向共享状态机发送可以表征空子 表完成分裂的信息。当共享状态机接收到该信息时,将记录的空子表的状态标识为空子表 分裂完成,以明确该空子表的状态,以禁止向该空子表中写入数据,造成数据丢失。
[0011] 在又一个可能的设计中,当空子表分裂为至少两个新子表时,指示更新元数据表 中空子表的状态为不支持提供可读写服务,便于通过查询元数据表获取该空子表的服务状 态,以用于在后续存储空间清理中,删除该空子表的信息。
[0012] 另一方面,本申请的实施例提供一种子表节点,当数据按照键-值类型的存储方 式进行数据存储时,根据预设条件,例如存储数据的业务类型,预估计存储数据的Key值的 范围,设置空子表,即当前存储的数据不会存储在该空子表中。该子表节点包括接收单元、 更新单元、分裂单元和记录单元。当新的键-值类型的数据需要存储在空子表中时,接收单 元接收子表分裂命令,该子表分裂命令可以为用户调用的一个接口或者一个命令,该命令 包括空子表分裂点信息。更新单元根据子表分裂命令将状态表中的空子表的状态标识为不 再提供读写服务,即不支持提供读写服务。分裂单元根据分裂点信息,将空子表分裂成两个 或者两个以上的新子表,并将新子表的状态标识为可提供读写服务,可理解为支持提供读 写服务。指示记录单元将新子表所在的子表节点(或存储节点)的位置信息记录在元数据 表中,以便于通过查询元数据表中记录的新子表的位置信息,获取存储在新子表中的数据。
[0013] 基于上述方案,通过在用户表中预留一个子表,该子表在当前数据存储时保持为 空子表。当需要将数据存储到该子表中时,将该子表进行分裂,分裂完成之后再存入数据, 实现了用户表中子表的快速多点分裂,提升了用户表的读写性能。
[0014] 在一个可能的设计中,该表节点还包括发送单元,用于向共享状态机发送表征空 子表开始分裂的信息。当共享状态机接收到该信息时,将空子表的状态标识为开始分裂,以 避免向该空子表中写入数据,造成数据丢失。
[0015] 在另一个可能的设计中,当子表分裂完成之后,发送单元向共享状态机发送可以 表征空子表完成分裂的信息。当共享状态机接收到该信息时,将记录的空子表的状态标 识为空子表分裂完成,以明确该空子表的状态,以禁止向该空子表中写入数据,造成数据丢 失。
[0016] 在又一个可能的设计中,指示更新单元将元数据表中的空子表的状态标识为不支 持提供读写服务,便于通过查询元数据表获取该空子表的服务状态,以用于在后续存储空 间清理中,删除该空子表的信息。
[0017] 再一方面,本申请实施例提供一种系统,该系统包括多个管理节点和共享状态机, 多个管理节点可以管理一个或者多个另一方面中的子表节点,以用于数据按照键-值类型 的存储方式存储时,根据预设条件,设置第一子表,所述第一子表是指为存储新的键-值 类型的数据而预留的空表;当所述新的键-值类型的数据需要存储到所述第一子表时,通 过所述至少一个子表节点、所述多个管理节点和所述共享状态机完成对所述第一子表的分 裂。
[0018] 本申请提供的分布式数据库中子表分裂的方法、子表节点和系统,通过在用户表 中预留一个子表,该子表在当前数据存储时保持为空子表。
当前第1页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1