CN116431632A - 数据处理方法、数据库系统、计算机设备和存储介质 - Google Patents

数据处理方法、数据库系统、计算机设备和存储介质 Download PDF

Info

Publication number
CN116431632A
CN116431632A CN202310334927.8A CN202310334927A CN116431632A CN 116431632 A CN116431632 A CN 116431632A CN 202310334927 A CN202310334927 A CN 202310334927A CN 116431632 A CN116431632 A CN 116431632A
Authority
CN
China
Prior art keywords
node
data
target
path
nodes
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.)
Pending
Application number
CN202310334927.8A
Other languages
English (en)
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.)
Hangzhou Qulian Technology Co Ltd
Original Assignee
Hangzhou Qulian Technology 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 Hangzhou Qulian Technology Co Ltd filed Critical Hangzhou Qulian Technology Co Ltd
Priority to CN202310334927.8A priority Critical patent/CN116431632A/zh
Publication of CN116431632A publication Critical patent/CN116431632A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2228Indexing structures
    • G06F16/2246Trees, e.g. B+trees
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/23Updating
    • G06F16/2358Change logging, detection, and notification
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/27Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Databases & Information Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Computing Systems (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本申请公开一种数据处理方法、系统、设备和存储介质,属于数据库技术领域。该方法应用于数据库系统,数据库系统包括调度模块和多个设备,不同设备存储不同版本的默克尔B+树中根节点的数据。调度模块向目标设备发送携带目标根节点的数据和数据修改集的数据修改指令;目标设备根据目标根节点的数据和数据修改集指示至少一个设备获取从目标根节点至目标数据节点的节点路径中节点的数据及更新节点;目标设备将更新后的节点路径中根节点的数据存储至自身的磁盘页,至少一个设备将更新后的节点路径中除根节点之外的其他节点的数据存储至磁盘页。本申请通过将多版本数据分散到多个设备上,可降低数据存储与多版本维护压力,可提升该数据库系统的性能。

Description

数据处理方法、数据库系统、计算机设备和存储介质
技术领域
本申请涉及数据库技术领域,特别涉及一种数据处理方法、数据库系统、计算机设备和存储介质。
背景技术
默克尔B+树是以B+树为基础进行改进的树结构,其包含两种类型的节点:索引节点和处于最后一层的数据节点。相关技术中,索引节点存放其下属节点的最小键和哈希值,数据节点存放键值对(即key-value)。默克尔B+树中每个节点存放的数据可以以页的形式存储在磁盘中。
目前,数据库可以基于默克尔B+树实现,也即,数据库的底层存储引擎可以为默克尔B+树结构。然而,在数据量持续增长的情况下,数据库的性能会在数据量积累到一定程度后,受单机内存大小和磁盘性能的影响,吞吐量表现持续下降。
发明内容
本申请提供了一种数据处理方法、数据库系统、计算机设备和存储介质,可以提升数据库系统的性能。所述技术方案如下:
第一方面,提供了一种数据处理方法,所述方法应用于数据库系统,所述数据库系统包括调度模块和多个设备,所述多个设备中不同的设备用于存储不同版本的默克尔B+树中根节点的数据,所述方法包括:
所述调度模块向目标设备发送数据修改指令,所述数据修改指令携带目标根节点的数据和数据修改集,所述目标根节点为最新版本的所述默克尔B+树中的根节点,所述目标设备为所述多个设备中排序在存储有所述目标根节点的数据的设备后一位的设备,所述数据修改集包括待添加的键值对、待更新的键值对、和/或待删除的键;
所述目标设备接收到所述数据修改指令后,根据所述目标根节点的数据和所述数据修改集指示所述多个设备中的至少一个设备获取从所述目标根节点至目标数据节点的节点路径中节点的数据以及更新所述节点路径中的节点;
所述目标设备将更新后的所述节点路径中根节点的数据存储至所述目标设备的磁盘页,所述至少一个设备将更新后的所述节点路径中除根节点之外的其他节点的数据存储至磁盘页。
在本申请中,可实现一个设备与一个版本的默克尔B+树的对应,由多个设备维护多个版本的默克尔B+树,通过将多版本数据分散到了多个设备上,可降低单个设备的数据存储与多版本维护的压力,从而可以提高该数据库系统的吞吐量,进而提升该数据库系统的性能。
可选地,所述目标设备根据所述目标根节点的数据和所述数据修改集指示所述多个设备中的至少一个设备获取从所述目标根节点至目标数据节点的节点路径中节点的数据以及更新所述节点路径中的节点,包括:
所述目标设备根据所述目标根节点的数据和所述数据修改集中的key值获取从所述目标根节点至所述目标数据节点的节点路径中节点的数据;
所述目标设备根据所述数据修改集更新所述节点路径中的节点。
可选地,所述目标设备将更新后的所述节点路径中根节点的数据存储至所述目标设备的磁盘页,所述至少一个设备将更新后的所述节点路径中除根节点之外的其他节点的数据存储至磁盘页,包括:
若所述节点路径的树高小于或等于预设高度,则所述目标设备将更新后的所述节点路径中每个节点的数据存储至所述目标设备的磁盘页;
若所述节点路径的树高大于预设高度,则所述目标设备将所述节点路径分为m段路径,所述m段路径中的第1段路径包括根节点,所述m为大于或等于2的整数;所述目标设备将更新后的所述第1段路径中节点的数据存储至所述目标设备的磁盘页,将更新后的所述m段路径中除所述第1段路径之外的m-1段路径中节点的数据存储于所述多个设备中除所述目标设备之外的其他设备的磁盘页。
可选地,所述m-1段路径中任意一段路径与所述多个设备中除所述目标设备之外的一个设备对应;
所述目标设备将更新后的所述m段路径中除所述第1段路径之外的m-1段路径中节点的数据存储于所述多个设备中除所述目标设备之外的其他设备的磁盘页,包括:
所述目标设备将更新后的所述m-1段路径中任意的一段路径中节点的数据存储至所述一段路径对应的设备的磁盘页;
所述方法还包括:
若所述目标设备与所述一段路径对应的设备之间出现网络异常,则所述目标设备将更新后的所述一段路径中节点的数据存储至排序在所述一段路径对应的设备后一位的设备的磁盘页。
可选地,所述目标设备根据所述目标根节点的数据和所述数据修改集指示所述多个设备中的至少一个设备获取从所述目标根节点至目标数据节点的节点路径中节点的数据以及更新所述节点路径中的节点,包括:
所述目标设备根据所述目标根节点的数据和所述数据修改集中的key值确定第一节点,所述第一节点为在所述目标根节点下属的节点中将所述数据修改集中的键值对和/或键分发至的节点;
所述目标设备若未存储所述第一节点的数据,则获取所述第一节点对应的第一数据量和第二数据量,所述第一节点对应的所述第一数据量为所述数据修改集中需分发至所述第一节点的键值对和/或键的总数据量,所述第一节点对应的所述第二数据量为预测出的所述节点路径中所述第一节点及位于所述第一节点的下层的节点的总数据量;
所述目标设备根据所述第一节点对应的所述第一数据量和所述第二数据量指示所述至少一个设备获取所述节点路径中所述第一节点及位于所述第一节点下层的节点的数据并更新所述节点路径中的节点。
可选地,所述目标设备根据所述第一节点对应的所述第一数据量和所述第二数据量指示所述至少一个设备获取所述节点路径中所述第一节点及位于所述第一节点下层的节点的数据并更新所述节点路径中的节点,包括:
若所述第一节点对应的所述第一数据量小于所述第二数据量,则所述目标设备向所述多个设备中存储有所述第一节点的数据的第一设备发送第一更新请求,以指示所述第一设备获取所述节点路径中所述第一节点及位于所述第一节点下层的节点的数据并更新节点;
所述目标设备接收所述第一设备针对所述第一更新请求返回的第一更新结果,根据所述第一更新结果更新所述节点路径中的根节点。
可选地,所述目标设备向所述多个设备中存储有所述第一节点的数据的第一设备发送第一更新请求之后,还包括:
所述第一设备接收到所述第一更新请求后,根据所述第一节点的页标识获取所述第一设备中对应磁盘页中存储的所述第一节点的数据;
若所述第一节点为索引节点,则所述第一设备根据所述第一节点的数据和所述第一更新请求中携带的键值对和/或键中的key值确定第二节点,所述第二节点为在所述第一节点下属的节点中将所述第一更新请求中携带的键值对和/或键分发至的节点;
所述第一设备若未存储所述第二节点的数据,则获取所述第二节点对应的第一数据量和第二数据量,所述第二节点对应的所述第一数据量为所述第一更新请求中携带的键值对和/或键中需分发至所述第二节点的键值对和/或键的总数据量,所述第二节点对应的所述第二数据量为预测出的所述节点路径中所述第二节点及位于所述第二节点的下层的节点的总数据量;
若所述第二节点对应的所述第一数据量小于所述第二数据量,则所述第一设备向所述多个设备中存储有所述第二节点的数据的第二设备发送第二更新请求,以指示所述第二设备获取所述节点路径中所述第二节点及位于所述第二节点下层的节点的数据并更新节点;
所述第一设备接收所述第二设备针对所述第二更新请求返回的第二更新结果,根据所述第二更新结果更新所述第一节点,将更新后的节点中处于最上层的节点的最小键、哈希值和页标识携带于所述第一更新结果中返回给所述目标设备。
可选地,所述数据修改指令携带区块标识,所述数据修改指令中的区块标识用于标识所述数据修改集对应的区块;所述方法还包括:
所述调度模块接收回滚请求,所述回滚请求携带目标区块标识;
所述调度模块在当前区块的执行进度为已落盘的情况下,向所述多个设备中的每个设备发送回滚指令,所述回滚指令携带所述目标区块标识;
所述多个设备中的每个设备接收到所述回滚指令后,删除所述目标区块标识所标识的目标区块及所述目标区块后的所有区块对应的版本信息,向所述调度模块发送回滚完成消息,所述区块对应的版本信息为在处理所述区块对应的数据修改集的过程中记录的信息;
所述调度模块若接收到所述多个设备中的每个设备发送的回滚完成消息,则删除所述目标区块及所述目标区块后的所有区块对应的根节点的数据,以及删除所述目标区块及所述目标区块后的所有区块的区块标识。
可选地,所述方法还包括:
所述调度模块向所述多个设备中的每个设备发送第一设备新增指令,向指定设备发送第二设备新增指令,所述第一设备新增指令携带所述指定设备的设备信息,所述第二设备新增指令携带所述多个设备的设备数量;
对于所述多个设备中任意的一个设备,所述一个设备接收到所述第一设备新增指令后,记录所述设备信息,以及与所述设备信息对应的所述指定设备建立通信连接,在成功与所述指定设备建立通信连接后向所述调度模块返回新增成功消息;
所述指定设备接收到所述第二设备新增指令后,与其他设备建立通信连接,在确定与自身成功建立通信连接的设备数量为所述第二设备新增指令携带的设备数量时向所述调度模块返回新增成功消息;
所述调度模块若接收到所述多个设备中每个设备返回的所述新增成功消息且接收到所述指定设备返回的所述新增成功消息,则确定所述指定设备添加成功。
第二方面,提供了一种数据库系统,所述数据库系统包括调度模块和多个设备,所述多个设备中不同的设备用于存储不同版本的默克尔B+树中根节点的数据;
所述调度模块,用于向目标设备发送数据修改指令,所述数据修改指令携带目标根节点的数据和数据修改集,所述目标根节点为最新版本的所述默克尔B+树中的根节点,所述目标设备为所述多个设备中排序在存储有所述目标根节点的数据的设备后一位的设备,所述数据修改集包括待添加的键值对、待更新的键值对、和/或待删除的键;
所述目标设备,用于接收到所述数据修改指令后,根据所述目标根节点的数据和所述数据修改集指示所述多个设备中的至少一个设备获取从所述目标根节点至目标数据节点的节点路径中节点的数据以及更新所述节点路径中的节点;
所述目标设备,还用于将更新后的所述节点路径中根节点的数据存储至所述目标设备的磁盘页;
所述至少一个设备,用于将更新后的所述节点路径中除根节点之外的其他节点的数据存储至磁盘页。
第三方面,提供了一种数据处理方法,所述方法应用于数据库系统中的目标设备,所述数据库系统包括调度模块和多个设备,所述多个设备中不同的设备用于存储不同版本的默克尔B+树中根节点的数据,所述目标设备为所述多个设备中排序在存储有目标根节点的数据的设备后一位的设备,所述目标根节点为最新版本的所述默克尔B+树中的根节点,所述方法包括:
接收所述调度模块发送的数据修改指令,所述数据修改指令携带所述目标根节点的数据和数据修改集,所述数据修改集包括待添加的键值对、待更新的键值对、和/或待删除的键;
根据所述目标根节点的数据和所述数据修改集指示所述多个设备中的至少一个设备获取从所述目标根节点至目标数据节点的节点路径中节点的数据以及更新所述节点路径中的节点;
将更新后的所述节点路径中根节点的数据存储至所述目标设备的磁盘页,更新后的所述节点路径中除根节点之外的其他节点的数据由所述至少一个设备存储至磁盘页。
第四方面,提供了一种计算机设备,所述计算机设备包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现上述第一方面所述的数据处理方法中由调度模块或多个设备中的任意一个设备执行的操作。
第五方面,提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现上述第一方面所述的数据处理方法中由调度模块或多个设备中的任意一个设备执行的操作。
第六方面,提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述第一方面所述的数据处理方法中由调度模块或多个设备中的任意一个设备执行的操作。
可以理解的是,上述第二方面、第三方面、第四方面、第五方面、第六方面的有益效果可以参见上述第一方面中的相关描述,在此不再赘述。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实施例提供的一种默克尔B+树的示意图;
图2是本申请实施例提供的一种数据库系统的示意图;
图3是本申请实施例提供的一种数据处理方法的流程图;
图4是本申请实施例提供的一种节点路径的示意图;
图5是本申请实施例提供的另一种节点路径的示意图;
图6是本申请实施例提供的一种计算机设备的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请的实施方式作进一步地详细描述。
应当理解的是,本申请提及的“多个”是指两个或两个以上。在本申请的描述中,除非另有说明,“/”表示或的意思,比如,A/B可以表示A或B;本文中的“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,比如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,为了便于清楚描述本申请的技术方案,采用了“第一”、“第二”等字样对功能和作用基本相同的相同项或相似项进行区分。本领域技术人员可以理解“第一”、“第二”等字样并不对数量和执行次序进行限定,并且“第一”、“第二”等字样也并不限定一定不同。
在本申请中描述的“一个实施例”或“一些实施例”等语句意味着在本申请的一个或多个实施例中包括该实施例描述的特定特征、结构或特点。由此,在本申请中的不同之处出现的“在一个实施例中”、“在一些实施例中”、“在其他一些实施例中”、“在另外一些实施例中”等语句不是必然都参考相同的实施例,而是意味着“一个或多个但不是所有的实施例”,除非是以其他方式另外特别强调。此外,术语“包括”、“包含”、“具有”及它们的变形都意味着“包括但不限于”,除非是以其他方式另外特别强调。
在对本申请实施例进行详细地解释说明之前,先对本申请实施例的应用场景予以说明。
本申请实施例应用于基于默克尔B+树进行数据处理的场景中。比如,区块链系统中的执行模块在执行完一个区块中所有的交易后,会产生一系列的账本修改集。这种情况下,可以通过本申请实施例提供的数据处理方法来基于默克尔B+树处理这些账本修改集。
接下来对默克尔B+树的结构进行介绍。
默克尔B+树是一种树数据结构,默克尔B+树包含两种类型的节点:索引节点(indexNode)和处于最下层的数据节点(dataNode)。索引节点和数据节点均为逻辑节点。
数据节点中存放有多个键值对,每个键值对包括一个key值和一个value值。数据节点具有最小键和哈希值。数据节点的最小键是其存放的所有键值对的key值中最小的key值。可选地,数据节点的哈希值是其存放的所有键值对拼接得到的数据的哈希值。
索引节点中存放有其下属的所有节点中每个节点的最小键和哈希值。索引节点具有最小键和哈希值,索引节点的最小键是其存放的所有节点的最小键中最小的key值,索引节点的哈希值是其存放的所有节点的哈希值拼接得到的数据的哈希值。
示例地,图1是本申请实施例提供的一种默克尔B+树的示意图。参见图1,该默克尔B+树包括多个数据节点(图1中以节点n4、节点n5、节点n6为例)和多个索引节点(图1中以节点n1、节点n2、节点n3为例)。其中,节点n1的下属节点包括节点n2和节点n3,节点n2的下属节点包括节点n4和节点n5,节点n3的下属节点包括节点n6。在本申请实施例中,处于最上层的索引节点可以称为根节点,比如,图1中的节点n1为根节点。
图1中的数据节点n4存放有键值对key:a-value:1和键值对key:b-value:2。数据节点n5存放有键值对key:c-value:3和键值对key:d-value:4。数据节点n6存放有键值对key:e-value:5和键值对key:f-value:6。这种情况下,数据节点n4的最小键为key:a与key:b中的较小值key:a,数据节点n4的哈希值为key:a-value:1与key:b-value:2拼接得到的数据的哈希值hash:H(n4)。数据节点n5的最小键为key:c与key:d中的较小值key:c,数据节点n5的哈希值为key:c-value:3与key:d-value:4拼接得到的数据的哈希值hash:H(n5)。数据节点n6的最小键为key:e与key:f中的较小值key:e,数据节点n6的哈希值为key:e-value:5与key:f-value:6拼接得到的数据的哈希值hash:H(n6)。
图1中的索引节点n2存放有其下属的数据节点n4的最小键key:a、哈希值hash:H(n4)和其下属的数据节点n5的最小键key:c、哈希值hash:H(n5)。索引节点n3存放有其下属的数据节点n6的最小键key:e、哈希值hash:H(n6)。并且,索引节点n2的最小键为key:a与key:c中的较小值key:a,索引节点n2的哈希值为hash:H(n4)与hash:H(n5)拼接得到的数据的哈希值hash:H(n2)。索引节点n3的最小键为key:e,索引节点n3的哈希值为hash:H(n6)的哈希值hash:H(n3)。
图1中的索引节点n1(即根节点n1)存放有其下属的索引节点n2的最小键key:a、哈希值hash:H(n2)和其下属的索引节点n3的最小键key:e、哈希值hash:H(n3)。
默克尔B+树中除根节点之外的其他节点均具有键范围。具体来讲,对于默克尔B+树中任意一层的所有节点中任意的一个节点,若这个节点是这一层的第一个节点(一般为这一层中处于最左端的节点),则这个节点的键范围为小于这一层中位于这个节点后的下一个节点的最小键的范围。若这个节点是这一层的最后一个节点(一般为这一层中处于最右端的节点),则这个节点的键范围为大于或等于这个节点的最小键的范围。若这个节点是这一层中除第一个节点和最后一个节点之外的节点,则这个节点的键范围为大于或等于这个节点的最小键且小于这一层中位于这个节点后的下一个节点的最小键的范围。
比如,如图1所示,默克尔B+树中第二层包括索引节点n2和索引节点n3。索引节点n2为第二层的第一个节点,索引节点n2的键范围为小于索引节点n3的最小键key:e的范围,即索引节点n2的键范围为小于key:e的范围。索引节点n3为第二层的最后一个节点,索引节点n3的键范围为大于或等于索引节点n3的最小键key:e的范围,即索引节点n3的键范围为大于或等于key:e的范围。
默克尔B+树中的每个节点(包括索引节点和数据节点)存放的数据可存储在磁盘中,具体可以存储于磁盘的磁盘页中。在一些实施例中,为了适应磁盘的读写策略,通常规定每个磁盘页的大小为4K(千字节)。这种情况下,任意一个索引节点的数据中除了包含这个索引节点下属的每个节点的最小键和哈希值之外,还可以包含这个索引节点的页标识(identity,ID)和这个索引节点下属的每个节点的页标识。某个节点的页标识用于标识存储有这个节点的数据的磁盘页。也即,这个索引节点的页标识用于标识存储有这个索引节点的数据的磁盘页,这个索引节点下属的某个节点的页标识用于标识存储有这个索引节点下属的这个节点的数据的磁盘页。
目前,数据库可以基于默克尔B+树实现,也即,数据库的底层存储引擎可以为默克尔B+树结构。然而,在数据量持续增长的情况下,数据库的性能会在数据量积累到一定程度后,受单机内存大小和磁盘性能的影响,吞吐量表现持续下降。
为此,本申请实施例提出了一种新的数据库系统,该数据库系统是基于现有的数据库基本流程实现的新的分布式横向拓展方案,可以解决数据库的单机性能瓶颈,同时保证数据库的功能和协议的正确性,如保证数据的读、写、多版本控制、快速回滚等各种协议的正确性。
下面对本申请实施例提供的数据库系统涉及的相关概念进行说明。
将默克尔B+树中每个节点的数据存储至磁盘页后,相当于在磁盘中保存了默克尔B+树的逻辑树。这种情况下,可以记录默克尔B+树中根节点的页标识,根据默克尔B+树中根节点的页标识可以从磁盘中获取到默克尔B+树中所有的节点数据,因而默克尔B+树中根节点的页标识可以与磁盘中保存的默克尔B+树的逻辑树对应。当后续对默克尔B+树进行更新时,每更新一次,就会在磁盘中保存默克尔B+树的一个新版本的逻辑树,且会记录与这一版本的逻辑树对应的根节点的页标识(即更新后的默克尔B+树中根节点的页标识)。这种情况下,磁盘中不仅保存有最新版本的逻辑树,还保存有至少一个历史版本的逻辑树。可以记录与最新版本的逻辑树对应的根节点的页标识,还可以记录与该至少一个历史版本中每个历史版本的逻辑树对应的根节点的页标识。
需说明的是,在多版本控制和数据回滚方面,由于默克尔B+树相当于在磁盘中保存了多个逻辑树,当默克尔B+树需要回滚到某个版本时,只需要将当前根节点指向这个版本的逻辑树的根节点即可。
下面对本申请实施例提供的数据库系统进行说明。
本申请实施例提供的数据库系统保留了现有的基于默克尔B+树的单机数据库(可称为vidb(Verified Independent Database,经过验证的独立数据库))已经支持的功能,以保证该数据库系统可以适用于现有的需要应用默克尔B+树进行数据处理的系统。比如,该数据库系统可以适用于区块链系统,区块链系统可以对该数据库系统进行数据读写,比如,区块链系统可以从该数据库系统中查询数据、向该数据库系统中添加数据、对该数据库系统中的数据进行更新或删除等。
本申请实施例以“数据库为满足数据回滚需要,要保留有限的多版本数据”以及“多版本控制的模式为cow(copy on write,写时拷贝)”为出发点,提出了每一台设备(也可称为物理机)对应一个版本的逻辑树的策略,整体上实现了一个分布在N台设备上的分布式数据库方案。其中,N为大于或等于2的整数。可选地,N大于或等于预设版本数量。预设版本数量为默克尔B+树可支持的回滚版本的数量,示例地,预设版本数量与区块链系统的回滚限制相关,即预设版本数量可以为区块链系统允许回滚的最大范围。
图2是本申请实施例提供的一种数据库系统的示意图。参见图2,该数据库系统可以包括:调度模块201和多个设备202。
调度模块201可以与多个设备202中的每个设备202进行通信,比如,调度模块201与任意一个设备202可以通过有线连接或无线连接进行通信。多个设备202中任意的两个设备202也可以进行通信,比如,任意两个设备202可以通过有线连接或无线连接进行通信。
调度模块201可以是独立的物理机,也可以是其他系统中的一部分,比如,调度模块201可以设置于区块链系统中。可选地,一方面,调度模块201负责对接和管理区块链系统中的区块执行进度,并且,调度模块201对外暴露一个提供基本读写接口的API(Application Program Interface,应用程序接口)层供区块链系统使用。另一方面,调度模块201需要维护与多个设备202的连接,负责感知多个设备202的执行进度、存活状况等。
该数据库系统的底层存储引擎使用多个设备202。每个设备202可对应一个版本的默克尔B+树。不同的设备202对应不同版本的默克尔B+树。不同的设备202用于存储不同版本的默克尔B+树中根节点的数据。如此,根据任意一个设备202中存储的根节点的数据可获得对应版本的默克尔B+树中所有的节点数据,从而实现了一个设备202与一个版本的默克尔B+树的对应。
对于任意的一个设备202,这个设备202独立维护index数据管理、index文件存储、data数据管理和data文件存储的功能,其中,index数据为索引节点的数据,data数据为数据节点的数据。这个设备202不仅存储有其对应版本的默克尔B+树中根节点的数据,还可以存储有其对应版本的默克尔B+树中除根节点之外的其他一个或多个节点的数据,进一步还可以存储有其他版本的默克尔B+树中除根节点之外的其他一个或多个节点的数据。
对于任意的一个设备202,index数据和data数据在这个设备202的内存中以逻辑节点进行管理,在这个设备202的磁盘上按照磁盘页为单位进行组织,磁盘页也可称为page,通常为4K的字节数组。每一个磁盘页具有全局唯一的页标识(pageID)。在本申请实施例提供的分布式架构下,页标识需要能够表示设备信息和磁盘页信息,也即,页标识用于标识某个设备202中的某个磁盘页。示例地,页标识可以包括设备标识和偏移位置,该设备标识用于标识设备202,该偏移位置用于指示磁盘页在该设备标识所标识的设备202中的文件偏移位置。比如,页标识可以为uint64类型,这种情况下,可以使用其前8bit(比特)或16bit来表示设备标识,使用其他比特来表示偏移位置。如此,可以通过页标识快速的索引到一个确定的设备202,并能够获得磁盘页在这个设备202上文件中的偏移位置,从而通过页标识可以唯一定位到一个设备202中的一个磁盘页。
在本申请实施例中,多版本控制机制因分布式架构变为了单机上仅需要维护一个活跃版本。一方面将多版本数据分散到了多台设备202上,降低了单台设备202的数据存储量;另一方面,区块执行过程中读取数据造成的磁盘读I/O(Input/Output,输入/输出)和账本修改集写入磁盘造成的磁盘写I/O都从单机分散到了多台设备202上。因而相比于相关技术中单机同时维护多个活跃版本的方式,本申请实施例提供的分布式架构大幅度减少了单机磁盘资源的开销,节省了单机的处理资源。
在一些实施例中,区块链系统中的执行模块在执行某个区块中的交易的过程中会产生需要查询的键,该执行模块可以调用该API层提供的读写接口向调度模块201发送携带有待查询的键的数据查询请求。调度模块201接收到该数据查询请求后可以根据目标根节点的页标识从多个设备202中查询该数据查询请求携带的键对应的值并返回给该执行模块,目标根节点为最新版本的默克尔B+树中的根节点。
在一些实施例中,该执行模块在执行完某个区块中所有的交易后会产生一系列的账本修改集,这些账本修改集可以包括需要添加的键值对、需要更新的键值对、和/或需要删除的键等,这种情况下,该执行模块可以调用该API层提供的读写接口向调度模块201发送携带有待添加的键值对、待更新的键值对、和/或待删除的键的数据修改请求。调度模块201接收到该数据修改请求后可以确定这个区块的执行进度为正在执行,并根据目标根节点的页标识和该数据修改请求携带的键值对和/或键更新多个设备202中存储的默克尔B+树。这种情况下,若多个设备202实现对更新后的默克尔B+树的持久化,即将更新后的默克尔B+树中所有的节点数据均存储在了磁盘页中,则调度模块201可以确定这个区块的执行进度为已落盘。
在一些实施例中,调度模块201负责接收区块链系统中的计算请求(包括上述的数据修改请求)和持久化请求,并组织成网络请求交付给下层一个确定的设备202进行执行。有了调度模块201的协调机制,底层真正处理请求的设备202可以最大程度的异步执行核心流程(如完成批量更新操作后可以直接提交给后台进行异步刷盘),调度模块201负责协调上层的区块链系统与下层的设备202之间的执行差距。
下层的每个设备202都持有一个默克尔B+树的根节点,根据树形数据结构的特点,每个设备202可以通过自身持有的根节点的数据与其他设备202进行网络通讯,以获得当前版本下完整的默克尔B+树的节点数据。如此,一个设备202可以从根节点开始,通过与其他设备202的协同,负责控制完成默克尔B+树的更新,也就完成了一个区块的执行流程。在完成对默克尔B+树的更新后,一个设备202还可以通过与其他设备202的协同,完成对更新后的默克尔B+树的持久化,也就完成了一个区块的落盘流程。
需要说明的是,多个设备202中的每个设备202可以循环处理区块对应的计算请求,以实现区块的执行。也即,在某个区块对应的计算请求是由某个设备202处理后,这个区块的下一个区块对应的计算请求可以由这个设备202的下一个设备202进行处理。如此,可以使得多个设备202中的每个设备202均维护在执行一个区块对应的计算请求后获得的对应版本的默克尔B+树。
在本申请实施例提供的数据库系统中,多个设备202存储多版本信息,从而不仅减少了单机存储多个版本导致的资源消耗,又能天然实现多版本控制协议,如此降低了单机数据存储与多版本维护的压力。另外,底层的多个设备202的数量可以随着系统不断运行动态增删,也即,用户可以自定义底层的多个设备202的数量,如此可以实现动态的横向拓展。
下面对基于该数据库系统构建初始的默克尔B+树的过程进行说明,该过程可以包括如下步骤(1)-步骤(4):
(1)调度模块获取待存储的多个键值对。
该多个键值对是需要基于默克尔B+树进行存储的键值对。该多个键值对是用于构建初始默克尔B+树的键值对。
该多个键值对可以由其他系统发送给调度模块。比如,区块链系统中的执行模块在执行完一个区块中所有的交易后,会产生一系列的账本修改集,这些账本修改集可以包括需要存储的多个键值对。这种情况下,区块链系统中的执行模块可以将该多个键值对携带于数据存储请求中发送给调度模块,以指示调度模块基于默克尔B+树对该多个键值对进行存储,此时调度模块即可根据该多个键值对构建初始默克尔B+树。
区块链系统中存在着区块标识(如区块号)这一天然的全局时钟,区块标识是连续递增的。在一些实施例中,该数据存储请求中可以携带区块标识,该区块标识用于指示是在执行哪个区块中的交易后产生的该数据存储请求。调度模块可以将该数据存储请求中携带的区块标识确定为当前区块的区块标识。
(2)调度模块向多个设备中的一个设备发送携带有该多个键值对的数据存储指令,该数据存储指令用于指示根据待存储的该多个键值对构建初始默克尔B+树。
可选地,调度模块可以从该多个设备中随机选择一个设备,向这个设备发送该数据存储指令。
或者,调度模块可以根据该多个设备中每个设备的设备标识,选择设备标识最小的一个设备,向这个设备发送该数据存储指令。比如,该多个设备的数量为10,这10个设备的设备标识分别为0至9,则调度模块可以向设备标识为0的设备发送该数据存储指令。
或者,调度模块可以根据当前区块的区块标识从该多个设备中选择一个设备,向这个设备发送该数据存储指令。可选地,当前区块的区块标识与能够执行当前区块的设备(此处是指能够处理当前区块对应的数据存储指令的设备)的设备标识之间可以具有关联关系,可选地,此关联关系可以由技术人员事先设置得到。比如,该多个设备的数量为10,这10个设备的设备标识分别为0至9,当前区块的区块标识为0,这种情况下,能够执行当前区块的设备的设备标识可以由当前区块的区块标识对该多个设备的数量取模得到,即由0对10取模得到0,将设备标识为0的设备确定为能够执行当前区块的设备。
(3)这个设备根据该多个键值对构建默克尔B+树。
根据该多个键值对构建默克尔B+树,即是将该多个键值对存放至默克尔B+树中的数据节点。
默克尔B+树中的数据节点包含键值对。数据节点具有最小键和哈希值。数据节点的最小键是其包含的所有键值对的key值中最小的key值。可选地,数据节点的哈希值是其包含的所有键值对拼接得到的数据的哈希值。默克尔B+树中的索引节点包含其下属的所有节点中每个节点的最小键和哈希值。索引节点具有最小键和哈希值,索引节点的最小键是其包含的所有节点的最小键中最小的key值,索引节点的哈希值是其包含的所有节点的哈希值拼接得到的数据的哈希值。
这个设备根据该多个键值对构建默克尔B+树的操作与相关技术中某个设备根据多个键值对构建默克尔B+树的操作类似,本申请实施例对此不进行详细阐述。
需注意的一点是,这个设备在构建默克尔B+树的过程中,可以为默克尔B+树中新生成的每个节点分配页标识,任意一个节点的页标识用于标识后续用来存储这个节点的数据的设备和磁盘页。这种情况下,对于任意一个索引节点,这个设备还可以在这个索引节点的数据中添加这个索引节点的页标识以及这个索引节点下属的每个节点的页标识。可以理解的,某个设备为默克尔B+树中的某个节点分配页标识,说明这个节点的数据后续将存储至这个设备的磁盘页,也即,某个设备为某个节点所分配的页标识中的设备标识是这个设备的设备标识,这个设备所分配的页标识用于标识这个设备和这个设备中的磁盘页。
需注意的另一点是,默克尔B+树中每个节点的数据量均小于或等于预设数据量。其中,预设数据量可以预先进行设置,如预设数据量可以与磁盘页的存储空间大小(如4K)相同。
(4)这个设备将默克尔B+树中每个节点的数据存储至这个设备的磁盘页。
这个设备将默克尔B+树中每个节点的数据存储至这个设备的磁盘页时,可以根据默克尔B+树中每个节点的页标识将每个节点的数据存储至对应的磁盘页中,以实现对默克尔B+树的持久化。
需要说明的是,这个设备将默克尔B+树中每个节点的数据存储至这个设备的磁盘页后,相当于在磁盘中保存了这一版本的默克尔B+树的逻辑树。这种情况下,这个设备还可以记录默克尔B+树中根节点的页标识,根据默克尔B+树中根节点的页标识可以通过根节点逐层获取到默克尔B+树中所有的节点数据,即可以从磁盘中获取到默克尔B+树中所有的节点数据,因而默克尔B+树中根节点的页标识可以与磁盘中保存的这一版本的默克尔B+树的逻辑树对应。
可选地,这个设备在上述步骤(3)中根据该多个键值对构建默克尔B+树之后,还可以将默克尔B+树中根节点的数据发送给调度模块,如此调度模块可以确定当前区块的执行进度为已执行完成。之后,调度模块可以根据该根节点的数据获取该根节点的哈希值(merkle-root),并将该根节点的哈希值返回给上层的区块链系统。并且,调度模块还可以记录该根节点的页标识与当前区块的区块标识之间的映射关系,以便可以确定该根节点的页标识与哪一版本的默克尔B+树对应。需注意的是,区块链系统在接收到调度模块发送的该根节点的哈希值后,可以确定当前区块已执行完成,此时区块链系统可以开始执行下一个区块。
在一些实施例中,这个设备在上述步骤(3)中构建默克尔B+树之后,可以直接执行上述步骤(4),以将所构建的默克尔B+树中每个节点的数据存储至这个设备的磁盘页,在存储完成后向调度模块发送持久化完成消息。调度模块接收到持久化完成消息后,确定当前区块的执行进度为已落盘。之后,调度模块向区块链系统发送持久化完成消息,以指示当前区块已落盘。
在另一些实施例中,区块链系统接收到调度模块发送的该根节点的哈希值之后,可以向调度模块发送持久化请求。调度模块接收到该持久化请求后,可以向负责执行当前区块的这个设备发送提交(commit)请求。这个设备接收到该提交请求后,再执行上述步骤(4),以将所构建的默克尔B+树中每个节点的数据存储至这个设备的磁盘页,在存储完成后向调度模块发送持久化完成消息。调度模块接收到持久化完成消息后,确定当前区块的执行进度为已落盘。之后,调度模块向区块链系统发送持久化完成消息,以指示当前区块已落盘。
在通过上述步骤(1)至步骤(4)构建初始的默克尔B+树,并在设备的磁盘中保存了默克尔B+树中所有的节点数据后,后续就可以基于默克尔B+树进行数据处理。下面对本申请实施例提供的数据处理方法进行详细地解释说明。
图3是本申请实施例提供的一种数据处理方法的流程图,该方法可以应用于图2所示的数据库系统。参见图3,该方法包括以下步骤:
步骤301:调度模块向目标设备发送数据修改指令,该数据修改指令携带目标根节点的数据和数据修改集。
目标根节点为最新版本的默克尔B+树中的根节点。调度模块中记录有最新版本的默克尔B+树中根节点的数据,还记录有一个或多个历史版本中每个历史版本的默克尔B+树中根节点的数据。
该数据修改指令用于指示基于该数据修改指令携带的数据修改集更新默克尔B+树,该数据修改集可以包括待添加的键值对、待更新的键值对、和/或待删除的键。该数据修改集可以由其他系统发送给调度模块。比如,区块链系统中的执行模块在执行完一个区块中所有的交易后会产生一系列的账本修改集,这些账本修改集可以包括需要添加的键值对、需要更新的键值对、和/或需要删除的键。这种情况下,该执行模块可以向调度模块发送携带有待添加的键值对、待更新的键值对、和/或待删除的键的数据修改请求。调度模块接收到该数据修改请求后,可以将待添加的键值对、待更新的键值对、和/或待删除的键作为数据修改集携带于数据修改指令中发送给目标设备。可选地,该数据修改请求中还可以携带区块标识,该区块标识用于指示是在执行哪个区块中的交易后产生的该数据修改请求。调度模块可以将该数据修改请求中携带的区块标识确定为当前区块的区块标识,且可以将该区块标识也携带于该数据修改指令中,该数据修改指令中的区块标识用于标识该数据修改指令中的数据修改集对应的区块。
可选地,本申请实施例中的默克尔B+树可支持批量修改。这种情况下,该数据修改集包括的待添加的键值对、待更新的键值对、和/或待删除的键的数量可以为多个,据此可以实现对默克尔B+树中节点的并发更新。
目标设备为多个设备中排序在存储有目标根节点的数据的设备后一位的设备。该多个设备可以循环执行区块,这种情况下,存储有目标根节点的数据的设备是执行上一个区块的设备,因而可以将该设备的后一位的设备作为执行当前区块的目标设备。
需注意的是,若该多个设备已执行完成的区块数量大于或等于该多个设备的数量,则该多个设备中每个设备均存储有一个版本的默克尔B+树中根节点的数据,这种情况下,存储有目标根节点的数据的设备对应最新版本的默克尔B+树,排序在该设备的后一位的设备(即目标设备)对应最旧版本的默克尔B+树。由于该多个设备的数量大于或等于预设版本数量,所以目标设备对应的最旧版本的默克尔B+树的节点数据已经得到最终确认,该最旧版本的默克尔B+树的节点数据都是可以释放的状态,这种情况下,被后续版本覆盖的节点数据可以从磁盘页中删除。如此,后续目标设备在执行当前区块后产生的新版本的默克尔B+树的节点数据可以覆盖旧版本的默克尔B+树的节点数据。
在一些实施例中,该多个设备的排序可以事先设置并记录在调度模块。调度模块可以根据记录的目标根节点的页标识确定存储有目标根节点的数据的设备,然后可以将排序在该设备的后一位的设备确定为目标设备。
在另一些实施例中,区块标识与设备标识之间可以具有关联关系,可选地,此关联关系可以由技术人员事先设置得到。比如,该多个设备的数量为10,这10个设备的设备标识分别为0至9,且这10个设备上分别存储了10至19这10个版本的默尔克B+树中根节点的数据。假设当前区块的区块标识为20,这种情况下,目标设备的设备标识可以由当前区块的区块标识对该多个设备的数量取模得到,即由20对10取模得到0,将设备标识为0的设备确定为目标设备。
步骤302:目标设备接收到该数据修改指令后,根据目标根节点的数据和该数据修改集指示该多个设备中的至少一个设备获取从目标根节点至目标数据节点的节点路径中节点的数据以及更新该节点路径中的节点。
目标数据节点是该数据修改集指示更新的数据节点,也即是将该数据修改集中的键值对和/或键分发至的数据节点。具体来讲,对于该数据修改集中待添加的键值对,目标数据节点为该键值对所需插入的数据节点。对于该数据修改集中待更新的键值对,目标数据节点为存放有该键值对的key值的数据节点。对于该数据修改集中的待删除的键(即key值),目标数据节点为存放有该key值的数据节点。
可选地,步骤302可以通过如下第一种方式或第二种方式实现:
第一种方式:目标设备接收到该数据修改指令后,根据目标根节点的数据和该数据修改集中的key值获取从目标根节点至目标数据节点的节点路径中节点的数据,根据该数据修改集更新该节点路径中的节点。
这种情况下,步骤302中所述的至少一个设备为目标设备。也即,目标设备可以直接获取从目标根节点至目标数据节点的节点路径中节点的数据并更新该节点路径中的节点。
目标根节点的数据包含目标根节点的页标识,以及包含目标根节点下属的每个节点的最小键和哈希值,以及包含目标根节点下属的每个节点的页标识。
这种情况下,对于该数据修改集中任意的一个待添加的键值对的key值,或对于该数据修改集中任意的一个待更新的键值对的key值,或对于该数据修改集中任意的一个待删除的键(即key值),目标设备可以将该key值和目标根节点下属的每个节点的键范围进行比对,以确定该key值处于目标根节点下属的哪个节点的键范围。之后,目标设备根据目标根节点的数据中包含的这个节点的页标识获取对应的设备中的磁盘页中存储的这个节点的数据。
目标设备在通过上述方式获取到目标根节点下属的一个节点的数据后,若这个节点为数据节点,则目标设备可以确定这个数据节点为目标数据节点,此时就获取到了目标数据节点的数据,从而也就获取到了目标根节点至目标数据节点的节点路径中节点的数据。
而若这个节点为索引节点,则目标设备可以根据这个索引节点的数据,继续将该key值与这个索引节点下属的每个节点的键范围进行比对,以确定该key值处于这个索引节点下属的哪个节点的键范围。之后,根据这个索引节点的数据中包含的这个节点的页标识获取对应的设备中的磁盘页中存储的这个节点的数据。这种情况下,若这个节点为索引节点,则继续重复上述过程,直至确定该key值处于某个数据节点的键范围,并获取到这个数据节点的数据为止,这个数据节点即为目标数据节点,从而也就获取到了目标根节点至目标数据节点的节点路径中节点的数据。
需说明的是,上述根据该key值获取目标数据节点的数据的过程可以称为是将该key值在默克尔B+树中从目标根节点分发至目标数据节点的过程,也即是将该key值所属的待添加的键值对、待更新的键值对或待删除的键在默克尔B+树中从目标根节点分发至目标数据节点的过程。该key值处于目标数据节点的键范围。
在一些实施例中,目标设备根据某个页标识获取对应的设备中的磁盘页中存储的节点数据时,是根据这个页标识将对应的设备中的磁盘页中存储的节点数据读取到目标设备的内存,继而后续目标设备可以在目标设备的内存中对节点数据进行更新。
需注意的是,该数据修改集中任意一个待添加的键值对可以对应一个目标数据节点,这个目标数据节点即是该键值对所需插入的数据节点。该数据修改集中任意一个待更新的键值对可以对应一个目标数据节点,这个目标数据节点即是存放有该键值对的key值的数据节点。该数据修改集中任意一个待删除的键(即key值)可以对应一个目标数据节点,这个目标数据节点即是存放有该key值的数据节点。如此,该数据修改集可以对应至少一个目标数据节点,每个目标数据节点对应一个或多个待添加的键值对、一个或多个待更新的键值对、和/或一个或多个待删除的键。
这种情况下,目标设备在获取到从目标根节点至目标数据节点的节点路径中节点的数据后,可以通过如下方式1或方式2来根据该数据修改集更新该节点路径中的节点,下面对此进行说明:
方式1的操作如下:
对于该数据修改集对应的所有目标数据节点中任意的一个目标数据节点,若这个目标数据节点存在对应的待添加的键值对,则目标设备在这个目标数据节点的数据中添加该键值对;若这个目标数据节点存在对应的待更新的键值对,则目标设备将这个目标数据节点的数据中的指定键值对更新为该键值对,指定键值对的key值与该键值对的key值相同;若这个目标数据节点存在对应的待删除的键,则目标设备在这个目标数据节点的数据中删除该键所属的键值对。如此,可以完成对这个目标数据节点的更新。
若更新后的目标数据节点为空,即更新后的目标数据节点不包含数据,则目标设备将目标数据节点上属的索引节点的数据中指向目标数据节点的索引项(包括目标数据节点的最小键、哈希值和页标识)删除,且将该索引节点的数据中包含的该索引节点的页标识删除,以更新该索引节点。若更新后的索引节点为空,则目标设备继续向上回溯更新上属的索引节点,直至更新至根节点;若更新后的索引节点不为空,则目标设备为更新后的索引节点分配页标识,然后根据更新后的索引节点的最小键、哈希值和页标识,继续向上回溯更新上属的索引节点,直至更新至根节点。如此,就完成了对该节点路径中节点的更新。
若更新后的目标数据节点不为空,且更新后的目标数据节点的数据量小于或等于预设数据量,则无需执行数据节点分裂操作;若更新后的目标数据节点的数据量大于预设数据量,则需要执行数据节点分裂操作。并且,在根据更新后的目标数据节点更新了默克尔B+树中的索引节点后,若更新后的索引节点的数据量小于或等于预设数据量,则无需执行索引节点分裂操作;若更新后的索引节点的数据量大于预设数据量,则需要执行索引节点分裂操作。下面对此进行详细说明:
在一些实施例中,若更新后的目标数据节点不为空,且更新后的目标数据节点的数据量小于或等于预设数据量,则目标设备为更新后的目标数据节点分配页标识,且将更新后的目标数据节点包含的所有key值中最小的key值确定为更新后的目标数据节点的最小键,将更新后的目标数据节点包含的所有键值对拼接得到的数据的哈希值确定为更新后的目标数据节点的哈希值。目标设备根据更新后的目标数据节点的最小键、哈希值和页标识更新默克尔B+树中的索引节点。具体来讲,目标设备根据更新后的目标数据节点的最小键、哈希值和页标识更新目标数据节点上属的索引节点的数据中指向目标数据节点的索引项,且将该索引节点的数据中包含的该索引节点的页标识删除,以更新该索引节点。之后,目标设备为更新后的索引节点分配页标识,然后根据更新后的索引节点的最小键、哈希值和页标识,继续向上回溯更新上属的索引节点,直至更新至根节点。如此,就完成了对该节点路径中节点的更新。
在另一些实施例中,若更新后的目标数据节点不为空,且更新后的目标数据节点的数据量大于预设数据量,则将更新后的目标数据节点分裂为至少两个数据节点,该至少两个数据节点中每个数据节点的数据量小于或等于预设数据量,该至少两个数据节点中每个数据节点包含至少一个键值对。对于该至少两个数据节点中任意的一个数据节点,目标设备为这个数据节点分配页标识,且将这个数据节点包含的所有key值中最小的key值确定为这个数据节点的最小键,将这个数据节点包含的所有键值对拼接得到的数据的哈希值确定为这个数据节点的哈希值。之后,目标设备根据该至少两个数据节点中每个数据节点的最小键、哈希值和页标识更新默克尔B+树中的索引节点。具体来讲,目标设备将目标数据节点上属的索引节点的数据中目标数据节点的索引项更新为该至少两个数据节点中每个数据节点的索引项(包括数据节点的最小键、哈希值和页标识),且将该索引节点的数据中包含的该索引节点的页标识删除,以更新该索引节点。若更新后的索引节点的数据量小于或等于预设数据量,则目标设备为更新后的索引节点分配页标识,然后根据更新后的索引节点的最小键、哈希值和页标识,继续向上回溯更新上属的索引节点,直至更新至根节点;若更新后的索引节点的数据量大于预设数据量,则将更新后的索引节点分裂为至少两个索引节点,该至少两个索引节点中每个索引节点的数据量小于或等于预设数据量,该至少两个索引节点中每个索引节点包含至少一个数据节点的索引项,目标设备为该至少两个索引节点中每个索引节点分配页标识,然后根据该至少两个索引节点中每个索引节点的最小键、哈希值和页标识,继续向上回溯更新上属的索引节点,直至更新至根节点。如此,就完成了对该节点路径中节点的更新。
方式2的操作如下:
作为一种示例,若该节点路径的树高(即层数)小于或等于预设高度,则目标设备按照上述方式1来根据该数据修改集更新该节点路径中的节点。
预设高度可以预先进行设置,且预设高度可以设置的较小,如预设高度可以为3等。
根据树形数据结构的特征,当树高很低时整棵树的数据量较小,因而这个阶段即便在设备间传输完整的发生修改的节点路径,传输代价也相对较小。因此,在该节点路径的树高较低时,目标设备可以直接更新该节点路径中的节点,且更新过程中为更新后的该节点路径中的每个节点分配页标识,以便后续可以将更新后的该节点路径中每个节点的数据存储至目标设备的磁盘页。这种情况下,即使后续更新默克尔B+树时需要目标设备将目标设备中存储的节点数据传输至其他设备,也可以保证较小的传输代价。
比如,预设高度为3,如图4所示,该节点路径的树高为3,等于预设高度,因而目标设备可以直接更新该节点路径中的节点,且在更新过程中为更新后的该节点路径中的每个节点分配页标识。如此,后续目标设备可以根据更新后的该节点路径中每个节点的页标识,将更新后的该节点路径中每个节点的数据存储至目标设备的磁盘页。
作为另一种示例,若该节点路径的树高大于预设高度,则目标设备将该节点路径分为m段路径,m段路径由上层至下层依序划分,m段路径中的第1段路径包括根节点,m段路径中的第m段路径包括目标数据节点,且m段路径中每段路径的树高小于或等于预设高度,m为大于或等于2的整数。其中,对于m段路径中除第1段路径之外的m-1段路径中的每段路径与多个设备中除目标设备之外的其他设备对应。可选地,该m-1段路径可以与多个设备中除目标设备之外的m-1个设备一一对应,或者,该m-1段路径中的多段路径也可以与多个设备中除目标设备之外的同一个设备对应。
对于第m段路径,目标设备根据该数据修改集更新第m段路径中的节点,且在更新过程中不为更新后的第m段路径中的节点分配页标识。
具体来讲,对于第m段路径中的目标数据节点,若目标数据节点存在对应的待添加的键值对,则目标设备在目标数据节点的数据中添加该键值对;若目标数据节点存在对应的待更新的键值对,则目标设备将目标数据节点的数据中的指定键值对更新为该键值对,指定键值对的key值与该键值对的key值相同;若目标数据节点存在对应的待删除的键,则目标设备在目标数据节点的数据中删除该键所属的键值对。如此,可以完成对目标数据节点的更新。
若第m段路径仅包括目标数据节点,不包括目标数据节点上属的索引节点,则目标设备在完成对目标数据节点的更新后,即完成了对第m段路径中节点的更新。
若第m段路径不仅包括目标数据节点,还包括目标数据节点上属的索引节点,则目标设备在更新后的目标数据节点为空,即更新后的目标数据节点不包含数据的情况下,将目标数据节点上属的索引节点的数据中指向目标数据节点的索引项(包括目标数据节点的最小键、哈希值和页标识)删除,且将该索引节点的数据中包含的该索引节点的页标识删除,以更新该索引节点。若更新后的索引节点为空,则目标设备继续向上回溯更新上属的索引节点,直至更新至第m段路径中最上层的节点;若更新后的索引节点不为空,则目标设备根据更新后的索引节点的最小键和哈希值,继续向上回溯更新上属的索引节点,直至更新至第m段路径中最上层的节点。如此,就完成了对第m段路径中节点的更新。
若第m段路径不仅包括目标数据节点,还包括目标数据节点上属的索引节点,则目标设备在更新后的目标数据节点不为空,且更新后的目标数据节点的数据量小于或等于预设数据量的情况下,无需执行数据节点分裂操作;若更新后的目标数据节点的数据量大于预设数据量,则需要执行数据节点分裂操作。并且,在根据更新后的目标数据节点更新了第m段路径中的索引节点后,若更新后的索引节点的数据量小于或等于预设数据量,则无需执行索引节点分裂操作;若更新后的索引节点的数据量大于预设数据量,则需要执行索引节点分裂操作。下面对此进行详细说明:
在一些实施例中,若更新后的目标数据节点不为空,且更新后的目标数据节点的数据量小于或等于预设数据量,则目标设备将更新后的目标数据节点包含的所有key值中最小的key值确定为更新后的目标数据节点的最小键,将更新后的目标数据节点包含的所有键值对拼接得到的数据的哈希值确定为更新后的目标数据节点的哈希值。目标设备根据更新后的目标数据节点的最小键和哈希值更新第m段路径中的索引节点。具体来讲,目标设备根据更新后的目标数据节点的最小键和哈希值更新目标数据节点上属的索引节点的数据中指向目标数据节点的索引项中的最小键和哈希值,且将该索引项中的页标识删除,然后将该索引节点的数据中包含的该索引节点的页标识删除,以更新该索引节点。之后,目标设备根据更新后的索引节点的最小键和哈希值,继续向上回溯更新上属的索引节点,直至更新至第m段路径中最上层的节点。如此,就完成了对第m段路径中节点的更新。
在另一些实施例中,若更新后的目标数据节点不为空,且更新后的目标数据节点的数据量大于预设数据量,则将更新后的目标数据节点分裂为至少两个数据节点,该至少两个数据节点中每个数据节点的数据量小于或等于预设数据量,该至少两个数据节点中每个数据节点包含至少一个键值对。对于该至少两个数据节点中任意的一个数据节点,目标设备将这个数据节点包含的所有key值中最小的key值确定为这个数据节点的最小键,将这个数据节点包含的所有键值对拼接得到的数据的哈希值确定为这个数据节点的哈希值。之后,目标设备根据该至少两个数据节点中每个数据节点的最小键和哈希值更新第m段路径中的索引节点。具体来讲,目标设备将目标数据节点上属的索引节点的数据中目标数据节点的索引项更新为该至少两个数据节点中每个数据节点的索引项(包括数据节点的最小键和哈希值),且将该索引节点的数据中包含的该索引节点的页标识删除,以更新该索引节点。若更新后的索引节点的数据量小于或等于预设数据量,则目标设备根据更新后的索引节点的最小键和哈希值,继续向上回溯更新上属的索引节点,直至更新至第m段路径中最上层的节点;若更新后的索引节点的数据量大于预设数据量,则将更新后的索引节点分裂为至少两个索引节点,该至少两个索引节点中每个索引节点的数据量小于或等于预设数据量,该至少两个索引节点中每个索引节点包含至少一个数据节点的索引项,目标设备根据该至少两个索引节点中每个索引节点的最小键和哈希值,继续向上回溯更新上属的索引节点,直至更新至第m段路径中最上层的节点。如此,就完成了对第m段路径中节点的更新。
目标设备在完成对第m段路径中节点的更新后,可以将更新后的第m段路径中节点的数据发送给第m段路径对应的设备。该设备可以为更新后的第m段路径中的每个节点分配页标识,且在第m段路径中每个索引节点的数据中添加这个索引节点的页标识和这个索引节点的下属节点的页标识,具体可以在这个索引节点的下属节点的索引项中添加节点的页标识。如此该设备后续可以根据更新后的第m段路径中每个节点的页标识,将更新后的第m段路径中每个节点的数据存储至该设备的磁盘页。并且,该设备可以将更新后的第m段路径中最上层的节点的页标识返回给目标设备。
之后,对于第m-1段路径,若第m-1段路径为第1段路径,则目标设备根据更新后的第m段路径中最上层的节点的最小键、哈希值和页标识更新第1段路径中的节点,且在更新过程中为更新后的第1段路径中的节点分配页标识。如此,就完成了对该节点路径中节点的更新。
若第m-1段路径不为第1段路径,则目标设备根据更新后的第m段路径中最上层的节点的最小键、哈希值和页标识更新第m-1段路径中的节点,且与第m段路径类似的,目标设备在更新过程中不为更新后的第m-1段路径中的节点分配页标识。并且,目标设备在完成对第m-1段路径中节点的更新后,与第m段路径类似的,可以将更新后的第m-1段路径中节点的数据发送给第m-1段路径对应的设备。该设备可以为更新后的第m-1段路径中每个节点分配页标识,且在第m-1段路径中每个索引节点的数据中添加这个索引节点的页标识和这个索引节点的下属节点的页标识,以便该设备后续可以根据更新后的第m-1段路径中每个节点的页标识,将更新后的第m-1段路径中每个节点的数据存储至该设备的磁盘页。并且,该设备可以将更新后的第m-1段路径中最上层的节点的页标识返回给目标设备。
之后,类似的,若第m-2段路径为第1段路径,则目标设备根据更新后的第m-1段路径中最上层的节点的最小键、哈希值和页标识更新第1段路径中的节点,且在更新过程中为更新后的第1段路径中的节点分配页标识。若第m-2段路径不为第1段路径,则目标设备根据更新后的第m-1段路径中最上层的节点的最小键、哈希值和页标识更新第m-2段路径中的节点,且在更新过程中不为更新后的第m-2段路径中的节点分配页标识,而是将更新后的第m-2段路径中的节点的数据发送给第m-2段路径对应的设备,由该设备为更新后的第m-2段路径中每个节点分配页标识,且在更新后的第m-2段路径中的每个索引节点的数据中添加这个索引节点的页标识和这个索引节点的下属节点的页标识,然后将更新后的第m-2段路径中最上层的节点的页标识发送给目标设备。以此类推,直至目标设备根据更新后的第2段路径中最上层的节点的最小键、哈希值和页标识更新第1段路径中的节点,且在更新过程中为更新后的第1段路径中的节点分配页标识为止。
需说明的是,随着树高不断变高,一条完整的节点路径的数据量也越来越大,这种情况下可以考虑将节点路径划分为几段,分别传输到不同的设备上,对应的设备可以为一段路径中的节点分配页标识,以便后续可以将这一段路径中节点的数据存储至该设备的磁盘页。这样做可以保证从节点路径上某一个节点开始,后续的连续几个节点都在同一台设备的本地存放,如此,在后续更新默克尔B+树时设备可以有较大可能在本地直接获取到连续几个节点的数据,从而可以降低处理延迟。
可选地,与该m段路径中除第1段路径之外的m-1段路径对应的至少一个设备可以是排序在目标设备后的至少一个设备。由于目标设备后一位的设备是执行下一个区块的设备,所以将更新后的该m-1段路径存储至排序在目标设备后的至少一个设备,可以使得接下来执行区块的设备在更新默克尔B+树时有较大可能在本地直接获取到所需的节点数据,从而可以降低处理延迟。
可选地,目标设备可以按照预设策略来将该节点路径划分为m段路径,以及确定与该m段路径中除第1段路径之外的m-1段路径中每段路径对应的设备。预设策略可以事先进行设置。比如,预设策略可以为:树高小于或等于4时,将该节点路径从上层至下层按序划分为两段路径,第1段路径包括根节点,第2段路径包括除根节点之外的节点,将更新后的第2段路径传输给排序在目标设备后的3个设备中的随机一个进行存储,将更新后的第1段路径存储在目标设备本地,以保证设备的负载均衡。当树高大于4时,将该节点路径从上层至下层按序划分为4段路径,第1段路径包括根节点,第2段路径、第3段路径、第4段路径分别包括除根节点之外的节点,将更新后的第4段路径、更新后的第3段路径、更新后的第2段路径一一传输给排序在目标设备后的3个设备进行存储,将更新后的第1段路径存储在目标设备本地,以保证设备的负载均衡。
比如,预设高度为3,如图5所示,该节点路径的树高为5,大于预设高度,因而目标设备可以将该节点路径分为两段路径。之后,目标设备可以更新第2段路径中的节点,且在更新过程中不为更新后的第2段路径中每个节点分配页标识。之后,目标设备将更新后的第2段路径中节点的数据发送给排序在目标设备后一位的设备,该设备可以为更新后的第2段路径中的每个节点分配页标识,且在更新后的第2段路径中的每个索引节点的数据中添加这个索引节点的页标识和这个索引节点下属的数据节点的页标识,如此,后续该设备可以根据更新后的第2段路径中每个节点的页标识将更新后的第2段路径中每个节点的数据存储至该设备的磁盘页。该设备将更新后的第2段路径中最上层的节点的页标识发送给目标设备。之后,目标设备可以根据第2段路径中最上层的节点的最小键、哈希值和页标识更新第1段路径,且在更新过程中为更新后的第1段路径中每个节点分配页标识,如此,后续目标设备可以根据更新后的第1段路径中每个节点的页标识将更新后的第1段路径中节点的数据存储至目标设备的磁盘页。
第二种方式:目标设备接收到该数据修改指令后,执行如下步骤一至步骤四:
步骤一:目标设备根据目标根节点的数据和该数据修改集中的key值确定第一节点。
目标设备根据目标根节点的数据和该数据修改集中的key值可以将该数据修改集中的键值对和/或键分发至目标根节点下属的节点。第一节点为在目标根节点下属的节点中将该数据修改集中的键值对和/或键分发至的节点。
目标根节点的数据包含目标根节点的页标识,以及包含目标根节点下属的每个节点的最小键和哈希值,以及包含目标根节点下属的每个节点的页标识。
这种情况下,对于该数据修改集中任意的一个待添加的键值对的key值,或对于该数据修改集中任意的一个待更新的键值对的key值,或对于该数据修改集中任意的一个待删除的键(即key值),目标设备可以将该key值和目标根节点下属的每个节点的键范围进行比对,以确定该key值处于目标根节点下属的哪个节点的键范围。之后,目标设备获取目标根节点的数据中包含的这个节点(即第一节点)的页标识。
目标设备根据第一节点的页标识可以确定目标设备中是否存储有第一节点的数据。
若目标设备未存储第一节点的数据,则继续执行如下步骤二和步骤三。
若目标设备存储有第一节点的数据,则目标设备获取目标设备的磁盘页中存储的第一节点的数据。若第一节点为数据节点,则目标设备可以确定第一节点为目标数据节点,此时就获取到了目标数据节点的数据,从而也就完成了分发流程,获取到了目标根节点至目标数据节点的节点路径中节点的数据。若第一节点为索引节点,则目标设备需要继续将该数据修改集中的键值对和/或键向第一节点下属的节点进行分发。具体来讲,目标设备根据第一节点的数据和该数据修改集中的key值确定第二节点,第二节点为在第一节点下属的节点中将该数据修改集中的键值对和/或键分发至的节点。其中,目标设备根据第一节点的数据和该数据修改集中的key值确定第二节点的操作与上述步骤一中目标设备根据目标根节点的数据和该数据修改集中的key值确定第一节点的操作类似,本申请实施例对此不再赘述。之后,目标设备根据第二节点的页标识可以确定目标设备中是否存储有第二节点的数据。类似地,若目标设备未存储第二节点的数据,则目标设备可以采取与如下步骤二和步骤三类似的做法。若目标设备存储有第二节点的数据,则目标设备获取目标设备的磁盘页中存储的第二节点的数据;若第二节点为数据节点,则目标设备可以确定第二节点为目标数据节点,此时就获取到了目标数据节点的数据,从而也就完成了分发流程,获取到了目标根节点至目标数据节点的节点路径中节点的数据;若第二节点为索引节点,则目标设备需要继续将该数据修改集中的键值对和/或键向第二节点下属的节点进行分发。以此类推,直至将该数据修改集中的键值对和/或键分发至目标数据节点。
步骤二:若目标设备未存储第一节点的数据,则获取第一节点对应的第一数据量和第二数据量。
第一节点对应的第一数据量为该数据修改集中需分发至第一节点的键值对和/或键的总数据量。也即,第一节点对应的第一数据量为第一节点绑定的修改集数据量大小,即预期分发至第一节点所属后续路径上的键值对和/或键的总数据量。第一节点对应的第一数据量为目标设备为实现对该数据修改集的分发需要向其他设备传输的数据量。
第一节点对应的第二数据量为预测出的该节点路径中第一节点及位于第一节点的下层的节点的总数据量。也即,第一节点对应的第二数据量为预测出的该数据修改集中的键值对和/或键在第一节点所属后续路径上分发至的节点的总数据量。第二数据量为目标设备为实现对该数据修改集的分发需要从其他设备获取的数据量。
可选地,第一节点对应的第二数据量可以由节点个数与预估节点数据量相乘得到,该节点个数可以由默克尔B+树的当前树高减去该节点路径中位于第一节点上层的节点的个数得到。
预估节点数据量可以预先进行设置,预估节点数据量为预估出的一个节点的数据量。可选地,预估节点数据量可以由技术人员根据实际情况事先设置,如预估节点数据量可以根据节点分裂策略和业务数据情况确定得到。
作为一种示例,系统内部的索引节点和数据节点预期存在overflow(是指一个节点真实对应的磁盘页数量,即指示一个节点的数据存储在几个连续的磁盘页)的概率。该概率可以预估得到,可选地,该概率取决于系统的节点分裂策略是更倾向于产生具有overflow的节点还是更倾向于产生对应1个磁盘页的节点。如果系统的节点分裂策略更倾向于产生具有overflow的节点,则还需要考虑因业务数据情况导致的overflow的预期值是更倾向于小的overflow还是大的overflow。比如,在业务场景为不停插入新增的键值对,且90%的键值对的数据大小为4K至6K的情况下,若单个磁盘页大小为4K,则数据节点的overflow更倾向于为2,但是考虑到系统的节点分裂策略是尽可能的使数据节点或索引节点的数据更紧凑,那么以数据节点的分裂过程为例,在超出阈值需要分裂的数据节点上,很可能存在本应分裂为overflow为2的磁盘页和一个独立的无overflow的磁盘页被合并成了overflow为3的磁盘页,这种情况下,可以预估一个节点的数据量为:10%*4K+90%*50%*8K+90%*50%*12K=9.4K,其中,10%表示一个节点的数据存储在一个独立的无overflow的磁盘页(大小为4K)的概率,90%*50%表示一个节点的数据存储在overflow为2的磁盘页(大小为8K)的概率,90%*50%表示一个节点的数据存储在overflow为3的磁盘页(大小为12K)的概率。
目标设备可以根据第一节点对应的第一数据量和第二数据量,指示该至少一个设备获取该节点路径中第一节点及位于第一节点下层的节点的数据并更新该节点路径中的节点。
具体来讲,若第一节点对应的第一数据量大于或等于第二数据量,说明目标设备为实现对该数据修改集的分发需要向其他设备传输的数据量比目标设备为实现对该数据修改集的分发需要从其他设备获取的数据量要多或大致相同。这种情况下,为保证系统中网络传输量最小化,目标设备可以直接根据第一节点的页标识从对应的其他设备中的磁盘页获取第一节点的数据。若第一节点为数据节点,则目标设备可以确定第一节点为目标数据节点,此时就获取到了目标数据节点的数据,从而也就完成了分发流程,获取到了目标根节点至目标数据节点的节点路径中节点的数据。若第一节点为索引节点,则目标设备需要继续将该数据修改集中的键值对和/或键向第一节点下属的节点进行分发。
步骤三:若第一节点对应的第一数据量小于第二数据量,则目标设备向该多个设备中存储有第一节点的数据的第一设备发送更新请求(可称为第一更新请求),以指示第一设备获取该节点路径中第一节点及位于第一节点下层的节点的数据并更新节点。
若第一节点对应的第一数据量小于第二数据量,说明目标设备为实现对该数据修改集的分发需要向其他设备传输的数据量比目标设备为实现对该数据修改集的分发需要从其他设备获取的数据量要少。这种情况下,为保证系统中网络传输量最小化,目标设备可以直接向存储有第一节点的数据的第一设备发送更新请求。
该更新请求携带第一节点的页标识和该数据修改集中分发至第一节点的键值对和/或键。第一设备接收到该更新请求后,可以根据第一节点的页标识获取第一设备中对应磁盘页中存储的第一节点的数据。
在一些实施例中,若第一节点为数据节点,则第一设备可以确定第一节点为目标数据节点,此时就获取到了目标数据节点的数据。由于目标设备已获取到目标根节点的数据,所以目标设备和第一设备整体上获取到了从目标根节点至目标数据节点的节点路径中节点的数据,完成了分发流程。
这种情况下,第一设备可以根据该更新请求中携带的键值对和/或键更新目标数据节点。若更新后的目标数据节点的数据量小于或等于预设数据量,则第一设备直接为更新后的目标数据节点分配页标识,以便后续第一设备可以将更新后的目标数据节点的数据存储至第一设备的磁盘页,并且,第一设备将更新后的目标数据节点的最小键、哈希值和页标识作为更新结果(可称为第一更新结果)返回给目标设备。若更新后的目标数据节点的数据量大于预设数据量,则第一设备将更新后的目标数据节点分裂为至少两个数据节点,为该至少两个数据节点中每个数据节点分配页标识,以便后续第一设备可以将该至少两个数据节点中每个数据节点的数据存储至第一设备的磁盘页,并且,第一设备将该至少两个数据节点中每个数据节点的最小键、哈希值和页标识作为更新结果返回给目标设备。
目标设备接收到该更新结果后,可以根据该更新结果更新该节点路径中的根节点,且在更新过程中为更新后的该节点路径中的根节点分配页标识,以便目标设备后续可以将更新后的该节点路径中的根节点的数据存储至目标设备的磁盘页。如此,就完成了对该节点路径中节点的更新。
在另一些实施例中,若第一节点为索引节点,则第一设备可以根据第一节点的数据和该更新请求中携带的键值对和/或键中的key值确定第二节点。
第一设备根据第一节点的数据和该更新请求中携带的键值对和/或键中的key值可以将该更新请求中携带的键值对和/或键分发至第一节点下属的节点。第二节点为在第一节点下属的节点中将该更新请求中携带的键值对和/或键分发至的节点。
第一节点的数据中包含第二节点的页标识。第一设备根据第二节点的页标识可以确定第一设备中是否存储有第二节点的数据。
在一种情况下,若第一设备存储有第二节点的数据,则第一设备获取第一设备的磁盘页中存储的第二节点的数据。若第二节点为数据节点,则第一设备可以确定第二节点为目标数据节点,此时就获取到了目标数据节点的数据,这种情况下,第一设备可以根据该更新请求中携带的键值对和/或键更新目标数据节点和目标数据节点上属的第一节点,并在更新过程中为更新后的节点分配页标识,以便第一设备后续可以将更新后的节点的数据存储至第一设备的磁盘页,之后,第一设备将更新后的节点中处于最上层的节点的最小键、哈希值和页标识作为更新结果返回给目标设备,目标设备可以根据该更新结果更新该节点路径中的根节点,且在更新过程中为更新后的该节点路径中的根节点分配页标识,以便目标设备后续可以将更新后的该节点路径中的根节点的数据存储至目标设备的磁盘页,如此,就完成了对该节点路径中节点的更新。若第二节点为索引节点,则与上文类似的,第一设备需要继续将该更新请求中携带的键值对和/或键向第二节点下属的节点进行分发。
在另一种情况下,若第一设备未存储第一节点的数据,则可以采取与上述步骤二和步骤三类似的做法。
具体来讲,第一设备可以获取第二节点对应的第一数据量和第二数据量。
若第二节点对应的第一数据量大于或等于第二数据量,则第一设备可以直接根据第二节点的页标识从对应的其他设备中的磁盘页获取第二节点的数据。若第二节点为数据节点,则第一设备可以确定第二节点为目标数据节点,此时就获取到了目标数据节点的数据,这种情况下,第一设备可以根据该更新请求中携带的键值对和/或键更新目标数据节点和目标数据节点上属的第一节点,并在更新过程中为更新后的节点分配页标识,以便第一设备后续可以将更新后的节点的数据存储至第一设备的磁盘页,之后,第一设备将更新后的节点中处于最上层的节点的最小键、哈希值和页标识作为更新结果返回给目标设备,目标设备可以根据该更新结果更新该节点路径中的根节点,且在更新过程中为更新后的该节点路径中的根节点分配页标识,以便目标设备后续可以将更新后的该节点路径中的根节点的数据存储至目标设备的磁盘页,如此,就完成了对该节点路径中节点的更新。若第二节点为索引节点,则与上文类似的,第一设备需要继续将该更新请求中携带的键值对和/或键向第二节点下属的节点进行分发。
若第二节点对应的第一数据量小于第二数据量,则第一设备可以向该多个设备中存储有第二节点的数据的第二设备发送更新请求(可称为第二更新请求),以指示第二设备获取该节点路径中第二节点及位于第二节点下层的节点的数据并更新节点。其中,该更新请求携带第二节点的页标识和该数据修改集中分发至第二节点的键值对和/或键。之后,与上述第一设备接收到目标设备发送的更新请求后的处理过程类似的,第二设备可以处理第一设备发送的更新请求并在其后向第一设备返回更新结果(可称为第二更新结果),第一设备接收到第二设备发送的更新结果后可以更新第一节点,并在更新过程中为更新后的节点分配页标识,以便第一设备后续可以将更新后的节点的数据存储至第一设备的磁盘页,之后,第一设备将更新后的节点中处于最上层的节点的最小键、哈希值和页标识作为更新结果返回给目标设备,目标设备可以根据该更新结果更新该节点路径中的根节点,且在更新过程中为更新后的该节点路径中的根节点分配页标识,以便目标设备后续可以将更新后的该节点路径中的根节点的数据存储至目标设备的磁盘页,如此,就完成了对该节点路径中节点的更新。
需说明的是,在本申请实施例中,一个设备(如上述目标设备、第一设备或第二设备)在将该数据修改集中的键值对和/或键分发至一个节点后,可以获取这个节点对应的第一数据量和第二数据量,以据此确定是要向存储有这个节点的数据的其他设备发送更新请求还是要从其他设备获取这个节点的数据来直接更新,如此,在该节点路径的更新过程中可以实现网络传输量的最小化。
比如,该节点路径包括根节点1、索引节点2、索引节点3、索引节点4、索引节点5和数据节点6。目标设备存储有根节点1的数据,根据根节点1的数据将该数据修改集中的键值对和/或键分发至索引节点2。若目标设备存储有索引节点2的数据,则目标设备根据索引节点2的数据继续将该数据修改集中的键值对和/或键分发至索引节点3。若目标设备未存储索引节点3的数据,且目标设备确定索引节点3对应的第一数据量小于第二数据量,则目标设备可以向存储有索引节点3的数据的第一设备发送更新请求,该更新请求携带索引节点3的页标识和分发至索引节点3的键值对和/或键。第一设备接收到目标设备发送的更新请求后,根据索引节点3的数据将该更新请求中的键值对和/或键分发至索引节点4。若第一设备未存储索引节点4的数据,且第一设备确定索引节点4对应的第一数据量小于第二数据量,则第一设备可以向存储有索引节点4的数据的第二设备发送更新请求,该更新请求携带索引节点4的页标识和分发至索引节点4的键值对和/或键。第二设备接收到第一设备发送的更新请求后,根据索引节点4的数据将该更新请求中的键值对和/或键分发至索引节点5。若第二设备未存储索引节点5的数据,且第二设备确定索引节点5的第一数据量大于或等于第二数据量,则第二设备可以根据索引节点5的页标识从其他设备的磁盘页中获取索引节点5的数据,然后根据索引节点5的数据将该更新请求中的键值对和/或键分发至数据节点6。若第二设备未存储数据节点6的数据,且第二设备确定数据节点6对应的第一数据量小于第二数据量,则第二设备可以向存储有数据节点6的数据的第三设备发送更新请求,该更新请求携带数据节点6的页标识和分发至数据节点6的键值对和/或键。第三设备接收到第二设备发送的更新请求后,根据该更新请求携带的键值对和/或键更新数据节点6,并在更新过程中为更新后的数据节点分配页标识,以便后续第三设备可以将更新后的数据节点存储至第三设备的磁盘页,之后,第三设备将更新后的数据节点的最小键、哈希值和页标识作为更新结果返回给第二设备。第二设备接收到第三设备返回的更新结果后,根据该更新结果更新索引节点4和索引节点5,并在更新过程中为更新后的索引节点分配页标识,以便后续第二设备可以将更新后的索引节点存储至第二设备的磁盘页,之后,第二设备将更新后的索引节点中处于最上层的索引节点的最小键、哈希值和页标识作为更新结果返回给第一设备。第一设备接收到第二设备返回的更新结果后,根据该更新结果更新索引节点3,并在更新过程中为更新后的索引节点分配页标识,以便后续第一设备可以将更新后的索引节点存储至第一设备的磁盘页,之后,第一设备将更新后的索引节点中处于最上层的索引节点的最小键、哈希值和页标识作为更新结果返回给目标设备。目标设备接收到第一设备返回的更新结果后,根据该更新结果更新根节点1和索引节点2,并在更新过程中为更新后的索引节点和根节点分配页标识。如此,就完成了对该节点路径中节点的更新,并且,在更新过程中实现了网络传输量的最小化。
步骤四:目标设备接收第一设备针对该更新请求返回的更新结果,根据该更新结果更新该节点路径中的根节点。
需注意的是,在上述步骤302中更新该节点路径中的节点,即是实现了对默克尔B+树的更新,这种情况下,目标设备获得更新后的默克尔B+树中根节点的数据,即获取到了当前区块对应的根节点的数据。这种情况下,目标设备可以将该根节点的数据发送给调度模块,如此调度模块可以确定当前区块的执行进度为已执行完成。之后,调度模块可以根据该根节点的数据获取该根节点的哈希值,并将该根节点的哈希值返回给上层的区块链系统。并且,调度模块还可以记录该根节点的页标识与当前区块的区块标识之间的映射关系,以便可以确定该根节点的页标识与哪一版本的默克尔B+树对应。区块链系统在接收到调度模块发送的该根节点的哈希值后,可以确定当前区块已执行完成,此时区块链系统可以开始执行下一个区块。
在一些实施例中,在步骤302之后目标设备可以直接对更新后的默克尔B+树进行持久化,即可以直接执行如下步骤303。目标设备在持久化完成后可以向调度模块发送持久化完成消息。调度模块接收到持久化完成消息后,确定当前区块的执行进度为已落盘。之后,调度模块向区块链系统发送持久化完成消息,以指示当前区块已落盘。
在另一些实施例中,区块链系统接收到调度模块发送的该根节点的哈希值之后,可以向调度模块发送持久化请求。调度模块接收到该持久化请求后,可以向负责执行当前区块的目标设备发送提交请求。目标设备接收到该提交请求后,可以对更新后的默克尔B+树进行持久化,即可以执行如下步骤303。目标设备在持久化完成后可以向调度模块发送持久化完成消息。调度模块接收到持久化完成消息后,确定当前区块的执行进度为已落盘。之后,调度模块向区块链系统发送持久化完成消息,以指示当前区块已落盘。
步骤303:目标设备将更新后的该节点路径中根节点的数据存储至目标设备的磁盘页,该至少一个设备将更新后的该节点路径中除根节点之外的其他节点的数据存储至磁盘页。
若步骤302是通过上述第一种方式实现的,则步骤303中所述的该至少一个设备为目标设备。
这种情况下,若步骤302是通过上述第一种方式中的方式1实现的,则目标设备将更新后的该节点路径中每个节点的数据存储至目标设备的磁盘页。具体地,目标设备可以根据更新后的该节点路径中每个节点的页标识将更新后的该节点路径中每个节点的数据存储至目标设备中对应的磁盘页。
若步骤302是通过上述第一种方式中的方式2实现的,则在该节点路径的树高小于或等于预设高度的情况下,目标设备将更新后的该节点路径中每个节点的数据存储至目标设备的磁盘页,具体地,目标设备可以根据更新后的该节点路径中每个节点的页标识将更新后的该节点路径中每个节点的数据存储至目标设备中对应的磁盘页。若该节点路径的树高大于预设高度,则目标设备将该节点路径分为m段路径;目标设备将更新后的第1段路径中节点的数据存储至目标设备的磁盘页,将更新后的该m段路径中除第1段路径之外的m-1段路径中节点的数据存储于多个设备中除目标设备之外的其他设备的磁盘页。具体地,目标设备根据更新后的第1段路径中每个节点的页标识将更新后的第1段路径中每个节点的数据存储至目标设备中对应的磁盘页;对于该m-1段路径中任意的一段路径,这一段路径对应的设备根据更新后的这一段路径中每个节点的页标识将更新后的这一段路径中每个节点的数据存储至该设备中对应的磁盘页。
若步骤302是通过上述第二种方式实现的,则步骤303中所述的该至少一个设备可能包括目标设备和/或除目标设备之外的其他一个或多个设备。
这种情况下,若目标设备未向其他设备发送更新请求,则目标设备是独立完成了对该节点路径中所有节点的更新,目标设备可以直接将更新后的该节点路径中每个节点的数据存储至目标设备的磁盘页。
若目标设备向其他设备发送了更新请求,则目标设备可以在接收到针对该更新请求返回的更新结果后,根据该更新结果更新相关节点(至少包括根节点),然后目标设备可以将更新后的节点的数据存储在目标设备的磁盘页中。若任意的一个设备(可称为设备A)接收到其他设备(可称为设备B)发送的更新请求,则设备A可以处理该更新请求;在处理过程中若设备A无需向其他设备发送更新请求,则设备A更新相关节点且向设备B返回更新结果,然后设备A可以将更新后的节点的数据存储在设备A的磁盘页中;在处理过程中若设备A需要向其他设备发送更新请求,则设备A向其他设备发送更新请求且在其后接收到返回的更新结果后,根据该更新结果更新相关节点且向设备B返回更新结果,然后设备A可以将更新后的节点的数据存储在设备A的磁盘页中。
在本申请实施例中,数据库系统包括调度模块和多个设备,该多个设备中不同的设备用于存储不同版本的默克尔B+树中根节点的数据。调度模块向目标设备发送数据修改指令,该数据修改指令携带目标根节点的数据和数据修改集。目标设备接收到该数据修改指令后,根据目标根节点的数据和该数据修改集指示该多个设备中的至少一个设备获取从目标根节点至目标数据节点的节点路径中节点的数据以及更新该节点路径中的节点。并且,目标设备将更新后的该节点路径中根节点的数据存储至目标设备的磁盘页,该至少一个设备将更新后的该节点路径中除根节点之外的其他节点的数据存储至磁盘页。如此,可实现一个设备与一个版本的默克尔B+树的对应,由多个设备维护多个版本的默克尔B+树,通过将多版本数据分散到了多个设备上,可降低单个设备的数据存储与多版本维护的压力,从而可以提高该数据库系统的吞吐量,进而提升该数据库系统的性能。
需说明的是,通过上述步骤301至步骤303可以实现对多个设备存储的默克尔B+树的节点数据的修改。
在一些实施例中,还可以对多个设备存储的默克尔B+树进行版本回滚,下面对此进行说明:
区块链系统能够保证回滚和出块不会并发执行,也即,回滚流程需要在执行完一个区块后且尚未开始执行另一个区块前进行。
区块链系统若需要将目标区块及目标区块后的所有区块都回滚掉,即区块链系统若需要回滚至目标区块的上一个区块,则区块链系统可以向调度模块发送回滚请求,该回滚请求携带目标区块标识,用于指示将目标区块及目标区块后的所有区块回滚掉,即是将目标区块及目标区块后的所有区块的相应版本的默克尔B+树回滚掉,换句话说,是将默克尔B+树的节点数据回滚至目标区块的上一个区块的相应版本的默克尔B+树的节点数据。
调度模块接收到该回滚请求后,需要确定当前区块的执行进度。若当前区块的执行进度不为已落盘,则调度模块需等待当前区块的执行进度为已落盘后,再向该多个设备中的每个设备发送回滚指令,该回滚指令可以携带目标区块标识。对于该多个设备中任意的一个设备,这个设备接收到该回滚指令后,可以删除目标区块标识所标识的目标区块及目标区块后的所有区块对应的版本信息。某个区块对应的版本信息为在处理这个区块对应的数据修改集的过程中记录的信息,比如,某个区块对应的版本信息可以包括这个区块对应的根节点的数据、freelist组件的修改内容、区块执行进度控制信息等,其中,freelist组件用于配置空闲页标识列表、待释放页标识列表和最大页标识,freelist组件用于为更新后的节点分配页标识。如此,在删除目标区块及目标区块后的所有区块对应的版本信息后,这个设备中所记录的最新版本信息对应的区块即为目标区块的上一个区块,从而就回滚至了目标区块的上一个区块的相应版本的默克尔B+树。之后,这个设备可以向调度模块发送回滚完成消息。
调度模块接收到该多个设备中的每个设备发送的回滚完成消息后,可以删除目标区块及目标区块后的所有区块对应的根节点的数据,以及删除目标区块及目标区块后的所有区块的标识。如此,调度模块中所记录的最新区块为目标区块的上一个区块,所记录的最新版本的默克尔B+树为目标区块的上一个区块对应的根节点的数据所属的默克尔B+树,从而就回滚至了目标区块的上一个区块的相应版本的默克尔B+树。
在一些实施例中,还可以对该数据库系统中的网络异常情况进行处理,下面对此进行说明:
在该数据库系统中,网络异常可能出现在调度模块与该多个设备中的任意一个设备之间,示例地,在数据修改指令、回滚指令等控制指令的执行过程中可能出现网络异常。或者,网络异常也可能出现在该多个设备之间,比如,在该多个设备之间进行节点数据查询或进行节点数据的更新或存储的过程中可能出现网络异常。
可选地,调度模块可能与该多个设备中的任意一个设备之间出现网络异常,比如,若调度模块向这个设备发送控制指令后,这个设备长时间未回复,则调度模块可以确定自身与这个设备之间出现网络异常。由于本申请实施例中区块标识与设备有强绑定关系,因此这种网络异常会导致整个数据库系统的进度被阻塞,因而这种情况下调度模块需要重新向这个设备发送该控制指令。
可选地,若该多个设备中任意的一个设备与其他设备之间出现网络异常,则可以通过如下两种方案解决:
第一种方案:某个设备(可称为设备A)在分发键值对或键至数据节点的过程中,需要从其他设备(可称为设备B)获取节点数据,或需要向其他设备(可称为设备B)发送更新请求,设备A发现设备B网络不可达,即确定自身与设备B之间出现网络异常。这种情况下,若不存在冗余备份策略,则设备A只能阻塞等待。而若在节点更新阶段采取成熟共识算法(如raft)在随机设备上进行多冗余备份,也即,在节点更新阶段中不仅可以由一个设备为更新后的节点分配页标识,还可以将更新后的节点的数据发送给至少一个其他设备(可称为备份设备),由各个备份设备为更新后的节点分配页标识(可称为备份页标识),如此,更新后的节点的数据中不仅包含该节点的页标识,还包含至少一个备份页标识,则在设备A与设备B之间出现网络异常的情况下,设备A可以尝试访问不同的备份设备,也即,设备A可以尝试从备份设备中获取节点数据,或向备份设备发送更新请求。
第二种方案:某个设备(可称为设备A)在更新节点的过程中,需要将更新后的节点的数据发送至其他设备(设备B)进行存储,设备A发现设备B网络不可达,即确定自身与设备B之间出现网络异常。这种情况下,设备A可以按照设备标识的排序顺延更改设备,直至设备网络可达,然后将更新后的节点的数据发送至该设备进行存储。比如,正在处理当前区块的设备标识为2,预期需要存储节点数据的设备标识是3、4、5,但2号设备发现5号设备不可达,那么其可以考虑将节点数据发送到6号设备进行存储。
示例地,在上述步骤302的第一种方式中的方式2中,m段路径中除第1段路径之外的m-1段路径与该多个设备中除目标设备之外的一个设备对应,后续目标设备将更新后的m-1段路径中任意的一段路径中节点的数据存储至这一段路径对应的设备的磁盘页。这种情况下,若目标设备与这一段路径对应的设备之间出现网络异常,则目标设备可以将更新后的这一段路径中节点的数据存储至排序在这一段路径对应的设备后一位的设备的磁盘页。
进一步地,本申请实施例还可以实现对多个设备的动态增删,下面对此进行说明:
由于本申请实施例中设备数量天然与区块标识有绑定关系,因此调度模块可以对外暴露接口来允许技术人员根据需要新增设备。新增设备的逻辑与区块链系统出块逻辑不会并行执行,也即,新增设备流程需要在执行完一个区块后且尚未开始执行另一个区块前进行。具体操作可以包括如下步骤a至步骤d:
步骤a:调度模块可以接收设备新增请求。该设备新增请求中携带设备信息,该设备信息可以包括设备标识,进一步还可以包括URL(Uniform Resource Locator,统一资源定位符)。该设备新增请求用于请求新增该设备信息对应的设备(可称为指定设备),该设备新增请求可以是区块链系统发送的,也可以是其他系统发送的,或者可以是技术人员直接在调度模块上触发的。
步骤b:调度模块确定最新执行完成的区块的下一个区块的区块标识。调度模块将该设备信息和该区块标识(可称为指定区块标识)携带于第一设备新增指令中发送给该多个设备中的每个设备,以指示新增该设备信息对应的指定设备以及指示所新增的指定设备是从该区块标识所标识的区块开始被启用。调度模块将该设备信息、该区块标识、该多个设备的设备数量(即目标已启用的设备数量)携带于第二设备新增指令中发送给该设备信息对应的指定设备。然后调度模块可以同步等待包括新增的指定设备在内的所有设备的回复。
步骤c:对于该多个设备中任意的一个设备,这个设备接收到第一设备新增指令后,记录第一设备新增指令中携带的设备信息,尝试与该设备信息对应的指定设备建立通信连接,在建立通信连接的过程中还可以将自身用于设备间通信的URL告知指定设备,这个设备在成功与指定设备建立通信连接后,向调度模块返回新增成功消息。对于指定设备,指定设备接收到第二设备新增指令后,与其他设备建立通信连接,在确定与自身成功建立通信连接的设备数量为第二设备新增指令携带的设备数量后,向调度模块返回新增成功消息。可选地,任意两个设备间可以只维护一条物理连接,以双向流的形式互相通信。
步骤d:调度模块若确定接收到该多个设备中每个设备发送的新增成功消息且接收到指定设备发送的新增成功消息,则可以确定指定设备添加成功。这种情况下,调度模块还可以向该多个设备和指定设备发送设备确认消息,以通知所有设备确认指定设备已启用。每个设备响应该设备确认消息的同时将指定设备设置为启用状态。
需注意的是,在上述步骤c中,若调度模块与任意一个设备之间出现了网络异常,则会存在有设备无法接收到设备新增指令(上述第一设备新增指令或第二设备新增指令),或存在设备接收到设备新增指令但是无法向调度模块返回新增成功消息,这种情况下,指定设备将无法被启用,即指定设备会添加失败。这种情况下,需要按照未存在设备新增处理,也即,调度模块和设备在执行下一个区块时可以基于原有的多个设备进行。
另外,在上述步骤d中,若调度模块与任意一个设备之间出现了网络异常,则会存在设备无法接收到设备确认消息,或存在设备无法回复设备确认消息,这种情况下,后续可以默认按照设备新增成功处理,也即,调度模块和设备在执行区块标识大于或等于指定区块标识的区块时可以基于新增指定设备后的所有设备进行。
图6为本申请实施例提供的一种计算机设备的结构示意图。如图6所示,计算机设备6包括:处理器60、存储器61以及存储在存储器61中并可在处理器60上运行的计算机程序62,处理器60执行计算机程序62时实现上述实施例中的数据处理方法中由调度模块或多个设备中任意一个设备执行的操作。
计算机设备6可以是一个通用计算机设备或一个专用计算机设备。在具体实现中,计算机设备6可以是台式机、便携式电脑、网络服务器、掌上电脑、移动手机、平板电脑、无线终端设备、通信设备或嵌入式设备,本申请实施例不限定计算机设备6的类型。本领域技术人员可以理解,图6仅仅是计算机设备6的举例,并不构成对计算机设备6的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,比如还可以包括输入输出设备、网络接入设备等。
处理器60可以是中央处理单元(Central Processing Unit,CPU),处理器60还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者也可以是任何常规的处理器。
存储器61在一些实施例中可以是计算机设备6的内部存储单元,比如计算机设备6的硬盘或内存。存储器61在另一些实施例中也可以是计算机设备6的外部存储设备,比如计算机设备6上配备的插接式硬盘、智能存储卡(Smart Media Card,SMC)、安全数字(SecureDigital,SD)卡、闪存卡(Flash Card)等。进一步地,存储器61还可以既包括计算机设备6的内部存储单元也包括外部存储设备。存储器61用于存储操作系统、应用程序、引导装载程序(Boot Loader)、数据以及其他程序等。存储器61还可以用于暂时地存储已经输出或者将要输出的数据。
本申请实施例还提供了一种计算机设备,该计算机设备包括:至少一个处理器、存储器以及存储在该存储器中并可在该至少一个处理器上运行的计算机程序,该处理器执行该计算机程序时实现上述任意各个方法实施例中的步骤。
本申请实施例还提供了一种计算机可读存储介质,该计算机可读存储介质存储有计算机程序,该计算机程序被处理器执行时可实现上述各个方法实施例中的步骤。
本申请实施例提供了一种计算机程序产品,当其在计算机上运行时,使得计算机执行上述各个方法实施例中的步骤。
集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请实现上述方法实施例中的全部或部分流程,可以通过计算机程序来指令相关的硬件来完成,该计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,该计算机程序包括计算机程序代码,该计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。该计算机可读介质至少可以包括:能够将计算机程序代码携带到拍照装置/终端设备的任何实体或装置、记录介质、计算机存储器、ROM(Read-Only Memory,只读存储器)、RAM(Random Access Memory,随机存取存储器)、CD-ROM(Compact Disc Read-Only Memory,只读光盘)、磁带、软盘和光数据存储设备等。本申请提到的计算机可读存储介质可以为非易失性存储介质,换句话说,可以是非瞬时性存储介质。
应当理解的是,实现上述实施例的全部或部分步骤可以通过软件、硬件、固件或者其任意结合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。该计算机程序产品包括一个或多个计算机指令。该计算机指令可以存储在上述计算机可读存储介质中。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
在本申请所提供的实施例中,应该理解到,所揭露的装置/计算机设备和方法,可以通过其它的方式实现。例如,以上所描述的装置/计算机设备实施例仅仅是示意性的,例如,模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通讯连接可以是通过一些接口,装置或单元的间接耦合或通讯连接,可以是电性,机械或其它的形式。
作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
以上所述实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围,均应包含在本申请的保护范围之内。

Claims (13)

1.一种数据处理方法,其特征在于,所述方法应用于数据库系统,所述数据库系统包括调度模块和多个设备,所述多个设备中不同的设备用于存储不同版本的默克尔B+树中根节点的数据,所述方法包括:
所述调度模块向目标设备发送数据修改指令,所述数据修改指令携带目标根节点的数据和数据修改集,所述目标根节点为最新版本的所述默克尔B+树中的根节点,所述目标设备为所述多个设备中排序在存储有所述目标根节点的数据的设备后一位的设备,所述数据修改集包括待添加的键值对、待更新的键值对、和/或待删除的键;
所述目标设备接收到所述数据修改指令后,根据所述目标根节点的数据和所述数据修改集指示所述多个设备中的至少一个设备获取从所述目标根节点至目标数据节点的节点路径中节点的数据以及更新所述节点路径中的节点;
所述目标设备将更新后的所述节点路径中根节点的数据存储至所述目标设备的磁盘页,所述至少一个设备将更新后的所述节点路径中除根节点之外的其他节点的数据存储至磁盘页。
2.如权利要求1所述的方法,其特征在于,所述目标设备根据所述目标根节点的数据和所述数据修改集指示所述多个设备中的至少一个设备获取从所述目标根节点至目标数据节点的节点路径中节点的数据以及更新所述节点路径中的节点,包括:
所述目标设备根据所述目标根节点的数据和所述数据修改集中的key值获取从所述目标根节点至所述目标数据节点的节点路径中节点的数据;
所述目标设备根据所述数据修改集更新所述节点路径中的节点。
3.如权利要求2所述的方法,其特征在于,所述目标设备将更新后的所述节点路径中根节点的数据存储至所述目标设备的磁盘页,所述至少一个设备将更新后的所述节点路径中除根节点之外的其他节点的数据存储至磁盘页,包括:
若所述节点路径的树高小于或等于预设高度,则所述目标设备将更新后的所述节点路径中每个节点的数据存储至所述目标设备的磁盘页;
若所述节点路径的树高大于预设高度,则所述目标设备将所述节点路径分为m段路径,所述m段路径中的第1段路径包括根节点,所述m为大于或等于2的整数;所述目标设备将更新后的所述第1段路径中节点的数据存储至所述目标设备的磁盘页,将更新后的所述m段路径中除所述第1段路径之外的m-1段路径中节点的数据存储于所述多个设备中除所述目标设备之外的其他设备的磁盘页。
4.如权利要求3所述的方法,其特征在于,所述m-1段路径中任意一段路径与所述多个设备中除所述目标设备之外的一个设备对应;
所述目标设备将更新后的所述m段路径中除所述第1段路径之外的m-1段路径中节点的数据存储于所述多个设备中除所述目标设备之外的其他设备的磁盘页,包括:
所述目标设备将更新后的所述m-1段路径中任意的一段路径中节点的数据存储至所述一段路径对应的设备的磁盘页;
所述方法还包括:
若所述目标设备与所述一段路径对应的设备之间出现网络异常,则所述目标设备将更新后的所述一段路径中节点的数据存储至排序在所述一段路径对应的设备后一位的设备的磁盘页。
5.如权利要求1所述的方法,其特征在于,所述目标设备根据所述目标根节点的数据和所述数据修改集指示所述多个设备中的至少一个设备获取从所述目标根节点至目标数据节点的节点路径中节点的数据以及更新所述节点路径中的节点,包括:
所述目标设备根据所述目标根节点的数据和所述数据修改集中的key值确定第一节点,所述第一节点为在所述目标根节点下属的节点中将所述数据修改集中的键值对和/或键分发至的节点;
所述目标设备若未存储所述第一节点的数据,则获取所述第一节点对应的第一数据量和第二数据量,所述第一节点对应的所述第一数据量为所述数据修改集中需分发至所述第一节点的键值对和/或键的总数据量,所述第一节点对应的所述第二数据量为预测出的所述节点路径中所述第一节点及位于所述第一节点的下层的节点的总数据量;
所述目标设备根据所述第一节点对应的所述第一数据量和所述第二数据量指示所述至少一个设备获取所述节点路径中所述第一节点及位于所述第一节点下层的节点的数据并更新所述节点路径中的节点。
6.如权利要求5所述的方法,其特征在于,所述目标设备根据所述第一节点对应的所述第一数据量和所述第二数据量指示所述至少一个设备获取所述节点路径中所述第一节点及位于所述第一节点下层的节点的数据并更新所述节点路径中的节点,包括:
若所述第一节点对应的所述第一数据量小于所述第二数据量,则所述目标设备向所述多个设备中存储有所述第一节点的数据的第一设备发送第一更新请求,以指示所述第一设备获取所述节点路径中所述第一节点及位于所述第一节点下层的节点的数据并更新节点;
所述目标设备接收所述第一设备针对所述第一更新请求返回的第一更新结果,根据所述第一更新结果更新所述节点路径中的根节点。
7.如权利要求6所述的方法,其特征在于,所述目标设备向所述多个设备中存储有所述第一节点的数据的第一设备发送第一更新请求之后,还包括:
所述第一设备接收到所述第一更新请求后,根据所述第一节点的页标识获取所述第一设备中对应磁盘页中存储的所述第一节点的数据;
若所述第一节点为索引节点,则所述第一设备根据所述第一节点的数据和所述第一更新请求中携带的键值对和/或键中的key值确定第二节点,所述第二节点为在所述第一节点下属的节点中将所述第一更新请求中携带的键值对和/或键分发至的节点;
所述第一设备若未存储所述第二节点的数据,则获取所述第二节点对应的第一数据量和第二数据量,所述第二节点对应的所述第一数据量为所述第一更新请求中携带的键值对和/或键中需分发至所述第二节点的键值对和/或键的总数据量,所述第二节点对应的所述第二数据量为预测出的所述节点路径中所述第二节点及位于所述第二节点的下层的节点的总数据量;
若所述第二节点对应的所述第一数据量小于所述第二数据量,则所述第一设备向所述多个设备中存储有所述第二节点的数据的第二设备发送第二更新请求,以指示所述第二设备获取所述节点路径中所述第二节点及位于所述第二节点下层的节点的数据并更新节点;
所述第一设备接收所述第二设备针对所述第二更新请求返回的第二更新结果,根据所述第二更新结果更新所述第一节点,将更新后的节点中处于最上层的节点的最小键、哈希值和页标识携带于所述第一更新结果中返回给所述目标设备。
8.如权利要求1至7任意一项所述的方法,其特征在于,所述数据修改指令携带区块标识,所述数据修改指令中的区块标识用于标识所述数据修改集对应的区块;所述方法还包括:
所述调度模块接收回滚请求,所述回滚请求携带目标区块标识;
所述调度模块在当前区块的执行进度为已落盘的情况下,向所述多个设备中的每个设备发送回滚指令,所述回滚指令携带所述目标区块标识;
所述多个设备中的每个设备接收到所述回滚指令后,删除所述目标区块标识所标识的目标区块及所述目标区块后的所有区块对应的版本信息,向所述调度模块发送回滚完成消息,所述区块对应的版本信息为在处理所述区块对应的数据修改集的过程中记录的信息;
所述调度模块若接收到所述多个设备中的每个设备发送的回滚完成消息,则删除所述目标区块及所述目标区块后的所有区块对应的根节点的数据,以及删除所述目标区块及所述目标区块后的所有区块的区块标识。
9.如权利要求1至7任意一项所述的方法,其特征在于,所述方法还包括:
所述调度模块向所述多个设备中的每个设备发送第一设备新增指令,向指定设备发送第二设备新增指令,所述第一设备新增指令携带所述指定设备的设备信息,所述第二设备新增指令携带所述多个设备的设备数量;
对于所述多个设备中任意的一个设备,所述一个设备接收到所述第一设备新增指令后,记录所述设备信息,以及与所述设备信息对应的所述指定设备建立通信连接,在成功与所述指定设备建立通信连接后向所述调度模块返回新增成功消息;
所述指定设备接收到所述第二设备新增指令后,与其他设备建立通信连接,在确定与自身成功建立通信连接的设备数量为所述第二设备新增指令携带的设备数量时向所述调度模块返回新增成功消息;
所述调度模块若接收到所述多个设备中每个设备返回的所述新增成功消息且接收到所述指定设备返回的所述新增成功消息,则确定所述指定设备添加成功。
10.一种数据库系统,其特征在于,所述数据库系统包括调度模块和多个设备,所述多个设备中不同的设备用于存储不同版本的默克尔B+树中根节点的数据;
所述调度模块,用于向目标设备发送数据修改指令,所述数据修改指令携带目标根节点的数据和数据修改集,所述目标根节点为最新版本的所述默克尔B+树中的根节点,所述目标设备为所述多个设备中排序在存储有所述目标根节点的数据的设备后一位的设备,所述数据修改集包括待添加的键值对、待更新的键值对、和/或待删除的键;
所述目标设备,用于接收到所述数据修改指令后,根据所述目标根节点的数据和所述数据修改集指示所述多个设备中的至少一个设备获取从所述目标根节点至目标数据节点的节点路径中节点的数据以及更新所述节点路径中的节点;
所述目标设备,还用于将更新后的所述节点路径中根节点的数据存储至所述目标设备的磁盘页;
所述至少一个设备,用于将更新后的所述节点路径中除根节点之外的其他节点的数据存储至磁盘页。
11.一种数据处理方法,其特征在于,所述方法应用于数据库系统中的目标设备,所述数据库系统包括调度模块和多个设备,所述多个设备中不同的设备用于存储不同版本的默克尔B+树中根节点的数据,所述目标设备为所述多个设备中排序在存储有目标根节点的数据的设备后一位的设备,所述目标根节点为最新版本的所述默克尔B+树中的根节点,所述方法包括:
接收所述调度模块发送的数据修改指令,所述数据修改指令携带所述目标根节点的数据和数据修改集,所述数据修改集包括待添加的键值对、待更新的键值对、和/或待删除的键;
根据所述目标根节点的数据和所述数据修改集指示所述多个设备中的至少一个设备获取从所述目标根节点至目标数据节点的节点路径中节点的数据以及更新所述节点路径中的节点;
将更新后的所述节点路径中根节点的数据存储至所述目标设备的磁盘页,更新后的所述节点路径中除根节点之外的其他节点的数据由所述至少一个设备存储至磁盘页。
12.一种计算机设备,其特征在于,所述计算机设备包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如权利要求11所述的方法。
13.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求11所述的方法。
CN202310334927.8A 2023-03-24 2023-03-24 数据处理方法、数据库系统、计算机设备和存储介质 Pending CN116431632A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310334927.8A CN116431632A (zh) 2023-03-24 2023-03-24 数据处理方法、数据库系统、计算机设备和存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310334927.8A CN116431632A (zh) 2023-03-24 2023-03-24 数据处理方法、数据库系统、计算机设备和存储介质

Publications (1)

Publication Number Publication Date
CN116431632A true CN116431632A (zh) 2023-07-14

Family

ID=87091951

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310334927.8A Pending CN116431632A (zh) 2023-03-24 2023-03-24 数据处理方法、数据库系统、计算机设备和存储介质

Country Status (1)

Country Link
CN (1) CN116431632A (zh)

Similar Documents

Publication Publication Date Title
KR102240557B1 (ko) 데이터 저장 방법, 장치 및 시스템
CN111344706B (zh) 管理区块链上的交易的方法和系统
CN112153085B (zh) 一种数据处理方法、节点及区块链系统
US7325041B2 (en) File distribution system in which partial files are arranged according to various allocation rules associated with a plurality of file types
CN109543455B (zh) 一种区块链的数据归档方法及装置
JP3526474B2 (ja) ネットワークにおける配布情報管理システム
US20100138540A1 (en) Method of managing organization of a computer system, computer system, and program for managing organization
CN111447248A (zh) 一种文件传输的方法及装置
CN111723148A (zh) 数据存储方法及装置、存储介质、电子装置
CN110347651A (zh) 基于云存储的数据同步方法、装置、设备及存储介质
WO2022134797A1 (zh) 一种数据分片存储方法、装置、计算机设备和存储介质
CN111291062B (zh) 数据同步写入方法、装置、计算机设备及存储介质
CN109597903A (zh) 图像文件处理装置和方法、文件存储系统及存储介质
CN112269661A (zh) 基于Kafka集群的分区迁移方法和装置
CN103905512A (zh) 一种数据处理方法和设备
CN114493602B (zh) 区块链交易的执行方法、装置、电子设备和存储介质
CN109992447B (zh) 数据复制方法、装置及存储介质
CN116431632A (zh) 数据处理方法、数据库系统、计算机设备和存储介质
CN112764897B (zh) 任务请求的处理方法、装置、系统及计算机可读存储介质
CN115390754A (zh) 一种硬盘管理方法及装置
CN111212138B (zh) 一种跨站点存储系统及数据信息访问方法
CN116542668A (zh) 一种基于区块链的数据处理方法、设备及可读存储介质
CN110677497B (zh) 一种网络介质分发方法及装置
CN113347238A (zh) 基于区块链的消息分区方法及系统、设备、存储介质
CN115203133A (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