CN116010430B - 数据恢复方法、数据库系统、计算机设备和存储介质 - Google Patents
数据恢复方法、数据库系统、计算机设备和存储介质 Download PDFInfo
- Publication number
- CN116010430B CN116010430B CN202310297517.0A CN202310297517A CN116010430B CN 116010430 B CN116010430 B CN 116010430B CN 202310297517 A CN202310297517 A CN 202310297517A CN 116010430 B CN116010430 B CN 116010430B
- Authority
- CN
- China
- Prior art keywords
- data
- management module
- node
- target
- message
- 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
Links
Images
Classifications
-
- Y—GENERAL 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
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE 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/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请公开一种数据恢复方法、数据库系统、计算机设备和存储介质,属于数据库技术领域。该方法包括:管理模块在与数据系统中所有第二设备正常连接时接收第一设备发送的数据修改指令,将数据修改指令中的操作信息记录于预写日志,根据数据修改指令生成数据修改消息,根据数据修改消息操作数据系统中第二设备中的节点数据;管理模块在与数据系统中的第二设备断连后,持久化预写日志,在与断连的第二设备重连后,根据预写日志恢复数据系统中第二设备中的节点数据。本申请可将默克尔B+树中数据节点的操作压力分散到多个第二设备,可提升数据库系统的性能,且在出现管理模块与第二设备断连时,该数据库系统有自恢复和保证数据正确性的能力。
Description
技术领域
本申请涉及数据库技术领域,特别涉及一种数据恢复方法、数据库系统、计算机设备和存储介质。
背景技术
默克尔B+树是以B+树为基础进行改进的树结构,其包含两种类型的节点:索引节点和处于最后一层的数据节点。相关技术中,索引节点存放其下属节点的最小键和哈希值,数据节点存放键值对(即key-value)。默克尔B+树中每个节点存放的数据可以以页的形式存储在磁盘中。
目前,数据库可以基于默克尔B+树实现,也即,数据库的底层存储引擎可以为默克尔B+树结构。然而,在数据量持续增长的情况下,数据库的性能会在数据量积累到一定程度后,受单机内存大小和磁盘性能的影响,吞吐量表现持续下降。
发明内容
本申请提供了一种数据恢复方法、数据库系统、计算机设备和存储介质,可以提升数据库系统的性能,且在出现异常时该数据库系统具有自恢复和保证数据正确性的能力。所述技术方案如下:
第一方面,提供了一种数据恢复方法,所述方法应用于数据库系统中的管理模块,所述数据库系统包括第一设备、所述管理模块和数据系统,所述数据系统包括多个第二设备,所述第一设备用于存储默克尔B+树中索引节点的数据,所述多个第二设备用于存储所述默克尔B+树中数据节点的数据,所述方法包括:
在所述管理模块与所述数据系统中所有的第二设备均正常连接的情况下,接收所述第一设备发送的数据修改指令,将所述数据修改指令中携带的操作信息记录于所述管理模块中的预写日志,以及根据所述数据修改指令生成对应的数据修改消息,根据所述数据修改消息对所述数据系统中第二设备中的节点数据进行操作;
在所述管理模块与所述数据系统中任意一个第二设备断连后,持久化所述预写日志;
在所述管理模块与所述数据系统中断连的第二设备重新连接后,根据所述预写日志恢复所述数据系统中的第二设备中的节点数据。
在本申请中,数据库系统包括第一设备、管理模块和数据系统,数据系统包括多个第二设备,第一设备用于存储默克尔B+树中索引节点的数据,多个第二设备用于存储默克尔B+树中数据节点的数据。管理模块在与数据系统中所有的第二设备均正常连接的情况下,接收第一设备发送的数据修改指令,将该数据修改指令中携带的操作信息记录于管理模块中的预写日志,以及根据该数据修改指令生成对应的数据修改消息,根据该数据修改消息对数据系统中第二设备中的节点数据进行操作。如此,通过数据库系统中的分布式架构可将默克尔B+树中的数据节点的操作压力分散到数据系统中的多个第二设备上,可降低单个设备的数据操作压力,从而可提高该数据库系统的吞吐量,进而提升该数据库系统的性能。并且,管理模块在与数据系统中任意一个第二设备断连后,可以持久化预写日志,然后管理模块在与数据系统中断连的第二设备重新连接后,可以根据预写日志恢复数据系统中的第二设备中的节点数据。如此,使得在出现管理模块与第二设备断连这种分布式架构常见的异常场景时,该数据库系统有自恢复和保证数据正确性的能力。
第二方面,提供了一种数据恢复方法,所述方法应用于数据库系统,所述数据库系统包括第一设备、管理模块和数据系统,所述数据系统包括多个第二设备,所述第一设备用于存储默克尔B+树中索引节点的数据,所述多个第二设备用于存储所述默克尔B+树中数据节点的数据,所述方法包括:
所述管理模块在与所述数据系统中所有的第二设备均正常连接的情况下,接收所述第一设备发送的数据修改指令,将所述数据修改指令中携带的操作信息记录于所述管理模块中的预写日志,以及根据所述数据修改指令生成对应的数据修改消息,根据所述数据修改消息对所述数据系统中第二设备中的节点数据进行操作;
所述管理模块在与所述数据系统中任意一个第二设备断连后,持久化所述预写日志;
所述管理模块在与所述数据系统中断连的第二设备重新连接后,根据所述预写日志恢复所述数据系统中的第二设备中的节点数据。
第三方面,提供了一种数据库系统,所述数据库系统包括第一设备、管理模块和数据系统,所述数据系统包括多个第二设备,所述第一设备用于存储默克尔B+树中索引节点的数据,所述多个第二设备用于存储所述默克尔B+树中数据节点的数据;
所述管理模块,用于在与所述数据系统中所有的第二设备均正常连接的情况下,接收所述第一设备发送的数据修改指令,将所述数据修改指令中携带的操作信息记录于所述管理模块中的预写日志,以及根据所述数据修改指令生成对应的数据修改消息,根据所述数据修改消息对所述数据系统中第二设备中的节点数据进行操作;
所述管理模块,还用于在与所述数据系统中任意一个第二设备断连后,持久化所述预写日志;
所述管理模块,还用于在与所述数据系统中断连的第二设备重新连接后,根据所述预写日志恢复所述数据系统中的第二设备中的节点数据。
第四方面,提供了一种计算机设备,所述计算机设备包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现上述第一方面或所述第二方面所述的数据恢复方法中由第一设备、管理模块或第二设备执行的操作。
第五方面,提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现上述第一方面或第二方面所述的数据恢复方法中由第一设备、管理模块或第二设备执行的操作。
第六方面,提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述第一方面或第二方面所述的数据恢复方法中由第一设备、管理模块或第二设备执行的操作。
可以理解的是,上述第二方面、第三方面、第四方面、第五方面、第六方面的有益效果可以参见上述第一方面中的相关描述,在此不再赘述。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实施例提供的一种默克尔B+树的示意图;
图2是本申请实施例提供的一种数据库系统的结构示意图;
图3是本申请实施例提供的一种数据处理方法的流程图;
图4是本申请实施例提供的一种数据恢复方法的流程图;
图5是本申请实施例提供的一种计算机设备的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请的实施方式作进一步地详细描述。
应当理解的是,本申请提及的“多个”是指两个或两个以上。在本申请的描述中,除非另有说明,“/”表示或的意思,比如,A/B可以表示A或B;本文中的“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,比如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,为了便于清楚描述本申请的技术方案,采用了“第一”、“第二”等字样对功能和作用基本相同的相同项或相似项进行区分。本领域技术人员可以理解“第一”、“第二”等字样并不对数量和执行次序进行限定,并且“第一”、“第二”等字样也并不限定一定不同。
在本申请中描述的“一个实施例”或“一些实施例”等语句意味着在本申请的一个或多个实施例中包括该实施例描述的特定特征、结构或特点。由此,在本申请中的不同之处出现的“在一个实施例中”、“在一些实施例中”、“在其他一些实施例中”、“在另外一些实施例中”等语句不是必然都参考相同的实施例,而是意味着“一个或多个但不是所有的实施例”,除非是以其他方式另外特别强调。此外,术语“包括”、“包含”、“具有”及它们的变形都意味着“包括但不限于”,除非是以其他方式另外特别强调。
在对本申请实施例进行详细地解释说明之前,先对本申请实施例的应用场景予以说明。
本申请实施例应用于基于默克尔B+树进行数据处理的场景中。比如,区块链系统中的执行模块在执行完一个区块中所有的交易后,会产生一系列的账本修改集。这种情况下,可以通过本申请实施例提供的数据处理方法来基于默克尔B+树处理这些账本修改集。
接下来对默克尔B+树的结构进行介绍。
默克尔B+树是一种树数据结构,默克尔B+树包含两种类型的节点:索引节点(indexNode)和处于最下层的数据节点(dataNode)。索引节点和数据节点均为逻辑节点。
数据节点中存放有多个键值对,每个键值对包括一个key值和一个value值。数据节点具有最小键和哈希值。数据节点的最小键是其存放的所有键值对的key值中最小的key值。可选地,数据节点的哈希值是其存放的所有键值对拼接得到的数据的哈希值,或者,数据节点的哈希值是其存放的所有键值对的value值拼接得到的数据的哈希值。
索引节点中存放有其下属的所有节点中每个节点的最小键和哈希值。索引节点具有最小键和哈希值,索引节点的最小键是其存放的所有节点的最小键中最小的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+树中根节点(MerkleRoot)的页标识,根据默克尔B+树中根节点的页标识可以从磁盘中获取到默克尔B+树中所有的节点数据,因而默克尔B+树中根节点的页标识可以与磁盘中保存的默克尔B+树的逻辑树对应。当后续对默克尔B+树进行更新时,每更新一次,就会在磁盘中保存默克尔B+树的一个新版本的逻辑树,且会记录与这一版本的逻辑树对应的根节点的页标识(即更新后的默克尔B+树中根节点的页标识)。这种情况下,磁盘中不仅保存有最新版本的逻辑树,还保存有至少一个历史版本的逻辑树。可以记录与最新版本的逻辑树对应的根节点的页标识,还可以记录与该至少一个历史版本中每个历史版本的逻辑树对应的根节点的页标识。
在多版本控制和数据回滚方面,由于默克尔B+树相当于在磁盘中保存了多个逻辑树,当默克尔B+树需要回滚到某个版本时,只需要将当前根节点指向这个版本的逻辑树的根节点即可。
下面对本申请实施例提供的数据库系统进行说明。
本申请实施例提供的数据库系统保留了现有的基于默克尔B+树的单机数据库(可称为vidb(Verified Independent Database,经过验证的独立数据库))已经支持的功能,以保证该数据库系统可以适用于现有的需要应用默克尔B+树进行数据处理的系统。比如,该数据库系统可以适用于区块链系统,区块链系统可以对该数据库系统进行数据读写,比如,区块链系统可以从该数据库系统中查询数据、向该数据库系统中添加数据、对该数据库系统中的数据进行更新或删除等。
默克尔B+树的数据包括索引数据(index数据)和用户数据(data数据)。索引数据是指索引节点的数据。用户数据是指数据节点的数据。相应的,磁盘中也存储了索引数据和用户数据。默克尔B+树的结构特性决定了一般情况下索引数据的大小远小于用户数据的大小,因而从磁盘压力角度以及内存管理角度考虑,本申请实施例提供的数据库系统中的分布式横向拓展方案是从用户数据入手来对现有的单机数据库进行改进。
图2是本申请实施例提供的一种数据库系统的结构示意图。参见图2,该数据库系统可以包括:第一设备201、管理模块202、数据系统203。数据系统203可以包括多个第二设备2031。
第一设备201可以与管理模块202进行通信,比如,第一设备201可以通过有线连接或无线连接与管理模块202进行通信。管理模块202可以与数据系统203进行通信,比如,管理模块202可以通过有线连接或无线连接与数据系统203中的每个第二设备2031进行通信。
第一设备201也可以称为主机。第一设备201用于存储默克尔B+树的索引数据,即存储默克尔B+树中索引节点的数据,具体地,第一设备201可以将默克尔B+树中每个索引节点的数据存储至第一设备201的磁盘中的磁盘页。可选地,第一设备201可以与外部模块对接,以处理外部模块发送的需要处理的用户数据,比如,第一设备201可以与区块链系统中的执行模块对接,以处理执行模块发送的账本修改集。
第一设备201维护index数据管理和index文件存储的功能。index数据在第一设备201的内存中以逻辑节点进行管理,在第一设备201的磁盘上按照磁盘页为单位进行组织,磁盘页也可称为page,通常为4K的字节数组。第一设备201中的每个磁盘页具有在第一设备201中唯一的页标识。由于第一设备201的磁盘页中存储有默克尔B+树中所有索引节点的数据,所以本申请实施例中默克尔B+树中一个索引节点的页标识用于在第一设备201的磁盘页中唯一标识存储有这个索引节点的数据的磁盘页。
第二设备2031也可以称为数据分片服务器。第二设备2031用于存储默克尔B+树的用户数据,即存储默克尔B+树中数据节点的数据,具体地,第二设备2031可以将默克尔B+树中数据节点的数据存储至第二设备2031的磁盘中的磁盘页。数据系统203中的多个第二设备2031用于存储默克尔B+树中所有数据节点的数据。可选地,每个第二设备2031可以是一台物理机,拥有独立的处理器、内存和磁盘资源,第二设备2031维护用户数据,负责用户数据的读写。
第二设备2031维护data数据管理和data文件存储的功能。data数据在第二设备2031的内存中以逻辑节点进行管理,在第二设备2031的磁盘上按照磁盘页为单位进行组织。第二设备2031中的每个磁盘页具有在第二设备2031中唯一的页标识(可称为局部页标识),还具有在整个数据系统203中唯一的页标识(可称为全局页标识)。在本申请实施例提供的分布式架构下,全局页标识需要能够表示第二设备信息和磁盘页信息,也即,全局页标识用于标识某个第二设备2031中的某个磁盘页,这可以通过将全局页标识关联到第二设备标识和局部页标识来实现。由于数据系统203中的第二设备2031的磁盘页中存储有默克尔B+树中所有数据节点的数据,所以本申请实施例中可以通过默克尔B+树中一个数据节点的全局页标识关联的第二设备标识和局部页标识唯一定位到数据系统203中的一个第二设备2031中的一个磁盘页。
管理模块202向上对接第一设备201,向下对接数据系统203。管理模块202可以是独立的物理机。管理模块202可以接收、处理并回复第一设备201发送的所有与用户数据有关的指令(包括但不限于数据查询指令、数据修改指令、数据回滚指令等)。管理模块202可以总体管理数据系统203,比如,管理模块202可以内部维护数据系统203的设备拓扑元信息、各个第二设备2031内部的磁盘页分配控制、各个第二设备2031的执行进度控制。其中,数据系统203的设备拓扑元信息用于指示数据系统203中的第二设备2031的底层拓扑,数据系统203的设备拓扑元信息可以包括数据系统203中多个第二设备2031的设备数量,还可以包括数据系统203中的多个第二设备2031中每个第二设备2031的设备标识等。管理模块202对第二设备2031内部的磁盘页分配控制,是指管理模块202为第二设备2031中数据节点的数据分配磁盘页进行存储,可选地,可以通过freelist(可利用空间表)组件为数据节点分配页标识,以通过所分配的页标识所标识的磁盘页来存储数据节点的数据,示例地,freelist组件用于配置空闲页标识列表、待释放页标识列表和最大页标识。管理模块202对第二设备2031的执行进度控制,是指管理模块202管理第二设备2031针对数据节点的数据修改操作的执行进度。
在一些实施例中,区块链系统中的执行模块在执行某个区块中的交易的过程中会产生需要查询的键(即key值),该执行模块可以向第一设备201发送携带有这个区块的区块标识和待查询的key值的数据查询请求。第一设备201接收到该数据查询请求后可以根据最新版本的默克尔B+树中的根节点的标识,通过管理模块202从多个第二设备2031中查询该数据查询请求携带的key值对应的value值并返回给该执行模块。
在一些实施例中,该执行模块在执行完某个区块中所有的交易后会产生一系列的账本修改集,这些账本修改集可以包括需要添加的键值对、需要更新的键值对、和/或需要删除的键等,这种情况下,该执行模块可以向第一设备201发送携带有这个区块的区块标识和账本修改集的数据修改请求。第一设备201接收到该数据修改请求后可以确定这个区块的执行进度为正在执行,然后根据最新版本的默克尔B+树中的根节点的页标识和该账本修改集中的键值对和/或键,通过管理模块202更新多个第二设备2031中存储的用户数据和第一设备201存储的索引数据,也即更新默克尔B+树,在完成对默克尔B+树的更新后第一设备201可以确定这个区块的执行进度为已执行完成。之后,若多个第二设备2031将更新后的用户数据存储至磁盘页且第一设备201也将更新后的索引数据存储至磁盘页,就实现了对更新后的默克尔B+树的持久化,则第一设备201可以确定这个区块的执行进度为已落盘。
由上可知,在本申请实施例中,第一设备201接收到一个区块对应的账本修改集后,即可确定这个区块的执行进度为正在执行。之后,第一设备201可以从根节点开始,根据该账本修改集,通过与管理模块202、多个第二设备2031的协同,完成对默克尔B+树的更新,也就完成了这个区块的执行流程,此时这个区块的执行进度为已执行完成。在完成对默克尔B+树的更新后,第一设备201和多个第二设备2031若完成对更新后的默克尔B+树的持久化,也就完成了这个区块的落盘流程,此时这个区块的执行进度为已落盘。
需说明的是,在该数据库系统中,由于第一设备201负责索引数据层(index层),而管理模块202和数据系统203负责用户数据层(data层),所以index层的行为和data层的行为可以天然并发进行。如此,该数据库系统对于一个区块的执行过程的并发度较高。
需说明的是,上述数据库系统理论上可以实现无限制的横向拓展,即可以动态的增加数据系统203中的第二设备2031,以此保证在数据量持续增大的情况下,该数据库系统维持稳定的吞吐能力,获得稳定的性能表现。
另外,在该数据库系统对接区块链系统的情况下,由于区块链系统中存在着区块标识(如区块号)这一天然的全局时钟,所以对数据系统203中的第二设备2031的动态增加可以根据区块标识实现。具体来讲,若该数据库系统中的第一设备201接收到携带有目标设备标识的设备增加请求,则第一设备201可以先确定当前正在处理的账本修改集对应的区块标识,该账本修改集对应的区块标识用于指示区块链系统中的执行模块是在执行完哪个区块中的交易后产生的该账本修改集。第一设备201在处理完这一区块标识对应的账本修改集,即在根据这一区块标识对应的账本修改集完成对默克尔B+树的更新后,再指示管理模块202将该设备增加请求携带的目标设备标识增加到数据系统203的设备拓扑元信息,将目标设备标识增加到数据系统203的设备拓扑元信息后,即可实现将目标设备标识所标识的设备添加到数据系统203,此时可将目标设备标识所标识的设备称为第二设备2031,从而第一设备201在处理下一区块标识对应的账本修改集时可以根据数据系统203的新的底层拓扑来处理。如此,可以实现对区块链系统透明的横向拓展功能。
示例地,第一设备201接收到携带有目标设备标识的设备增加请求后,需要确定当前区块的执行进度。若当前区块的执行进度不为已执行完成,则第一设备201需等待当前区块的执行进度为已执行完成后,确定最新执行完成的区块的下一个区块的区块标识。然后第一设备201将目标设备标识和该区块标识(可称为指定区块标识)携带于设备新增指令中发送给管理模块202,以指示新增目标设备标识所标识的设备以及指示所新增的设备是从指定区块标识所标识的区块开始被启用。管理模块202接收到该设备新增指令后,可以将指定区块标识和目标设备标识添加到数据系统203的设备拓扑元信息,还可以将新增设备后数据系统203中第二设备2031的设备数量添加到数据系统203的设备拓扑元信息,如此,后续在执行区块标识大于或等于指定区块标识的区块时可以基于新增设备后的数据系统203进行。
需要说明的是,在本次在数据系统203中新增设备之前,管理模块202还可以确定已经分配出去的最大全局页标识。
管理模块202可以将已经分配出去的最大全局页标识确定为全局页标识分界点,该全局页标识分界点具有对应的旧设备数量(即本次新增设备之前数据系统203中第二设备2031的设备数量)和新设备数量(即本次新增设备之后数据系统203中第二设备2031的设备数量)。
管理模块202根据该全局页标识分界点可以确定各个第二设备2031的极限局部页标识。各个第二设备2031的极限局部页标识为小于或等于该全局页标识分界点的全局页标识在各个第二设备2031中对应的最大的局部页标识。具体来讲,管理模块202可以将该全局页标识分界点与该旧设备数量进行取模运算,得到第二设备标识,以及将该全局页标识分界点除以该旧设备数量得到的数值进行向下取整,得到局部页标识,然后将设备标识小于或等于该第二设备标识的第二设备2031的极限局部页标识设置为该局部页标识,将设备标识大于该第二设备标识的第二设备2031的极限局部页标识设置为比该局部页标识小1的局部页标识。
管理模块202可以确定各个第二设备2031的预置值。对于数据系统203中初始的多个第二设备2031,每个第二设备2031的预置值均为0。本次在数据系统203中新增设备之前,管理模块202根据各个第二设备2031的极限局部页标识可以确定本次新增的第二设备2031的预置值,本次新增的第二设备2031的预置值为在本次新增设备后比数据系统203中设备标识最小的第二设备2031的极限局部页标识大1的局部页标识对应的全局页标识。可选地,管理模块202可以将各个第二设备2031的极限局部页标识中最大的极限局部页标识与1相加后再与该全局页标识分界点对应的新设备数量相乘,得到本次新增的第二设备2031的预置值。
通过上述过程,管理模块202获得指定区块标识、目标设备标识、全局页标识分界点、各个第二设备2031的极限局部页标识(即各个第二设备2031的设备标识对应的极限局部页标识)、全局页标识分界点对应的旧设备数量、全局页标识分界点对应的新设备数量、新增设备的预置值(即目标设备标识对应的预置值)。这些信息是本次新增设备时产生的设备动态信息,管理模块202可以将该设备动态信息也记录在数据系统203的设备拓扑元信息中。
这种情况下,在大于或等于指定区块标识所标识的指定区块的执行过程中,管理模块202若接收到第一设备201发送的一个全局页标识,则在这个全局页标识小于或等于该全局页标识分界点的情况下,管理模块202将这个全局页标识与该全局页标识分界点对应的旧设备数量进行取模运算,得到第二设备标识,然后将这个全局页标识减去该第二设备标识对应的预置值后再除以该旧设备数量后得到的数值进行向下取整,得到局部页标识。在这个全局页标识大于该全局页标识分界点的情况下,管理模块202将这个全局页标识与该全局页标识分界点对应的新设备数量进行取模运算,得到第二设备标识,然后将这个全局页标识减去该第二设备标识对应的预置值后再除以该新设备数量后得到的数值进行向下取整,得到局部页标识。
这种情况下,在大于或等于指定区块标识所标识的指定区块的执行过程中,管理模块202若在一个第二设备2031中为一个数据节点分配了一个局部页标识,则在这个第二设备2031不为最新增加的第二设备2031(即这个第二设备2031的设备标识不为目标设备标识)的情况下,若这个局部页标识小于或等于这个第二设备2031的极限局部页标识,则管理模块202将这个局部页标识与该全局页标识分界点对应的旧设备数量相乘后与这个第二设备2031的设备标识和这个第二设备2031的设备标识对应的预置值累加,得到全局页标识。在这个第二设备2031不为最新增加的第二设备2031的情况下,若这个局部页标识大于这个第二设备2031的极限局部页标识,则管理模块202将这个局部页标识与该全局页标识分界点对应的新设备数量相乘后与这个第二设备2031的设备标识和这个第二设备2031的设备标识对应的预置值累加,得到全局页标识。在这个第二设备2031为最新增加的第二设备2031的情况下,管理模块202将这个局部页标识与该全局页标识分界点对应的新设备数量相乘后与这个第二设备2031的设备标识和这个第二设备2031的设备标识对应的预置值累加,得到全局页标识。
值得注意的是,在该数据库系统的运行过程中,可能会多次向数据系统203中增加第二设备2031,则管理模块202在每次向数据系统203中新增第二设备2031后,就会向数据系统203的设备拓扑元信息中添加一个设备动态信息。如此,数据系统203的设备拓扑元信息中包括多个设备动态信息,该多个设备动态信息是顺序记录的,每个设备动态信息包括指定区块标识、目标设备标识、全局页标识分界点、各个第二设备2031的极限局部页标识、全局页标识分界点对应的旧设备数量和新设备数量、目标设备标识对应的预置值。
这种情况下,管理模块202在将一个全局页标识转换为第二设备标识和局部页标识时,若这个全局页标识小于该多个设备动态信息中最早记录的设备动态信息中的全局页标识分界点,则管理模块202可以将这个全局页标识与该最早记录的设备动态信息中的全局页标识分界点对应的旧设备数量进行取模运算,得到第二设备标识,然后将这个全局页标识减去该第二设备标识对应的预置值后再除以该旧设备数量后得到的数值进行向下取整,得到局部页标识。若这个全局页标识大于该多个设备动态信息中最晚记录的设备动态信息中的全局页标识分界点,则管理模块202可以将这个全局页标识与该最晚记录的设备动态信息中的全局页标识分界点对应的新设备数量进行取模运算,得到第二设备标识,然后将这个全局页标识减去该第二设备标识对应的预置值后再除以该新设备数量后得到的数值进行向下取整,得到局部页标识。若这个全局页标识大于该多个设备动态信息中一个设备动态信息中的全局页标识分界点且小于或等于在这个设备动态信息后顺序记录的下一个设备动态信息中的全局页标识分界点,则管理模块202可以将这个全局页标识与这个设备动态信息中的全局页标识分界点对应的新设备数量进行取模运算,得到第二设备标识,然后将这个全局页标识减去该第二设备标识对应的预置值后再除以该新设备数量后得到的数值进行向下取整,得到局部页标识。
管理模块202在将一个第二设备标识和一个局部页标识转换为全局页标识时,若这个第二设备标识与该多个设备动态信息中每个设备动态信息中的目标设备标识均不同,则说明这个第二设备标识所标识的第二设备2031为数据系统203中初始的第二设备2031,在这个局部页标识小于或等于该多个设备动态信息中最早记录的设备动态信息中这个第二设备标识对应的极限局部页标识的情况下,管理模块202将这个局部页标识与该最早记录的设备动态信息中全局页标识分界点对应的旧设备数量相乘后与这个第二设备标识和这个第二设备标识对应的预置值累加,得到全局页标识。若这个第二设备标识与该多个设备动态信息中每个设备动态信息中的目标设备标识均不同,则在这个局部页标识大于该多个设备动态信息中最晚记录的设备动态信息中这个第二设备标识对应的极限局部页标识的情况下,管理模块202将这个局部页标识与该最晚记录的设备动态信息中全局页标识分界点对应的新设备数量相乘后与这个第二设备标识和这个第二设备标识对应的预置值累加,得到全局页标识。若这个第二设备标识与该多个设备动态信息中每个设备动态信息中的目标设备标识均不同,则在这个局部页标识大于一个设备动态信息中这个第二设备标识对应的极限局部页标识且小于在这个设备动态信息后顺序记录的下一个设备动态信息中这个第二设备标识对应的极限局部页标识的情况下,管理模块202将这个局部页标识与这个设备动态信息中全局页标识分界点对应的新设备数量相乘后与这个第二设备标识和这个第二设备标识对应的预置值累加,得到全局页标识。若这个第二设备标识与该多个设备动态信息中任意的一个设备动态信息中的目标设备标识相同,则管理模块202将这个局部页标识与这个设备动态信息中全局页标识分界点对应的新设备数量相乘后与这个第二设备标识和这个第二设备标识对应的预置值累加,得到全局页标识。
下面对基于该数据库系统构建初始的默克尔B+树的过程进行说明,该过程可以包括如下步骤(1)至步骤(4):
(1)第一设备获取待存储的多个键值对。
该多个键值对是需要基于默克尔B+树进行存储的键值对。该多个键值对是用于构建初始默克尔B+树的键值对。
该多个键值对可以由其他系统发送给第一设备。比如,区块链系统中的执行模块在执行完一个区块中所有的交易后,会产生一系列的账本修改集,这些账本修改集可以包括需要存储的多个键值对。这种情况下,区块链系统中的执行模块可以将该多个键值对携带于数据存储请求中发送给第一设备,以指示第一设备基于默克尔B+树对该多个键值对进行存储,此时第一设备即可根据该多个键值对构建初始默克尔B+树。
区块链系统中存在着区块标识(如区块号)这一天然的全局时钟,区块标识是连续递增的。在一些实施例中,该数据存储请求中可以携带区块标识,该区块标识用于指示是在执行哪个区块中的交易后产生的该数据存储请求。第一设备可以将该数据存储请求中携带的区块标识确定为当前区块的区块标识,且可以确定当前区块的执行进度为正在执行。
在一些实施例中,第一设备接收到区块链系统发送的数据存储请求后,可以将该数据存储请求中携带的区块标识与待存储的该多个键值对对应记录在第一设备中的WAL(Write Ahead Log,预写日志)中,具体可以记录与该数据存储请求对应的一条日志信息,这条日志信息中记录有该区块标识、待存储的该多个键值对。
(2)第一设备向管理模块发送携带有该多个键值对的数据存储指令。
该数据存储指令中可以携带该数据存储请求中的区块标识。可选地,第一设备可以调用spill接口来向管理模块发送数据存储指令。spill接口用于更新data层的节点数据。
该数据存储指令用于指示根据待存储的该多个键值对构建初始默克尔B+树中的数据节点。根据该多个键值对构建默克尔B+树中的数据节点,即是将该多个键值对存放至默克尔B+树中的数据节点。
默克尔B+树中的数据节点包含键值对。数据节点具有最小键和哈希值。数据节点的最小键是其包含的所有键值对的key值中最小的key值。可选地,数据节点的哈希值是其包含的所有键值对拼接得到的数据的哈希值,或者,数据节点的哈希值是其存放的所有键值对的value值拼接得到的数据的哈希值。
默克尔B+树中的索引节点包含其下属的所有节点中每个节点的最小键和哈希值。索引节点具有最小键和哈希值,索引节点的最小键是其包含的所有节点的最小键中最小的key值,索引节点的哈希值是其包含的所有节点的哈希值拼接得到的数据的哈希值。
(3)管理模块接收到第一设备发送的数据存储指令后,将该多个键值对发送给数据系统中的一个第二设备。
在一些实施例中,管理模块接收到第一设备发送的数据存储指令后,可以将该数据存储指令中携带的区块标识与待存储的该多个键值对对应记录在管理模块中的预写日志中,具体可以记录与该数据存储指令对应的一条日志信息,这条日志信息中记录有该区块标识、待存储的该多个键值对。
在一些实施例中,管理模块可以生成携带有该多个键值对的数据存储消息,将该数据存储消息发送给数据系统中的一个第二设备,并将该数据存储消息存储于第一缓存区,可选地,该数据存储消息中可以携带该数据存储指令中的区块标识。第一缓存区用于在管理模块与数据系统中的所有第二设备正常连接时,缓存管理模块发送给数据系统中的第二设备的所有消息。
可选地,管理模块可以从数据系统中随机选择一个第二设备,向这个第二设备发送该多个键值对。
或者,管理模块可以根据数据系统中每个第二设备的设备标识,选择设备标识最小的一个第二设备,向这个第二设备发送该多个键值对。比如,数据系统中第二设备的数量为10,这10个第二设备的设备标识分别为0至9,则管理模块可以向设备标识为0的第二设备发送该多个键值对。
(4)这个第二设备接收到该多个键值对后,根据该多个键值对构建数据节点,向管理模块发送磁盘页分配请求。
这个第二设备根据该多个第二键值对构建数据节点的过程与相关技术中某个设备根据一些键值对构建数据节点的过程类似,本申请实施例对此不进行详细阐述。
需说明的是,这个第二设备在根据该多个第二键值对构建数据节点的过程中不为构建出的各个数据节点分配页标识,而是在其后向管理模块发送磁盘页分配请求,以请求管理模块为构建出的各个数据节点分配页标识。该磁盘页分配请求中携带构建出的各个数据节点的最小键和哈希值。该磁盘页分配请求用于请求为构建出的各个数据节点分配页标识,也即,请求分配用于存储构建出的各个数据节点的数据的磁盘页。
另外,这个第二设备构建出的各个数据节点的数据量均小于或等于预设数据量。其中,预设数据量可以预先进行设置,如预设数据量可以与磁盘页的存储空间大小(如4K)相同。
(5)管理模块接收到这个第二设备发送的磁盘页分配请求后,为该磁盘页分配请求中指示的各个数据节点分配这个第二设备中的局部页标识。
可选地,管理模块内部为这个第二设备维护一个freelist组件,这个第二设备的freelist组件用于配置这个第二设备的空闲页标识列表、待释放页标识列表和最大页标识,这个第二设备的freelist组件用于实现这个第二设备中磁盘页的分配。管理模块可以通过这个第二设备的freelist组件为这个第二设备构建出的每个数据节点分配这个第二设备中的局部页标识,以实现在这个第二设备中为构建出的每个数据节点分配磁盘页。管理模块通过这个第二设备的freelist组件为这个第二设备构建出的每个数据节点分配这个第二设备中的局部页标识后,这个第二设备的freelist组件发生修改,修改后的freelist组件与该数据存储指令中携带的区块标识对应。
管理模块为该磁盘页分配请求中指示的某个数据节点分配这个第二设备中的局部页标识后,这个数据节点就具有了第二设备标识(即这个第二设备的设备标识)和局部页标识,用以指示为这个数据节点在该第二设备标识所标识的第二设备中分配该局部页标识所标识的磁盘页,也即,指示将这个数据节点的数据存储至该第二设备标识所标识的第二设备中由该局部页标识所标识的磁盘页。
这种情况下,管理模块可以将为该磁盘页分配请求指示的各个数据节点分配的局部页标识和对应的第二设备标识携带于磁盘页分配结果中返回给这个第二设备。
这个第二设备接收到该磁盘页分配结果后,若确定该磁盘页分配结果中的第二设备标识与这个第二设备的设备标识相同,则可以向管理模块发送针对该数据存储消息的回复消息,以指示已完成对该数据存储消息的处理。之后,可选地,这个第二设备可以直接根据该磁盘页分配结果中各个数据节点的局部页标识,将各个数据节点的数据存储至这个第二设备的磁盘页中由该局部页标识所标识的磁盘页。或者,这个第二设备可以在接收到管理模块发送的携带有该数据存储消息中的区块标识的持久化消息后,再根据该磁盘页分配结果中各个数据节点的局部页标识,将各个数据节点的数据存储至这个第二设备的磁盘页中由该局部页标识所标识的磁盘页。
管理模块在为构建出的某个数据节点分配了这个第二设备中的局部页标识后,还可以根据这个第二设备的设备标识和该局部页标识确定关联的全局页标识。然后,管理模块在接收到这个第二设备发送的针对该数据存储消息的回复消息后,可以删除第一缓存区中存储的数据存储消息,并向第一设备发送针对该数据存储指令的回复消息(可称为数据存储结果),以指示已完成对该数据存储指令的处理,该数据存储结果包括构建出的各个数据节点的最小键、哈希值和全局页标识。第一设备接收到该数据存储结果后,可以根据该数据存储结果中的各个数据节点的最小键、哈希值、全局页标识构建索引节点。
第一设备在构建索引节点的过程中,可以为构建出的各个索引节点分配页标识,任意一个索引节点的页标识用于在第一设备中标识后续用来存储这个索引节点的数据的磁盘页。可选地,第一设备可以通过第一设备的freelist组件为第一设备构建出的每个索引节点分配第一设备中的页标识,第一设备的freelist组件用于配置第一设备的空闲页标识列表、待释放页标识列表和最大页标识,第一设备的freelist组件用于实现第一设备中磁盘页的分配。这种情况下,对于任意一个索引节点,第一设备还可以在这个索引节点的数据中添加这个索引节点的页标识以及这个索引节点下属的每个节点的页标识。另外,第一设备构建出的每个索引节点的数据量均小于或等于预设数据量。
可选地,第一设备可以直接将构建出的各个索引节点的数据存储至第一设备的磁盘页,比如,第一设备可以将构建出的各个索引节点的数据存储至第一设备中由各个索引节点的页标识所标识的磁盘页。或者,第一设备可以在接收到区块链系统发送的携带有该数据存储请求中的区块标识的持久化请求后,再将构建出的各个索引节点的数据存储至第一设备的磁盘页。
需说明的是,这个第二设备将构建出的各个数据节点的数据存储至这个第二设备的磁盘页后,就实现了对默克尔B+树中的数据节点的持久化。第一设备将构建出的各个索引节点的数据存储至第一设备的磁盘页后,就实现了对默克尔B+树中的索引节点的持久化。
这个第二设备将默克尔B+树中各个数据节点的数据存储至这个第二设备的磁盘页后,以及第一设备将默克尔B+树中各个索引节点的数据存储至这个第一设备的磁盘页后,相当于在磁盘中保存了这一版本的默克尔B+树的逻辑树。这种情况下,第一设备还可以记录默克尔B+树中根节点的页标识,根据默克尔B+树中根节点的页标识可以通过根节点逐层获取到默克尔B+树中所有的节点数据,即可以从磁盘中获取到默克尔B+树中所有的节点数据,因而默克尔B+树中根节点的页标识可以与磁盘中保存的这一版本的默克尔B+树的逻辑树对应。
需说明的是,第一设备在构建出根节点后,可以获得该根节点的数据,此时第一设备可以确定当前区块的执行进度为已执行完成。之后,第一设备可以根据该根节点的数据获取该根节点的哈希值,并将该根节点的哈希值返回给上层的区块链系统。并且,第一设备还可以记录该根节点的页标识与当前区块的区块标识之间的映射关系,以便可以确定该根节点的页标识与哪一版本的默克尔B+树对应。区块链系统在接收到第一设备发送的该根节点的哈希值后,可以确定当前区块已执行完成,此时区块链系统可以开始执行下一个区块。
在一些实施例中,这个第二设备在接收到管理模块发送的磁盘页分配结果后,若确定该磁盘页分配结果中的第二设备标识与这个第二设备的设备标识相同,则可以直接将构建出的各个数据节点的数据存储至这个第二设备的磁盘页;另外,第一设备在构建出根节点后,也可以直接将构建出的各个索引节点的数据存储至第一设备的磁盘页。这个第二设备将构建出的各个数据节点的数据均存储至这个第二设备的磁盘页后,可以向管理模块发送携带有区块标识的持久化完成消息。之后,管理模块可以向第一设备发送携带有该区块标识的持久化完成消息。第一设备接收到持久化完成消息后,在已将构建出的各个索引节点的数据存储至第一设备的磁盘页的情况下,确定该区块标识所标识的区块的执行进度为已落盘。之后,第一设备向区块链系统发送携带有该区块标识的持久化完成消息,以指示该区块标识所标识的区块已落盘。
在另一些实施例中,区块链系统接收到第一设备发送的该根节点的哈希值后,可以向第一设备发送携带有区块标识的持久化请求。第一设备接收到该持久化请求后,可以将构建出的各个索引节点的数据存储至第一设备的磁盘页,并向管理模块发送携带有该持久化请求中的区块标识的持久化指令,可选地,第一设备可以调用write接口向管理模块发送该持久化指令,write接口用于对data层的节点数据进行持久化。管理模块接收到该持久化指令后,生成携带有该持久化指令中的区块标识的持久化消息,向这个第二设备发送该持久化消息,并将该持久化消息存储于第一缓存区。这个第二设备接收到该持久化消息后,可以将构建出的各个数据节点的数据均存储至这个第二设备的磁盘页,然后向管理模块发送针对该持久化消息的回复消息,以指示已完成对该持久化消息的处理。管理模块接收到针对该持久化消息的回复消息后,可以删除第一缓存区中存储的该持久化消息,然后向第一设备发送针对该持久化指令的回复消息,以指示已完成对该持久化指令的处理。第一设备接收到针对该持久化指令的回复消息后,在已将构建出的各个索引节点的数据存储至第一设备的磁盘页的情况下,确定该持久化请求中的区块标识所标识的区块的执行进度为已落盘。之后,第一设备向区块链系统发送针对该持久化请求的回复消息,以指示该区块标识所标识的区块已落盘。
在通过上述步骤构建初始的默克尔B+树,并在磁盘中保存了默克尔B+树中所有的节点数据后,后续就可以基于默克尔B+树进行数据处理。下面对本申请实施例提供的数据处理方法进行详细地解释说明。
图3是本申请实施例提供的一种数据处理方法的流程图,该方法可以应用于图2所示的数据库系统。参见图3,该方法包括以下步骤:
步骤301:第一设备接收数据修改请求,该数据修改请求携带数据修改集。
该数据修改请求用于指示基于该数据修改请求携带的数据修改集更新默克尔B+树,该数据修改集可以包括至少一个指定数据,任意一个指定数据可以为待添加的键值对、待更新的键值对、或待删除的键。示例地,指定数据中的key值、value值的类型都可以是字节数组类型。
该数据修改请求可以由其他系统发送给第一设备。示例地,区块链系统中的执行模块在执行完一个区块中所有的交易后会产生一系列的账本修改集,账本修改集可以包括需要添加的键值对、需要更新的键值对、和/或需要删除的键。这种情况下,该执行模块可以向第一设备发送携带有账本修改集(即上述数据修改集)的数据修改请求。可选地,该数据修改请求中还可以携带区块标识,该区块标识用于指示是在执行哪个区块中的交易后产生的该数据修改请求。该数据修改请求中的区块标识所标识的区块为该数据修改请求中的数据修改集对应的区块,基于该数据修改集更新默克尔B+树的过程是该数据修改集对应的区块执行过程的一个环节。第一设备可以将该数据修改请求中携带的区块标识确定为当前区块的区块标识,且确定当前区块的执行进度为正在执行。可选地,第一设备可以将该数据修改请求中携带的区块标识和数据修改集记录至第一设备中的预写日志中,具体可以记录与该数据修改请求对应的一条日志信息,这条日志信息中记录有该区块标识、该数据修改集。
可选地,本申请实施例中的默克尔B+树可支持批量修改。这种情况下,该数据修改集包括的指定数据的数量可以为多个,也即,该数据修改集包括的待添加的键值对、待更新的键值对、和/或待删除的键的数量可以为多个,据此可以实现对默克尔B+树中节点的并发更新。
在一些实施例中,第一设备可以将该数据修改请求中的区块标识和该数据修改集发送给管理模块,以便管理模块能够获得该区块标识所标识的区块的全量的修改集,该全量的修改集即是该数据修改集。
步骤302:第一设备获取该数据修改集中每个指定数据在默克尔B+树中需分发至的目标数据节点的全局页标识。
如此,第一设备可以得到该数据修改集中所有指定数据需分发至的所有目标数据节点(可称为n个目标数据节点,n为正整数)中每个目标数据节点的全局页标识。
一个目标数据节点的全局页标识用于在数据系统的所有第二设备的磁盘页中唯一标识存储有这个目标数据节点的数据的磁盘页。在一些实施例中,第一设备不仅可以确定目标数据节点的全局页标识,还可以确定目标数据节点的溢出(overflow)信息,该溢出信息用于指示目标数据节点真实对应的磁盘页数量,即目标数据节点的数据存储在几个连续的磁盘页中。一般情况下,磁盘页可存储的数据量是一致的,比如,磁盘页可存储的数据量均可以为预设数据量(包括但不限于4K)。这种情况下,若一个数据节点仅在包含一个键值对的情况下其数据量就大于预设数据量,则可以分配多个连续的磁盘页来存储这个数据节点的数据,这种情况下,这个数据节点不仅具有全局页标识,还具有溢出信息,比如,溢出信息为2,表示这个数据节点的数据存储在两个连续的磁盘页中。而若一个数据节点的数据量小于或等于预设数据量,则可以正常分配一个磁盘页来存储这个数据节点的数据,这种情况下,这个数据节点具有全局页标识,但是不具有溢出信息,或者这个数据节点的溢出信息为1,用以指示这个数据节点的数据存储在一个磁盘页中。
需说明的是,第一设备的磁盘页中存储有默克尔B+树中所有索引节点的数据,因而本申请实施例中默克尔B+树中一个索引节点的页标识用于在第一设备的磁盘页中唯一标识存储有这个索引节点的数据的磁盘页。另外,若一个索引节点的下属节点也为索引节点,则这个索引节点的数据中包含这个索引节点自身的页标识和这个索引节点下属的每个索引节点的页标识。若一个索引节点的下属节点为数据节点,则这个索引节点的数据中包含这个索引节点自身的页标识和这个索引节点下属的每个数据节点的页标识(即全局页标识)。
可选地,步骤302的操作可以为:第一设备根据默克尔B+树中根节点的页标识获取第一设备的磁盘页中存储的根节点的数据;对于该数据修改集中任意的一个指定数据,根据根节点的数据和这个指定数据中的key值获取这个指定数据需分发至的目标数据节点的全局页标识。
根节点的数据包含根节点的页标识,以及包含根节点下属的每个节点的最小键和哈希值,以及包含根节点下属的每个节点的页标识。
这种情况下,对于该数据修改集中任意的一个指定数据中的key值,第一设备可以将该key值与根节点下属的每个节点的键范围进行比对,以确定该key值处于根节点下属的哪个节点的键范围,即确定需要将该key值所属的这个指定数据分发至根节点下属的哪个节点。
若这个节点为数据节点,则第一设备可以确定这个数据节点为这个指定数据需分发至的目标数据节点,然后第一设备可以从根节点的数据中获取这个数据节点的页标识,也就获取到了这个指定数据需分发至的目标数据节点的全局页标识。
若这个节点为索引节点,则第一设备可以根据根节点的数据中包含的这个索引节点的页标识获取第一设备的磁盘页中存储的这个索引节点的数据。之后,第一设备可以根据这个索引节点的数据,继续将该key值与这个索引节点下属的每个节点的键范围进行比对,以确定该key值处于这个索引节点下属的哪个节点的键范围,即确定需要将该key值所属的这个指定数据分发至这个索引节点下属的哪个节点。这种情况下,若这个节点为索引节点,则继续重复上述过程,直至确定该key值处于某个数据节点的键范围,此时第一设备可以确定这个数据节点为这个指定数据需分发至的目标数据节点,并从这个数据节点上属的索引节点的数据中获取这个数据节点的页标识,也就获取到了这个指定数据需分发至的目标数据节点的全局页标识。
需说明的是,上述根据该key值获取目标数据节点的全局页标识的过程是将该key值所属的指定数据在默克尔B+树中从根节点分发至最后一层索引节点(即数据节点上属的索引节点)的过程。将该key值分发至最后一层的一个索引节点后,通过比对该key值与这个索引节点下属的每个数据节点的键范围,可以确定该key值处于哪个数据节点的键范围,继而就可以将这个数据节点作为目标数据节点,并从这个索引节点的数据中获取目标数据节点的全局页标识。
在一些实施例中,第一设备根据索引节点的页标识获取第一设备的磁盘页中存储的索引节点的数据时,是将索引节点的页标识在第一设备中对应的磁盘页中存储的索引节点的数据读取到第一设备的内存,继而后续第一设备可以在第一设备的内存中对索引节点的数据进行修改。
需注意的是,该数据修改集中任意一个指定数据可以对应一个目标数据节点,这个指定数据对应的目标数据节点即是这个指定数据需分发至的目标数据节点。比如,该数据修改集中任意一个待添加的键值对可以对应一个目标数据节点,这个目标数据节点即是该键值对所需插入的数据节点;该数据修改集中任意一个待更新的键值对可以对应一个目标数据节点,这个目标数据节点即是存放有该键值对的key值的数据节点;该数据修改集中任意一个待删除的键(即key值)可以对应一个目标数据节点,这个目标数据节点即是存放有该key值的数据节点。如此,该数据修改集总共可以对应n个目标数据节点,每个目标数据节点对应一个或多个指定数据,即每个目标数据节点对应一个或多个待添加的键值对、一个或多个待更新的键值对、和/或一个或多个待删除的键。
步骤303:第一设备生成与n个目标数据节点一一对应的n个映射信息,将该n个映射信息发送给管理模块。
可选地,第一设备可以将该n个映射信息携带于数据修改指令中发送给管理模块,以指示管理模块基于该n个映射信息更新默克尔B+树中的数据节点。在一些实施例中,第一设备可以在获得该n个映射信息后,将该n个映射信息携带于一个数据修改指令中发送给管理模块。或者,第一设备可以在每获得一个映射信息后,就将这个映射信息携带于一个数据修改指令中发送给管理模块。其中,该数据修改指令中可以携带该数据修改请求中的区块标识。
n个映射信息中任意的一个映射信息包括这个映射信息对应的目标数据节点的全局页标识、该数据修改集中需分发至这个映射信息对应的目标数据节点的至少一个指定数据。也即,一个映射信息中包括一个目标数据节点的全局页标识和数据列表,该数据列表包括该数据修改集中所有需分发至这个目标数据节点的指定数据。示例地,该数据列表中的指定数据可以是有序的,比如,该数据列表中的指定数据可以按字典序有序。可选地,在某个目标数据节点具有溢出信息的情况下,这个目标数据节点对应的映射信息中还可以包括这个目标数据节点的溢出信息。
步骤304:管理模块接收到第一设备发送的该n个映射信息后,生成与该n个映射信息一一对应的n个数据修改信息。
管理模块接收到携带有区块标识和映射信息的数据修改指令后,可以根据此前接收到的该区块标识与对应的数据修改集,确定已接收到的映射信息中的数据列表是否为该区块标识所标识的区块的全量的修改集。
可选地,管理模块每接收到一个映射信息,可以将该区块标识和这个映射信息记录至管理模块中的预写日志中,具体可以记录与这个映射信息对应的一条日志信息,这条日志信息中记录有该区块标识、这个映射信息中的全局页标识、这个映射信息中的数据列表。
需说明的是,一个全局页标识具有关联的第二设备标识和局部页标识。一个全局页标识关联的第二设备标识用于指示这个全局页标识所标识的磁盘页所在的第二设备。这个全局页标识关联的局部页标识用于在这个全局页标识关联的第二设备标识所标识的第二设备中唯一标识一个磁盘页,可选地,局部页标识用于指示磁盘页在第二设备中的偏移量,也即用以指示磁盘页在第二设备中所处的文件物理位置。
n个数据修改信息中任意的一个数据修改信息包括这个数据修改信息对应的映射信息中的全局页标识关联的第二设备标识和数据修改任务,该数据修改任务包括这个数据修改信息对应的映射信息中的全局页标识关联的局部页标识、这个数据修改信息对应的映射信息中的数据列表。可选地,在某个映射信息包括溢出信息的情况下,这个映射信息对应的数据修改信息中的数据修改任务中还可以包括这个映射信息中的溢出信息。
对于该n个映射信息中任意一个映射信息中的全局页标识,管理模块可以确定该全局页标识关联的第二设备标识和局部页标识,具体的确定方式已在上文图2实施例中进行详细阐述,本申请实施例在此不再赘述。
步骤305:管理模块将n个数据修改信息中任意的一个数据修改信息中的数据修改任务发送给这一个数据修改信息中的第二设备标识所标识的第二设备。
可选地,管理模块可以将数据修改任务携带于数据修改消息中发送给第二设备,以指示第二设备基于数据修改任务更新数据节点。该数据修改消息中可以携带该数据修改指令中的区块标识。另外,管理模块在将该数据修改消息发送给第二设备的同时,还可以在第一缓存区中存储该数据修改消息。
为了优化性能,在一些实施例中,管理模块可以采用数据压缩手段来减小数据传输量,以期得到更好的性能。也即,管理模块可以先对数据修改任务进行压缩,再将压缩后的数据修改任务携带于数据修改消息中发送给第二设备。在另一些实施例中,若该n个数据修改信息中存在包括的第二设备标识相同的多个数据修改信息,则管理模块可以将该多个数据修改信息中的数据修改任务携带于同一个数据修改消息中发送给该多个数据修改信息中的第二设备标识所标识的第二设备。也即,管理模块可以积攒一批需要发送给同一个第二设备的数据修改任务,然后将这批数据修改任务携带于一个数据修改消息中发送给这个第二设备,以减少该数据库系统中的总网络请求轮次,提高性能。
步骤306:对于该多个第二设备中任意的一个第二设备,若这个第二设备接收到管理模块发送的数据修改任务,则根据该数据修改任务更新默克尔B+树中的数据节点。
这个第二设备接收到管理模块发送的携带有区块标识和数据修改任务的数据修改消息后,可以获知该数据修改任务是用于实现对该区块标识所标识的区块的执行的。
可选地,对于任意一个数据修改任务,这个第二设备根据该数据修改任务更新默克尔B+树中的数据节点的操作可以包括如下步骤(1)至步骤(5):
(1)这个第二设备根据该数据修改任务中的局部页标识,或根据该数据修改任务中的局部页标识和溢出信息,获取这个第二设备中的磁盘页中存储的目标数据节点的数据。
若该数据修改任务中不包括溢出信息,则这个第二设备直接获取该数据修改任务中的局部页标识在这个第二设备中所标识的磁盘页中存储的数据作为目标数据节点的数据。
若该数据修改任务中包括溢出信息,则这个第二设备获取从该数据修改任务中的局部页标识在这个第二设备中所标识的磁盘页起的连续j个磁盘页中存储的数据作为目标数据节点的数据,j为该溢出信息指示的磁盘页个数。
(2)这个第二设备根据该数据修改任务中的数据列表修改目标数据节点的数据,以更新目标数据节点。
若该数据修改任务中的数据列表中存在待添加的键值对,则这个第二设备在目标数据节点的数据中添加该键值对;若该数据修改任务中的数据列表中存在待更新的键值对,则这个第二设备将目标数据节点的数据中的指定键值对更新为该键值对,指定键值对的key值与该键值对的key值相同;若该数据修改任务中的数据列表中存在待删除的键,则这个第二设备在目标数据节点的数据中删除该键所属的键值对。如此,可以完成对目标数据节点的更新。
在一些实施例中,若更新后的目标数据节点为空,即更新后的目标数据节点不包含数据,则这个第二设备可以将节点删除消息作为该数据修改任务的回复消息,向管理模块发送该节点删除消息,以指示更新后的目标数据节点为空,且指示已完成对该数据修改任务的处理。
管理模块接收到这个第二设备发送的该节点删除消息后,将该节点删除消息作为该数据修改任务对应的映射信息的回复消息,然后向第一设备发送该节点删除消息,以指示更新后的目标数据节点为空,且指示已完成对该映射信息的处理。并且,管理模块从第一缓存区中删除该数据修改任务,可以理解的,若管理模块将第一缓存区中某个数据修改消息中所有的数据修改任务都删除了,则可以从第一缓存区中删除这个数据修改消息。第一设备接收到管理模块发送的该节点删除消息后,可以将该映射信息对应的目标数据节点上属的索引节点的数据中指向目标数据节点的索引项(包括目标数据节点的最小键、哈希值和页标识)删除,且将该索引节点的数据中包含的该索引节点的页标识删除,以更新该索引节点。若更新后的索引节点为空,则第一设备继续向上回溯更新上属的索引节点,直至更新至根节点;若更新后的索引节点不为空,则第一设备为更新后的索引节点分配页标识,然后根据更新后的索引节点的最小键、哈希值和页标识,继续向上回溯更新上属的索引节点,直至更新至根节点。如此,第一设备就完成了对默克尔B+树中索引节点的更新。
在另一些实施例中,若更新后的目标数据节点不为空,即若更新后的目标数据节点中包含数据,则这个第二设备根据更新后的目标数据节点确定至少一个新数据节点,然后请求管理模块为该至少一个新数据节点中的每个新数据节点分配页标识,具体可以包括如下步骤(3)至步骤(5)。
(3)若更新后的目标数据节点的数据量小于或等于预设数据量,则这个第二设备向管理模块发送磁盘页分配请求。
这种情况下,更新后的目标数据节点为新数据节点。该磁盘页分配请求中携带更新后的目标数据节点的最小键和哈希值。该磁盘页分配请求用于请求为更新后的目标数据节点分配页标识,也即,请求分配用于存储更新后的目标数据节点的数据的磁盘页。
(4)若更新后的目标数据节点的数据量大于预设数据量,则这个第二设备将更新后的目标数据节点分裂为至少两个数据节点,然后向管理模块发送磁盘页分配请求。
由更新后的目标数据节点分裂而来的至少两个数据节点中每个数据节点的数据量小于或等于预设数据量,且每个数据节点中至少包含一个键值对。
这种情况下,该至少两个数据节点均为新数据节点。该磁盘页分配请求携带该至少两个数据节点中每个数据节点的最小键和哈希值。该磁盘页分配请求用于请求为该至少两个数据节点中的各个数据节点分配页标识,也即,请求分配用于存储该至少两个数据节点中各个数据节点的磁盘页。
需注意的是,若更新后的目标数据节点的数据量大于预设数据量,但是更新后的目标数据节点中仅包含一个键值对,则这个第二设备无需对更新后的目标数据节点进行分裂,这种情况下,可以根据更新后的目标数据节点的数据量和预设数据量为更新后的目标数据节点设置溢出信息,比如,可以将更新后的目标数据节点的数据量除以预设数据量得到的数值进行向上取整,得到该溢出信息。这种情况下,更新后的目标数据节点为新数据节点,这个第二设备可以向管理模块发送磁盘页分配请求,该磁盘页分配请求中携带更新后的目标数据节点的最小键、哈希值和溢出信息。
可选地,若这个第二设备接收到的一个数据修改消息中仅携带一个数据修改任务,则在这个第二设备处理完这个数据修改任务后得到的是节点删除消息的情况下,这个第二设备可以直接将该节点删除消息作为这个数据修改任务的回复消息返回给管理模块,而在这个第二设备处理完这个数据修改任务后得到的是新数据节点的情况下,这个第二设备可以向管理模块发送磁盘页分配请求,该磁盘页分配请求携带有对这个数据修改任务处理得到的新数据节点(为更新后的目标数据节点、或由更新后的目标数据节点分裂出的至少两个数据节点中的每个数据节点)的最小键和哈希值,进一步地,还可能携带新数据节点的溢出信息。
而若这个第二设备接收到的一个数据修改消息中携带有多个数据修改任务,则这个第二设备可以先处理完这个数据修改消息中的多个数据修改任务,对于该多个数据修改任务中处理得到的是节点删除消息的任意一个数据修改任务,这个第二设备可以将该节点删除消息作为这个数据修改任务的回复消息返回给管理模块,而对于该多个数据修改任务中处理得到的是新数据节点的一些数据修改任务,这个第二设备向管理模块发送磁盘页分配请求,该磁盘页分配请求携带有对这些数据修改任务处理得到的新数据节点的最小键和哈希值,进一步地,还可能携带新数据节点的溢出信息。
需说明的是,这个第二设备获取这个第二设备中的磁盘页中存储的目标数据节点的数据时,是将这个第二设备的磁盘页中存储的目标数据节点的数据读取到这个第二设备的内存,然后在这个第二设备的内存中对目标数据节点的数据进行修改,以实现对目标数据节点的更新,得到新数据节点。这个第二设备得到新数据节点后,是将新数据节点先暂存在内存中,再请求管理模块分配页标识。
这种情况下,新数据节点是存在于这个第二设备的内存中的逻辑节点,其需要存在一个唯一标识,以便后续可以将管理模块分配的局部页标识与新数据节点进行关联。具体来讲,这个第二设备可以为新数据节点设置一个唯一标识,如此在后续这个第二设备接收到管理模块针对该磁盘页分配请求的回复后,可以按照此关联关系来设置该新数据节点的局部页标识。示例地,这个第二设备可以通过该磁盘页分配请求的请求标识与所有待分配磁盘页的新数据节点构成的数据的脚标,来标识一个待分配磁盘页的新数据节点,若这个第二设备在后续接收到针对该磁盘页分配请求的回复,则可以按照此关联关系,直接给该磁盘页分配请求中所有待分配磁盘页的新数据节点的局部页标识依次赋值。
(5)管理模块接收到这个第二设备发送的磁盘页分配请求后,确定该磁盘页分配请求中指示的各个新数据节点的第二设备标识和局部页标识,向这个第二设备发送携带有各个新数据节点的第二设备标识和局部页标识的磁盘页分配结果。
可选地,管理模块内部为该多个第二设备中的每个第二设备维护一个freelist组件,一个第二设备的freelist组件用于配置这个第二设备的空闲页标识列表、待释放页标识列表和最大页标识,一个第二设备的freelist组件用于实现这个第二设备中磁盘页的分配。管理模块可以通过各个第二设备的freelist组件为新数据节点分配各个第二设备中的局部页标识,以实现在各个第二设备中为新数据节点分配磁盘页。管理模块通过某个第二设备的freelist组件为某个新数据节点分配这个第二设备中的局部页标识后,这个第二设备的freelist组件发生修改,修改后的freelist组件与该数据修改指令中携带的区块标识对应。
管理模块接收到一个第二设备发送的磁盘页分配请求后,若该磁盘页分配请求中指示的新数据节点的数量小于第一数量,则管理模块在这个第二设备中为该磁盘页分配请求中指示的各个新数据节点分配局部页标识,将这个第二设备的设备标识确定为各个新数据节点的第二设备标识。
管理模块接收到一个第二设备发送的磁盘页分配请求后,若该磁盘页分配请求中指示的新数据节点的数量大于或等于第一数量,则管理模块从该多个第二设备中除这个第二设备之外的其他第二设备中选择第二数量的第二设备,根据预设比例在这个第一设备和选择出的第二数量的第二设备中为该磁盘页分配请求中指示的各个新数据节点分配局部页标识,将为各个新数据节点所分配的局部页标识所属的第二设备的设备标识确定为各个新数据节点的第二设备标识。
其中,第一数量、第二数量、预设比例均可以预先进行设置,如第一数量、第二数量、预设比例均可以由技术人员根据实际需求进行设置。
可选地,管理模块从该多个第二设备中除这个第二设备之外的其他第二设备中选择第二数量的第二设备时,可以从该多个第二设备中除这个第二设备之外的其他第二设备中随机选择第二数量的第二设备,或者,可以按照一定规则从该多个第二设备中除这个第二设备之外的其他第二设备中选择第二数量的第二设备,比如,可以选择排序在这个第二设备之后的第二数量的第二设备。
在本申请实施例中,当待分配磁盘页的新数据节点的数量超出一定阈值(即第一数量)后,可以按照预设比例随机的在不同的第二设备中为新数据节点分配局部页标识。如此,可以实现将待分配磁盘页的多个新数据节点的数据分散到多个第二设备的磁盘页进行存储,通过这种分布式存储方式可以减轻各个第二设备的存储压力。
例如,当前存在3个第二设备,分别为:第二设备1、第二设备2、第二设备3,管理模块接收到第二设备1发送的磁盘页分配请求,该磁盘页分配请求中指示的新数据节点的数量为100,超出了阈值80,则可以按照8:1:1的比例,在第二设备1中分配出80个新页的局部页标识,在第二设备2和第二设备3中都分配10个新页的局部页标识。需注意的是,此处所述的新页可以是一个磁盘页,也可以是连续的多个磁盘页。具体来讲,若某个待分配磁盘页的新数据节点不存在溢出信息,那么分配给这个新数据节点的是一个磁盘页,这种情况下,为这个新数据节点分配局部页标识时可以分配一个局部页标识。若某个待分配磁盘页的新数据节点存在溢出信息,那么分配给这个新数据节点的需要是连续的多个磁盘页,这种情况下,为这个新数据节点分配局部页标识时需要分配连续的多个局部页标识。
管理模块为该磁盘页分配请求中指示的某个新数据节点分配第二设备中的局部页标识后,这个新数据节点就具有了第二设备标识和局部页标识,用以指示为这个新数据节点在该第二设备标识所标识的第二设备中分配该局部页标识所标识的磁盘页,也即,指示将这个新数据节点的数据存储至该第二设备标识所标识的第二设备中该局部页标识所标识的磁盘页。
这种情况下,对于向管理模块发送该磁盘页分配请求的一个第二设备,管理模块可以将为该磁盘页分配请求指示的各个新数据节点分配的局部页标识和对应的第二设备标识携带于磁盘页分配结果中返回给这个第二设备。
此前这个第二设备是在对管理模块发送的数据修改消息中的至少一个数据修改任务处理得到新数据节点后,通过该磁盘页分配请求来请求管理模块为这些新数据节点分配页标识。
因而这个第二设备接收到管理模块返回的该磁盘页分配结果后,若该磁盘页分配结果中所有新数据节点的第二设备标识均与这个第二设备的设备标识相同,则这个第二设备可以向管理模块发送针对该至少一个数据修改任务的回复消息,以指示已完成对该至少一个数据修改任务的处理。之后,可选地,这个第二设备可以直接根据该磁盘页分配结果中各个新数据节点的局部页标识,将各个新数据节点的数据存储至这个第二设备的磁盘页中由该局部页标识所标识的磁盘页。或者,这个第二设备可以在接收到管理模块发送的携带有该数据修改消息中的区块标识的持久化消息后,再根据该磁盘页分配结果中各个新数据节点的局部页标识,将各个新数据节点的数据存储至这个第二设备的磁盘页中由该局部页标识所标识的磁盘页。
或者,这个第二设备接收到管理模块返回的该磁盘页分配结果后,若该磁盘页分配结果中存在至少一个新数据节点的第二设备标识与这个第二设备的设备标识不同,则对于该至少一个新数据节点中每一个新数据节点,这个第二设备可以将该数据修改消息中的区块标识、这个新数据节点的局部页标识和这个新数据节点的数据携带于数据分配消息中发送给这个新数据节点的第二设备标识所标识的第二设备(可称为指定设备),指定设备接收到该数据分配消息后,返回针对该数据分配消息的回复消息。这个第二设备若接收到所有指定设备发送的针对该数据分配消息的回复消息,则可以向管理模块发送针对该至少一个数据修改任务的回复消息,以指示已完成对该至少一个数据修改任务的处理。
之后,可选地,对于该磁盘页分配结果中第二设备标识与这个第二设备的设备标识相同的新数据节点,这个第二设备可以直接根据该新数据节点的局部页标识将该新数据节点的数据存储至这个第二设备的磁盘页中由该局部页标识所标识的磁盘页;并且,指定设备接收到这个第二设备发送的该数据分配消息后,也可以直接根据该数据分配消息中新数据节点的局部页标识将该新数据节点的数据存储至指定设备的磁盘页中由该局部页标识所标识的磁盘页。或者,对于该磁盘页分配结果中第二设备标识与这个第二设备的设备标识相同的新数据节点,这个第二设备可以在接收到管理模块发送的携带有该数据修改消息中的区块标识的持久化消息后,再根据该新数据节点的局部页标识,将该新数据节点的数据存储至这个第二设备的磁盘页中由该局部页标识所标识的磁盘页;并且,指定设备接收到这个第二设备发送的该数据分配消息后,也是在后续接收到管理模块发送的携带有该数据分配消息中的区块标识的持久化消息后,再根据该数据分配消息中新数据节点的局部页标识将该新数据节点的数据存储至指定设备的磁盘页中由该局部页标识所标识的磁盘页。
可选地,这个第二设备向其他第二设备(即指定设备)发送数据分配消息时,可以采用数据压缩等手段来减小数据传输量,以期得到更好的性能。第二设备将更新得到的各个新数据节点的数据存储至第二设备的磁盘页后,就实现了对默克尔B+树的数据节点的持久化。
管理模块在为某个新数据节点分配了某个第二设备中的局部页标识后,还可以根据这个第二设备的设备标识和该局部页标识确定关联的全局页标识,具体的确定方式已在上文图2实施例中进行详细阐述,本申请实施例对此不再赘述。然后,管理模块在接收到某个第二设备发送的针对某个数据修改任务的回复消息后,可以向第一设备发送针对这个数据修改任务对应的映射信息的回复消息(可称为数据修改结果),以指示已完成对该映射信息的处理,该数据修改结果包括各个新数据节点的最小键、哈希值和全局页标识,进一步地,还可能包括新数据节点的溢出信息。并且,管理模块还可以从第一缓存区中删除这个数据修改任务。可以理解的,若管理模块将第一缓存区中某个数据修改消息中所有的数据修改任务都删除了,则可以从第一缓存区中删除这个数据修改消息。
第一设备接收到该数据修改结果后,可以根据该数据修改结果中的各个新数据节点的最小键、哈希值、全局页标识、溢出信息更新默克尔B+树中的索引节点。具体来讲,第一设备将该映射信息对应的目标数据节点上属的索引节点的数据中目标数据节点的索引项更新为新数据节点的索引项(包括新数据节点的最小键、哈希值、页标识、溢出信息),且将该索引节点的数据中包含的该索引节点的页标识删除,以更新该索引节点。若更新后的索引节点的数据量小于或等于预设数据量,则第一设备为更新后的索引节点分配页标识,然后根据更新后的索引节点的最小键、哈希值和页标识,继续向上回溯更新上属的索引节点,直至更新至根节点;若更新后的索引节点的数据量大于预设数据量,则第一设备将更新后的索引节点分裂为至少两个索引节点,该至少两个索引节点中每个索引节点的数据量小于或等于预设数据量,该至少两个索引节点中每个索引节点包含至少一个数据节点的索引项,第一设备为该至少两个索引节点中每个索引节点分配页标识,然后根据该至少两个索引节点中每个索引节点的最小键、哈希值和页标识,继续向上回溯更新上属的索引节点,直至更新至根节点。如此,如此,第一设备就完成了对默克尔B+树中索引节点的更新。
需说明的是,第一设备可以通过第一设备的freelist组件为更新得到的各个索引节点分配第一设备中的页标识,以实现在第一设备中为更新得到的各个索引节点分配磁盘页。第一设备通过第一设备的freelist组件为更新得到的某个索引节点分配第一设备中的页标识后,第一设备的freelist组件发生修改,修改后的freelist组件与该数据修改请求中携带的区块标识对应。
可选地,第一设备在更新得到各个索引节点后,可以直接将更新得到的各个索引节点的数据存储至第一设备的磁盘页,或者,第一设备可以在接收到区块链系统发送的携带有该数据修改请求中的区块标识的持久化请求后,再将更新得到的各个索引节点的数据存储至第一设备的磁盘页。具体地,第一设备可以将更新得到的各个索引节点的数据存储至第一设备中由各个索引节点的页标识所标识的磁盘页。第一设备将更新得到的各个索引节点的数据存储至第一设备的磁盘页后,就实现了对默克尔B+树的索引节点的持久化。
需说明的是,第一设备在完成对默克尔B+树中索引节点的更新后,可以获得默克尔B+树中根节点的数据,此时第一设备可以确定当前区块的执行进度为已执行完成。之后,第一设备可以根据该根节点的数据获取该根节点的哈希值,并将该根节点的哈希值返回给上层的区块链系统。并且,第一设备还可以记录该根节点的页标识与当前区块的区块标识之间的映射关系,以便可以确定该根节点的页标识与哪一版本的默克尔B+树对应。区块链系统在接收到第一设备发送的该根节点的哈希值后,可以确定当前区块已执行完成,此时区块链系统可以开始执行下一个区块。
为了性能考虑,对于第二设备而言,本地的脏页刷盘过程(即将新数据节点的数据存储至新数据节点的局部页标识所标识的磁盘页的过程)可以在确定脏页的局部页标识后,交给后台的异步刷盘逻辑开始执行。
在一些实施例中,第二设备在接收到管理模块发送的磁盘页分配结果后,可以直接将新数据节点的数据存储至第二设备的磁盘页;并且,第一设备在更新得到根节点后,也可以直接将更新得到的各个索引节点的数据存储至第一设备的磁盘页。第二设备将新数据节点的数据存储至第二设备的磁盘页后,可以向管理模块发送携带有区块标识的持久化完成消息。之后,管理模块接收第二设备发送的持久化完成消息,在确定该区块标识对应的所有新数据节点均已完成持久化后,可以向第一设备发送携带有该区块标识的持久化完成消息。第一设备接收到管理模块发送的持久化完成消息后,在已将更新得到的各个索引节点的数据存储至第一设备的磁盘页的情况下,确定该区块标识所标识的区块的执行进度为已落盘。之后,第一设备向区块链系统发送携带有该区块标识的持久化完成消息,以指示该区块标识所标识的区块已落盘。
在另一些实施例中,区块链系统接收到第一设备发送的该根节点的哈希值后,可以向第一设备发送携带有区块标识的持久化请求。第一设备接收到该持久化请求后,可以将更新得到的各个索引节点的数据存储至第一设备的磁盘页,并向管理模块发送携带有该持久化请求中的区块标识的持久化指令,可选地,第一设备可以调用write接口向管理模块发送该持久化指令,write接口用于对data层的节点数据进行持久化。管理模块接收到该持久化指令后,生成携带有该持久化指令中的区块标识的持久化消息,向用于存储该区块标识对应的新数据节点的第二设备发送该持久化消息,并将该持久化消息存储于第一缓存区。第二设备接收到管理模块发送的持久化消息后,可以将新数据节点的数据存储至第二设备的磁盘页,然后向管理模块发送针对该持久化消息的回复消息,以指示已完成对该持久化消息的处理。管理模块接收到用于存储该区块标识对应的新数据节点的所有第二设备针对该持久化消息的回复消息后,可以删除第一缓存区中存储的该持久化消息,然后向第一设备发送针对该持久化指令的回复消息,以指示已完成对该持久化指令的处理。第一设备接收到针对该持久化指令的回复消息后,在已将更新得到的各个索引节点的数据存储至第一设备的磁盘页的情况下,确定该持久化请求中的区块标识所标识的区块的执行进度为已落盘。之后,第一设备向区块链系统发送针对该持久化请求的回复消息,以指示该区块标识所标识的区块已落盘。
可选地,第二设备中可以设置有区块标识表,该区块标识表用于记录第一区块标识和第二区块标识。第一区块标识用于标识第二设备本地最新执行完成的区块,也即,第一区块标识为第二设备最新获得的具有局部页标识的新数据节点对应的区块标识。第二区块标识用于标识第二设备本地最新持久化完成的区块,也即,第二区块标识用于标识第二设备最新存储完成的新数据节点对应的区块标识。
需要说明的是,在上述持久化过程中不仅需要将节点数据(包括索引节点的数据和数据节点的数据)存储至磁盘页,即不仅需要完成节点数据的持久化,还需要完成一些与区块执行相关的其他信息的持久化,如freelist组件的持久化、版本信息的持久化等,该版本信息可以包括区块标识对应的版本标识、区块标识对应的根节点数据等。并且,在一些情况下还需要确认索引节点的数据是否需要重新进行MMAP(内存映射)。MMAP是一种将磁盘映射到内存的技术,将索引节点的数据通过MMAP的形式维护在内存中,可以提升读效率。
在该数据库系统中,index层的行为和data层的行为可以天然并发进行。第一设备可以完成发生在内存中的有关根节点数据的切换。并且,第一设备在index层的持久化操作与管理模块和第二设备在data层的持久化操作可以同时进行。
具体来讲,在持久化流程中,第一设备在index层进行自身的freelist组件的持久化,以及进行与自身维护的index层相关的版本信息的持久化,且确认索引节点的数据是否需要重新进行MMAP,以及通知后台脏页刷盘。
管理模块进行各个第二设备的freelist组件的持久化,以及进行与data层相关的版本信息的持久化。可选地,管理模块可以通知所有的第二设备开始做内部的区块标识表的持久化,同时管理模块并行的做本地维护的各个第二设备的freelist组件的持久化和自己维护的版本信息的持久化。管理模块在这两个操作都完成后,可以确定区块的所有处理流程结束。
需说明的是,该数据库系统为满足回滚需求,其内部需要一直维护M个版本的默克尔B+树的节点数据,也即,需要维护M个版本信息,M为预先设置的大于或等于2的整数。假设当前已经更新到了第H个版本的默克尔B+树,为了保证第H-M个版本的默克尔B+树的节点数据已经可以被覆盖,在持久化第H个版本的默克尔B+树的节点数据之前,需要确认第0个版本至第H-M个版本之间的所有版本的默克尔B+树的节点数据都已经完成持久化(即后台刷脏页的流程已经全部完成,这些版本中可以被覆盖的旧磁盘页都已经被freelist组件回收)。为此,管理模块需要管理第二设备的刷盘进度。也即,如上文实施例所述的,第二设备在完成对某个版本的默克尔B+树中的数据节点的数据的持久化之后,需要通知到管理模块。管理模块在收集到用于执行某个区块的所有第二设备的刷盘完成信息后,则可以认为这个区块在上下层都已经完成了持久化。并且,因为有M个版本的限制,所以管理模块需要在内存中维护的版本信息及对应的处理信息是可控的,不会给内存带来过大的压力。
在本申请实施例中,数据库系统包括第一设备、管理模块和数据系统,数据系统包括多个第二设备,第一设备用于存储默克尔B+树中索引节点的数据,该多个第二设备用于存储默克尔B+树中数据节点的数据。在需要更新默克尔B+树时,第一设备获取数据修改集中的每个指定数据在默克尔B+树中需分发至的目标数据节点的全局页标识,以得到n个目标数据节点中每个目标数据节点的全局页标识。之后,第一设备生成与n个目标数据节点一一对应的n个映射信息,并将n个映射信息发送给管理模块,每个映射信息包括对应的目标数据节点的全局页标识和数据列表。之后,管理模块生成与n个映射信息一一对应的n个数据修改信息,每个数据修改信息包括对应的映射信息中的全局页标识关联的第二设备标识和数据修改任务。管理模块将n个数据修改信息中任意的一个数据修改信息中的数据修改任务发送给这一个数据修改信息中的第二设备标识所标识的第二设备,以指示第二设备更新数据节点。如此,通过该数据库系统中的这种分布式架构可以将默克尔B+树中的数据节点的更新和存储压力分散到数据系统中的多个第二设备上,可降低单个设备的数据更新与存储压力,从而可提高该数据库系统的吞吐量,进而提升该数据库系统的性能。
需说明的是,通过上述步骤301至步骤305可以实现对默克尔B+树的节点数据的修改。
在一些实施例中,还可以对默克尔B+树的节点数据进行查询,具体查询过程可以包括如下步骤a至步骤e:
步骤a:第一设备接收数据查询请求,该数据查询请求携带待查询的key值。
该数据查询请求用于指示在默克尔B+树中查询该数据查询请求携带的key值对应的value值。该数据查询请求可以由其他系统发送给第一设备。示例地,区块链系统中的执行模块在执行一个区块中的交易的过程中会产生需要查询的key值。这种情况下,该执行模块可以向第一设备发送携带有该key值的数据查询请求。可选地,该数据查询请求中可以携带这个区块的区块标识,以指示是在执行该区块标识所标识的区块的过程中需要对该key值对应的value值进行查询。
步骤b:第一设备获取该key值在默克尔B+树中需分发至的数据节点的全局页标识,向管理模块发送数据查询指令,该数据查询指令携带待查询的key值和该数据节点的全局页标识。
该数据查询指令用于指示在该全局页标识所标识的磁盘页存储的数据节点的数据中查询该数据查询指令携带的key值对应的value值。可选地,该数据查询指令中可以携带该数据查询请求中的区块标识。
可选地,第一设备可以调用read接口来向管理模块发送数据查询指令。read接口用于读取data层的节点数据。
步骤c:管理模块接收到该数据查询指令后,确定该数据查询指令中的全局页标识关联的第二设备标识和局部页标识,向该第二设备标识所标识的第二设备发送数据查询消息,该数据查询消息中携带待查询的key值和局部页标识。
可选地,该数据查询消息中可以携带该数据查询指令中的区块标识。另外,管理模块在将该数据查询消息发送给第二设备的同时,还可以在第一缓存区中存储该数据查询消息。
步骤d:第二设备接收到该数据查询消息后,从第二设备中由该局部页标识所标识的磁盘页中获取数据节点的数据,从该数据节点的数据中获取该key值所属的键值对中的value值,向管理模块发送携带有该value值的数据查询结果。
该数据查询结果即是第二设备针对该数据查询消息的回复消息,用以指示该数据查询消息已处理完成。
步骤e:管理模块接收到该数据查询结果后,将该数据查询结果返回给第一设备。
管理模块接收到该数据查询结果后,可以从第一缓存区中删除该数据查询消息,然后将该数据查询结果作为该数据查询指令的回复消息返回给第一设备。
第一设备接收到该数据查询结果后,可以将该数据查询结果中的value值返回给区块链系统。
在一些实施例中,还可以对默克尔B+树进行版本回滚,下面对此进行说明:
区块链系统能够保证回滚和出块不会并发执行,也即,回滚流程需要在执行完一个区块后且尚未开始执行另一个区块前进行。
区块链系统若需要将目标区块及目标区块后的所有区块都回滚掉,即区块链系统若需要回滚至目标区块的上一个区块,则区块链系统可以向第一设备发送回滚请求,该回滚请求携带目标区块标识,用于指示将目标区块及目标区块后的所有区块回滚掉,即是将目标区块及目标区块后的所有区块的相应版本的默克尔B+树回滚掉,换句话说,是将默克尔B+树的节点数据回滚至目标区块的上一个区块的相应版本的默克尔B+树的节点数据。
第一设备接收到该回滚请求后,可以删除第一设备中的预写日志中记录有目标区块标识或目标区块标识后的所有区块标识中的任意一个区块标识的日志信息。之后,第一设备需要确定当前区块的执行进度。若当前区块的执行进度不为已落盘,则第一设备需等待当前区块的执行进度为已落盘后,再向管理模块发送回滚指令,该回滚指令可以携带目标区块标识。可选地,第一设备可以调用revert接口来向管理模块发送该回滚指令。revert接口用于回滚data层的节点数据。
管理模块接收到该回滚指令后,可以删除管理模块中的预写日志中记录有目标区块标识或目标区块标识后的所有区块标识中的任意一个区块标识的日志信息。然后管理模块可以删除目标区块标识所标识的目标区块及目标区块后的所有区块对应的版本信息,以及可以回滚目标区块及目标区块后的所有区块对应的freelist组件的修改内容等。另外,管理模块还可以向所有第二设备发送携带有目标区块标识的回滚消息,并将该回滚消息存储至第一缓存区中。第二设备接收到该回滚消息后,将区块标识表中的第一区块标识和第二区块标识均更新为被回滚掉的目标区块的上一个区块的标识,然后向管理模块返回针对该回滚消息的回复消息,以指示已经完成对该回滚消息的处理。管理模块接收到所有第二设备发送的针对该回滚消息的回复消息后,删除第一缓存区中的该回滚消息,向第一设备发送回滚完成消息。如此,管理模块中所记录的最新版本信息对应的区块即为目标区块的上一个区块,从而就回滚至了目标区块的上一个区块的相应版本的默克尔B+树的数据节点的数据。
第一设备接收到管理模块发送的回滚完成消息后,可以删除目标区块及目标区块后的所有区块对应的版本信息,以及可以回滚目标区块及目标区块后的所有区块对应的freelist组件的修改内容等,然后向区块链系统发送回滚完成消息。如此,第一设备中所记录的最新区块为目标区块的上一个区块,所记录的最新版本的默克尔B+树为目标区块的上一个区块对应的根节点的数据所属的默克尔B+树,从而就回滚至了目标区块的上一个区块的相应版本的默克尔B+树的索引节点的数据。
在一些实施例中,因网络异常或第二设备宕机等原因,很有可能会出现管理模块与第二设备断连的情况。这种情况下,需要在管理模块与第二设备重连后进行数据恢复,具体操作如下所述:
图4是本申请实施例提供的一种数据恢复方法的流程图。参见图4,该方法包括如下步骤:
步骤401:在管理模块与数据系统中所有的第二设备均正常连接的情况下,管理模块接收第一设备发送的数据修改指令,将该数据修改指令中携带的操作信息记录于管理模块中的预写日志,以及根据该数据修改指令生成对应的数据修改消息,根据该数据修改消息对数据系统中第二设备中的节点数据进行操作。
步骤401的具体过程已经在上文图2至图3实施例中进行详细说明,本申请实施例对此不再赘述。
管理模块中的预写日志中记录有第一设备发送至管理模块的数据修改指令中携带的相关操作信息。在一些实施例中,预写日志中包括多条日志信息,该多条日志信息是顺序记录的。示例地,一条日志信息中可以记录有区块标识、全局页标识和待修改的数据列表,用于在该区块标识所标识的区块的执行过程中根据该数据列表更新该全局页标识所标识的磁盘页中存储的节点数据。
步骤402:管理模块在与数据系统中任意的一个第二设备断连后,持久化管理模块中的预写日志。
管理模块在与数据系统中任意的一个第二设备断连后,可以持久化管理模块中的预写日志,即可以存储该预写日志至磁盘,以便后续可以根据该预写日志进行相关数据的恢复。
需注意的是,本申请实施例中该数据库系统的多版本控制的模式为cow(copy onwrite,写时拷贝)。其中脏页与版本的控制逻辑在管理模块中维护,数据系统中第二设备内部不需要进行复杂的状态控制,其内部的版本信息只需要与管理模块一致即可。
在一些实施例中,为了保证在出现管理模块与第二设备断连这种分布式架构常见的异常场景时,该数据库系统仍有自恢复和保证数据正确性的能力,本申请实施例在管理模块中引入了如下表1所示的多个状态:
表1
本申请实施例仅以上表1为例来对管理模块的多个状态进行举例说明,上表1并不对本申请实施例构成限定。
针对data层,整体上外部接口包括:spill接口、write接口、revert接口、read接口。上述表1中的多个状态存在的目的就是为了控制这四种接口对应的行为能够正确的并发和执行。
当管理模块与第二设备断连时,对于data层内部而言,其目标是期望能恢复正常。对于外部接口而言,在data层异常时,这些接口应该处于阻塞状态。也即,在管理模块的状态为normal状态时这些接口是正常使用的。而当管理模块的状态为除normal状态之外的其他状态时,这些接口处于阻塞状态。这个阻塞状态可以在两种情况下被解除,一种是data层恢复正常了,另一种是data层超过了一定时间后仍未恢复正常。
管理模块可以在工作过程中将自身的状态在上表1所述的多个状态之间进行切换,具体如下所述:
管理模块内部需要缓存所有由管理模块发送给第二设备的消息。这些消息可以包括上文的数据存储消息、数据修改消息、持久化消息、数据查询消息、回滚消息等。可选地,管理模块可以按照第二设备标识到消息列表映射的形式来组织这些消息,第二设备标识映射至的一个消息列表中存储的消息是管理模块发送给该第二设备标识所标识的第二设备的消息,且该消息列表中的消息均是尚未处理完成的消息。示例地,在管理模块将某个消息发送给第二设备后可以将这个消息添加至这个第二设备的设备标识映射至的消息列表,第二设备将这个消息处理完成进行回复后,管理模块收到这个消息的回复后可以从该消息列表中删除这个消息。
需注意的是,管理模块是一边向消息列表中添加消息,一边读取该消息列表中的消息来发送给第二设备。这会涉及到对消息列表的并发访问问题。为了保证并发访问的安全性,可以利用锁等同步手段进行控制或优化,具体操作与相关技术中为了保证并发访问的安全性而采取的一些手段类似,本申请实施例对此不进行详细阐述。
可选地,管理模块可以将第二设备标识和其映射至的消息列表存储在缓存区中。示例地,管理模块中设置有三个缓存区,分别为:第一缓存区:用于在data层一切正常的情况下,缓存管理模块发送给第二设备的消息中尚未处理完成的消息。第二缓存区:用于在data层出现管理模块与第二设备断连的情况时,缓存管理模块发送给第二设备的消息中所有还有可能收到回复的消息。第三缓存区:用于在data层出现管理模块与第二设备断连的情况时,缓存管理模块发送给已断连的第二设备的消息,这些消息无法再收到回复。
其中,管理模块可以通过多种方式检测自身是否与某个第二设备断连,比如,管理模块可以通过基于长连接技术实现的心跳机制来检测自身是否与某个第二设备断连。
在一些实施例中,若管理模块确定自身与数据系统中所有的第二设备均正常连接,则管理模块保持自身的状态为normal状态,以指示当前状态正常。在管理模块的状态为normal状态的情况下,第一缓存区中存储有管理模块发送给第二设备的所有消息中尚未处理完成的消息,第二缓存区和第三缓存区中未存储消息。并且,在管理模块的状态为normal状态的情况下,管理模块可以正常接收第一设备发送的指令,根据该指令生成对应的消息并正常向第二设备发送,这种情况下,所发送的消息可以被缓存在第一缓存区中。
若管理模块检测到自身与数据系统中任意一个第二设备断连,则管理模块将自身的状态设置为switching状态,以指示正在向异常状态切换。管理模块在从normal状态切换至switching状态时,可以将第一缓存区中的消息分别移动至第二缓存区和第三缓存区进行存储,此时第一缓存区中的消息被清空。具体来讲,对于第一缓存区中存储的管理模块向未断连的第二设备发送的消息,这些消息是后续有可能还会收到回复的消息,因而管理模块可以将这些消息移动至第二缓存区中进行存储。对于第一缓存区中存储的管理模块向已断连的第二设备发送的消息,这些消息是已经无法收到回复的消息,因而管理模块可以将这些消息移动至第三缓存区中进行存储。
在管理模块的状态为switching状态的情况下,管理模块会将上层置为阻塞状态,即管理模块在switching状态时接收到的第一设备发送的指令会被该状态拦截,管理模块根据该指令生成的对应的消息并不会被发送给第二设备,而是先被添加到第一缓存区中。具体来讲,在管理模块的状态为switching状态的情况下,若管理模块接收到第一设备发送的指令,可以根据该指令生成对应的消息,但是管理模块并不会将该消息发送给第二设备,而是会先将该消息添加到第一缓存区中。
在一些实施例中,管理模块可以感知当前区块的全量的修改集。因而管理模块在接收到第一设备发送的当前区块的数据修改指令后,可以确定是否已经接收到当前区块的所有数据修改指令,此处所述的当前区块的数据修改指令是指携带有当前区块的区块标识的数据修改指令。具体来讲,若管理模块已经接收到的第一设备发送的当前区块的至少一个数据修改指令包括当前区块的全量的修改集,则管理模块确定已经接收到当前区块的所有数据修改指令。若管理模块接收到的第一设备发送的当前区块的至少一个数据修改指令仅包括当前区块的部分的修改集,则管理模块确定还存在有当前区块的数据修改指令尚未被接收到。
在管理模块的状态为normal状态的情况下,若管理模块接收到第一设备发送的当前区块的数据修改指令,且在处理完该数据修改指令之前,管理模块与某个第二设备断连,则管理模块需要将自身的normal状态保持至“当前区块的所有数据修改指令均已到达管理模块,且管理模块根据这些数据修改指令生成的对应的消息均已被添加至第一缓存区且均已向第二设备发送”后再切换为switching状态。具体来讲,在管理模块的状态为normal状态的情况下,若管理模块检测到自身与数据系统中任意一个第二设备断连,则管理模块在已经接收到第一设备发送的当前区块的至少一个数据修改指令的情况下,可以确定是否已经接收到当前区块的所有数据修改指令,若未接收到当前区块的所有数据修改指令,则管理模块先不切换状态,而是继续接收第一设备发送的当前区块的数据修改指令,直至管理模块确定接收到了当前区块的所有数据修改指令,且将根据接收到的数据修改指令生成的对应的消息均已添加至第一缓存区且均已向数据系统中的第二设备发送后,管理模块再将自身的状态切换至switching状态。
上述做法可以实现两方面的效果:第一方面,由于管理模块是在确认已经接收到当前区块的所有数据修改指令后才从normal状态切换至switching状态的,所以在管理模块的状态为switching状态时,不会有上层的数据修改指令被该状态拦截。第二方面,有了第一方面的保证,在管理模块的状态为switching状态时,就可以确认针对当前区块,此前断连的第二设备可以直接恢复至当前区块执行完成的状态,这是因为数据恢复过程中对此前断连的第二设备的操作行为和正常执行区块时对第二设备的操作行为是完全一致且幂等的。并且,由于第三缓存区中的消息是上层尚未收到回复的消息,所以从数据正确性方面来说,有了第一方面的保证,在数据恢复过程中直接恢复在执行当前区块时对第二设备的操作行为即可;从响应上层阻塞状态方面,有了第一方面的保证,在数据恢复过程中对于第三缓存区中的消息,可以生成回复并解除上层的阻塞状态。这一部分具体将在下文介绍数据恢复过程时进行说明。
在管理模块的状态为switching状态的情况下,对于第二缓存表中的任意一个消息,若管理模块接收到第二设备针对这个消息的回复,则管理模块确定第二设备完成了对这个消息的处理,可以将这个消息从第二缓存表中删除。也即,管理模块在switching状态下,预期行为是:第二缓存表中的所有消息都应该按照预期收到回复,每收到一个回复就把对应的消息从第二缓存表中删除,直至第二缓存表被清空。在第二缓存表被清空后,管理模块就可以等待所有断连的第二设备全部重连回来后进行数据恢复了。
当第二缓存表被清空时,管理模块可以从switching状态切换为abnormal状态,以指示正在等待重连。这种情况下,管理模块可以将内存中所有与区块执行过程相关的中间管理信息都清空,该中间管理信息是在消息处理过程中记录的相关信息,包括中间变量、中间状态等。这是因为异常状态下能够处理的消息(即第二缓存表中的消息)都已经处理完成了,剩余的消息都是第三缓存区中无法从第二设备处拿到回复的消息,因而此时可以安全的将所有正处于执行过程中的中间管理信息清空,因为管理模块在后续数据恢复过程中会重新执行这些消息。
可选地,重连过程可以由技术人员实现,比如,管理模块在发现自身与数据系统中任意一个第二设备断连后,可以显示告警信息,技术人员看到该告警信息后,可以恢复管理模块与断连的第二设备之间的连接。在一些实施例中,若管理模块将自身的状态置为abnormal状态后超过预设的时间阈值后还是存在与管理模块断连的第二设备,则管理模块可以从abnormal状态切换为closed状态,以指示当前不可用,停止对外服务。这种情况下,管理模块可以显示提醒消息,以提醒技术人员当前系统处于不可用状态,以便技术人员可以及时处理问题。
在管理模块的状态为abnormal状态的情况下,若管理模块确定此前断连的第二设备均已重新连接了,即管理模块确定与数据系统中所有的第二设备均已正常连接了,则管理模块可以从abnormal状态切换为recovering状态,以指示开始进行数据恢复。这种情况下,此前断连的第二设备在发现与管理模块重新连接后,需要提供其本地拥有完整信息的一个区块标识作为可用区块标识。这里需要考虑两种情况,如果此前只是网络连接断开,第二设备本身没有发生宕机,那么所有提交到后台异步刷盘的脏页仍然在内存中存在,在此情况下第二设备可以将本地已经确认执行完成且对应的节点数据已提交到后台异步刷盘的区块标识作为可用区块标识,比如,第二设备的可用区块标识是其本地的区块标识表中记录的已执行完成的区块标识(即上文的第一区块标识);否则,如果第二设备发生过宕机,那么这些在内存中还未持久化的脏页会完全丢失,在此情况下第二设备的可用区块标识是其本地的区块标识表中记录的已持久化完成的区块标识(即上文的第二区块标识)。
需注意的是,若管理模块在recovering状态下又与数据系统中的某个第二设备断连,则管理模块可以从recovering状态切换为switching状态,然后复用上述的switching状态至recovering状态的流程。
管理模块的状态为recovering状态时,管理模块进行数据恢复。在一些实施例中,若管理模块将自身的状态置为recovering状态后超过预设的时间阈值后还是未完成数据恢复,则管理模块可以从recovering状态切换为closed状态,以指示当前不可用,停止对外服务。这种情况下,管理模块可以显示提醒消息,以提醒技术人员当前系统处于不可用状态,以便技术人员可以及时处理问题。
可选地,在管理模块的状态切换为switching状态时,管理模块可以对管理模块中的预写日志进行持久化。这种情况下,管理模块的状态为recovering状态时,管理模块可以根据管理模块中的预写日志进行数据恢复,具体的数据恢复过程如下所述:
步骤403:管理模块在与数据系统中断连的第二设备重新连接后,根据预写日志恢复数据系统中的第二设备中的节点数据。
在管理模块的状态为recovering状态的情况下,数据系统中的第二设备可分为两类,一类是此前未与管理模块断连的第二设备(可称为第一目标设备),另一类是此前与管理模块断连又在其后重连的第二设备(可称为第二目标设备)。
这种情况下,在管理模块的状态切换为recovering状态后,管理模块从第二目标设备中获取可用区块标识,然后将第二目标设备的freelist组件回滚至该可用区块标识对应的freelist组件。
需注意的是,若该可用区块标识是当前区块标识,说明第二目标设备已经执行完成当前区块标识,则管理模块此时无需进行数据恢复。这种情况下,对于第三缓存区中的消息,若该消息为数据修改消息,则管理模块可以生成针对该数据修改消息对应的数据修改指令的回复消息并发送给第一设备,然后从第三缓存区中删除该消息;若该消息为除数据修改消息之外的其他类型的消息,则管理模块可以将该消息发送给第二目标设备,由第二目标设备对该消息处理后进行回复,管理模块在接收到第二目标设备对该消息的回复后,生成针对该消息对应的上层指令的回复消息并发送给第一设备,然后从第三缓存区中删除该消息。在第三缓存区被清空后,管理模块就可以将管理模块的状态切换为normal状态,以继续正常处理数据。
而若该可用区块标识不是当前区块标识,则管理模块可以根据该可用区块标识、预写日志恢复数据系统中的第二设备中的节点数据,以及在数据恢复过程中根据第三缓存区对第一设备进行回复。
可选地,管理模块可以确定预写日志中最早记录有该可用区块标识的下一个区块标识的日志信息,将该日志信息及预写日志中在该日志信息之后记录的所有日志信息均作为第一日志信息,以得到k个第一日志信息,该k个第一日志信息是顺序记录的,k为正整数。管理模块可以根据该k个第一日志信息进行数据恢复,以及在数据恢复过程中根据第三缓存区对第一设备进行回复。
在一些实施例中,管理模块可按序根据该k个第一日志信息恢复数据系统中的第二设备中的节点数据,以及在数据恢复过程中根据第三缓存区对第一设备进行回复。具体操作可以包括如下步骤(1)至步骤(5):
(1)令i为1。
将i初始化为1后,管理模块可开始根据该k个第一日志信息中的第1个第一日志信息进行数据恢复,第1个第一日志信息是该k个第一日志信息中最早记录的第一日志信息。
(2)对于该k个第一日志信息中的第i个第一日志信息,管理模块根据第i个第一日志信息生成至少一个目标消息。
目标消息是实现第i个第一日志信息指示的操作时需要向第二设备发送的数据修改消息。目标消息是管理模块根据第i个第一日志信息在本地重新生成的数据修改消息,目标消息实际上在管理模块此前执行第i个第一日志信息指示的操作时就已生成过并向相应的第二设备发送过。
比如,在第i个第一日志信息记录有区块标识、全局页标识和待修改的数据列表的情况下,管理模块根据第i个第一日志信息生成的目标消息为携带有该区块标识、第二设备标识、数据修改任务的数据修改消息(即上文实施例中所述的数据修改消息),该数据修改消息是实现在该区块标识所标识的区块的执行过程中对节点数据的修改时需要向相应的第二设备发送的消息。
(3)管理模块处理该至少一个目标消息,以及在处理该至少一个目标消息的过程中根据第三缓存区对第一设备进行回复,在完成对该至少一个目标消息的处理后,确定完成针对第i个第一日志信息的数据恢复过程。
对于该至少一个目标消息中任意的一个目标消息,管理模块可以处理这个目标消息,具体可以包括如下两种情况:
第一种情况,若这个目标消息是需要向第一目标设备发送的消息,则管理模块可以根据这个目标消息从第一目标设备中获取处理这个目标消息时所需的节点数据,根据获取到的节点数据对这个目标消息进行处理。若在这个目标消息的处理过程中未产生需要向第二目标设备发送的消息,则管理模块确定完成对这个目标消息的处理;若在这个目标消息的处理过程中产生了需要向第二目标设备发送的消息(可称为指定消息),则管理模块将指定消息发送给第二目标设备,由第二目标设备处理指定消息后进行回复,管理模块接收到第二目标设备针对指定消息的回复消息后,确定完成对这个目标消息的处理。
需说明的是,若这个目标消息是需要向第一目标设备发送的消息,由于第一目标设备此前未断连,所以第一目标设备此前是已经正常处理了这个目标消息并进行了回复的,所以在数据恢复过程中管理模块无需再将这个目标消息发送给第一目标设备,而是可以根据这个目标消息从第一目标设备中获取处理这个目标消息时所需的节点数据,然后根据获取到的节点数据在本地复现这个目标消息的处理过程。而在管理模块在本地复现这个目标消息的处理过程中,有可能会产生需要向第二目标设备发送的指定消息。这种情况下,需要将产生的指定消息发送给第二目标设备进行处理,以使第二目标设备恢复相应的节点数据。
比如,这个目标消息为数据修改消息,这个目标消息中携带区块标识、第二设备标识、数据修改任务,该数据修改任务包括局部页标识和数据列表。假设这个目标消息中的第二设备标识所标识的第二设备为第一目标设备,即这个目标消息是需要向第一目标设备发送的消息,则管理模块可以从第一目标设备中获取该局部页标识所标识的磁盘页中存储的数据节点的数据,然后管理模块根据该数据列表修改该数据节点的数据,以更新该数据节点,再根据更新后的数据节点确定至少一个新数据节点,之后,管理模块为该至少一个新数据节点分配页标识。若在为该至少一个新数据节点分配页标识的过程中,管理模块确定无需在第二目标设备中为该新数据节点分配局部页标识,则可以确定完成对这个目标消息的处理。而若在为该至少一个新数据节点分配页标识的过程中,管理模块确定需要在第二目标设备中为任意一个新数据节点分配局部页标识,则管理模块可以通过第二目标设备的freelist组件为这个新数据节点分配第二目标设备中的局部页标识,然后生成携带有该区块标识、该局部页标识和这个新数据节点的数据的数据分配消息(即上文实施例中所述的数据分配消息),之后,管理模块可以将该数据分配消息发送给第二目标设备,第二目标设备接收到该数据分配消息后可以向管理模块返回针对该数据分配消息的回复消息,管理模块接收到第二目标设备返回的回复消息后可以确定完成对这个目标消息的处理。
第二种情况,若这个目标消息是需要向第二目标设备发送的消息,则管理模块可以将这个目标消息发送给第二目标设备,由第二目标设备处理这个目标消息后进行回复。管理模块接收到第二目标设备针对这个目标消息的回复消息后,确定完成对这个目标消息的处理。
需说明的是,若这个目标消息是需要向第二目标设备发送的消息,由于第二目标设备此前断连了,所以管理模块需要将这个目标消息发送给第二目标设备进行处理,以使第二目标设备恢复相应的节点数据。
并且,若第三缓存区中包含这个目标消息,说明这个目标消息是此前未向上层进行回复的消息,则管理模块接收到第二目标设备针对这个目标消息的回复消息后,还可以根据第二目标设备针对这个目标消息的回复消息生成针对这个目标消息对应的数据修改指令的回复消息并发送给第一设备,然后从第三缓存区中删除这个目标消息。
比如,这个目标消息为数据修改消息,这个目标消息中携带区块标识、第二设备标识、数据修改任务,该数据修改任务包括局部页标识和数据列表。假设这个目标消息中的第二设备标识所标识的第二设备为第二目标设备,即这个目标消息是需要向第二目标设备发送的消息,则管理模块可以将这个目标消息发送给第二目标设备。第二目标设备接收到这个目标消息后,可以根据该数据列表修改该局部页标识所标识的磁盘页中存储的数据节点的数据,以更新该数据节点,再根据更新后的数据节点确定至少一个新数据节点,然后向管理模块发送磁盘页分配请求,以请求管理模块为该至少一个新数据节点分配页标识。
在一些实施例中,管理模块可以通过第二目标设备的freelist组件为该至少一个新数据节点中每个新数据节点分配第二目标设备中的局部页标识,然后向第二目标设备发送携带有该至少一个新数据节点中每个新数据节点的第二设备标识和局部页标识的磁盘页分配结果。第二目标设备接收到该磁盘页分配结果后,可以向管理模块返回针对这个目标消息的回复消息。管理模块接收到第二目标设备返回的回复消息后可以确定完成对这个目标消息的处理。
在另一些实施例中,管理模块在为该至少一个新数据节点分配页标识的过程中,确定需要在第一目标设备中为某些新数据节点(可称为第一新数据节点)分配局部页标识。
这种情况下,若第i个第一日志信息中记录的区块标识不是当前区块标识,由于此前未断连的第一目标设备在当前区块之前的区块的执行过程中是已经拿到了第一新数据节点的数据和局部页标识的,所以在数据恢复过程中管理模块无需再在第一目标设备中为第一新数据节点分配局部页标识。也就是说,对于该至少一个新数据节点中除第一新数据节点之外的新数据节点(可称为第二新数据节点),管理模块可以通过第二目标设备的freelist组件为第二新数据节点分配第二目标设备中的局部页标识,然后向第二目标设备发送携带有第二新数据节点的第二设备标识和局部页标识的磁盘页分配结果。第二目标设备接收到该磁盘页分配结果后,可以向管理模块返回针对这个目标消息的回复消息。管理模块接收到第二目标设备返回的回复消息后可以确定完成对这个目标消息的处理。
而若第i个第一日志信息中记录的区块标识是当前区块标识,则需要先判断断第三缓存区中是否包含这个目标消息。
若第三缓存区中未包含这个目标消息,则说明这个目标消息是已经向上层回复过的消息,因而可以确定第一目标设备在当前区块的执行过程中已经拿到了第一新数据节点的数据和局部页标识,所以在数据恢复过程中管理模块无需再在第一目标设备中为第一新数据节点分配局部页标识。也就是说,对于该至少一个新数据节点中除第一新数据节点之外的新数据节点(可称为第二新数据节点),管理模块可以通过第二目标设备的freelist组件为第二新数据节点分配第二目标设备中的局部页标识,然后向第二目标设备发送携带有第二新数据节点的第二设备标识和局部页标识的磁盘页分配结果。第二目标设备接收到该磁盘页分配结果后,可以向管理模块返回针对这个目标消息的回复消息。管理模块接收到第二目标设备返回的回复消息后可以确定完成对这个目标消息的处理。
若第三缓存区中包含这个目标消息,则说明这个目标消息是未向上层进行回复的消息,而由于第二目标设备此前断连了,所以不能确定第一目标设备在当前区块的执行过程中是否拿到了第一新数据节点的数据和局部页标识,那么在数据恢复过程中管理模块需要在第一目标设备中为第一新数据节点分配局部页标识。也就是说,对于该至少一个新数据节点中的第一新数据节点,管理模块可以通过第一目标设备的freelist组件为第一新数据节点分配第一目标设备中的局部页标识,对于该至少一个新数据节点中除第一新数据节点之外的新数据节点(可称为第二新数据节点),管理模块可以通过第二目标设备的freelist组件为第二新数据节点分配第二目标设备中的局部页标识,之后,管理模块向第二目标设备发送携带有该至少一个新数据节点中每个新数据节点的第二设备标识和局部页标识的磁盘页分配结果。第二目标设备接收到该磁盘页分配结果后,可以将这个目标消息中的区块标识、第一新数据节点的局部页标识和第一新数据节点的数据携带于数据分配消息中发送给第一目标设备,第一目标设备接收到该数据分配消息后,返回针对该数据分配消息的回复消息,第二目标设备接收到第一目标设备发送的针对该数据分配消息的回复消息后,可以向管理模块发送针对这个目标消息的回复消息。管理模块接收到第二目标设备返回的回复消息后可以确定完成对这个目标消息的处理。并且,由于第三缓存区中包含这个目标消息,所以管理模块还可以根据第二目标设备针对这个目标消息的回复消息生成针对这个目标消息对应的数据修改指令的回复消息并发送给第一设备,然后管理模块可以从第三缓存区中删除这个目标消息。
(4)判断i与k是否相等。
判断i与k是否相等,也即是判断当前的第i个第一日志信息是否为第k个第一日志信息,也就是判断是否已按序根据该k个第一日志信息完成数据恢复。
(5)若i与k不相等,则令i=i+1,重新执行上述步骤(2)至步骤(4),直至i与k相等为止。
若i与k不相等,说明当前的第i个第一日志信息并不是第k个第一日志信息,则可以令i=i+1,并重新执行上述步骤(2)至步骤(4),以继续根据下一个第一日志信息进行数据恢复。如此循环,直至确定i与k相等时,说明管理模块已按序根据该k个第一日志信息完成数据恢复,则结束操作。
管理模块按序根据该k个第一日志信息完成数据恢复后,第三缓存区中的数据修改消息均被删除。这种情况下,若第三缓存区被清空,则管理模块就可以将管理模块的状态切换为normal状态,以继续正常处理数据。而若第三缓存区未被清空,即第三缓存区中还存在除数据修改消息之外的其他类型的消息,则管理模块可以将第三缓存区中的消息发送给第二目标设备,由第二目标设备对该消息处理后进行回复,管理模块在接收到第二目标设备对该消息的回复后,生成针对该消息对应的上层指令的回复消息并发送给第一设备,然后从第三缓存区中删除该消息,如此直至在第三缓存区被清空后,管理模块就可以将管理模块的状态切换为normal状态,以继续正常处理数据。
下面对该数据库系统重启场景下的数据恢复过程进行说明:
在一些实施例中,该数据库系统可能会重启,该数据库系统重启后,第一设备与管理模块正常连接,管理模块与数据系统中所有的第二设备正常连接。
该数据库系统重启后,第一设备可以获取本地最新持久化完成的区块标识(可称为第三区块标识)以及本地最新执行完成的区块标识(可称为第四区块标识),第三区块标识是index层已落盘的节点数据对应的区块标识。管理模块可以获取数据系统中所有第二设备中每个第二设备最新持久化完成的区块标识中最小的区块标识(可称为第五区块标识),并将第五区块标识发送给第一设备,第五区块标识是data层已落盘的节点数据对应的区块标识。这种情况下,第一设备可以将第三区块标识和第五区块标识中较小的一个区块标识(可称为第六区块标识)作为恢复起始点,然后恢复第六区块标识至第四区块标识之间的所有区块标识对应的节点数据。
可选地,第一设备恢复第六区块标识至第四区块标识之间的所有区块标识对应的节点数据的操作如下:
首先,第一设备需要将第六区块标识之后的所有区块标识所标识的区块回滚掉。具体来讲,第一设备可以向管理模块发送携带有第六区块标识的下一个区块标识的回滚指令,管理模块接收到该回滚指令后,可以删除第六区块标识之后的所有区块标识对应的版本信息,以及可以回滚第六区块标识之后的所有区块标识对应的freelist组件的修改内容等。另外,管理模块还可以向数据系统中的所有第二设备发送携带有第六区块标识的下一个区块标识的回滚消息,第二设备接收到该回滚消息后,将区块标识表中的第一区块标识和第二区块标识均更新为第六区块标识,然后向管理模块返回针对该回滚消息的回复消息。管理模块接收到所有第二设备发送的针对该回滚消息的回复消息后,向第一设备发送回滚完成消息。第一设备接收到管理模块发送的回滚完成消息后,可以删除第六区块标识之后的所有区块标识对应的版本信息,以及可以回滚第六区块标识之后的所有区块标识对应的freelist组件的修改内容等。如此,即完成对第六区块标识之后的所有区块标识所标识的区块的回滚。
之后,第一设备根据第一设备中的预写日志恢复第六区块标识至第四区块标识之间的所有区块标识对应的节点数据。第一设备中的预写日志中记录有区块链系统发送至管理模块的数据修改请求中携带的相关操作信息。具体来讲,第一设备确定预写日志中最早记录有第六区块标识的下一个区块标识的日志信息,将该日志信息及预写日志中在该日志信息之后记录的所有日志信息均作为第二日志信息,以得到j个第二日志信息,该j个第二日志信息是顺序记录的,j为正整数。第一设备可以按序根据该j个第二日志信息中的每个日志信息恢复其携带的区块标识对应的节点数据。
具体地,第一设备可以按序根据该j个第二日志信息中的每个日志信息对自身存储的索引节点的数据进行操作以及通过管理模块对第二设备中存储的数据节点的数据进行操作,以恢复每个日志信息中记录的区块标识对应的节点数据。其中,第一设备根据某个第二日志信息对自身存储的索引节点的数据进行操作以及通过管理模块对第二设备中存储的数据节点的数据进行操作的过程,与第一设备接收到这个第二日志信息对应的数据修改请求时的操作过程相同,本申请实施例对此不再赘述。
在本申请实施例中,数据库系统包括第一设备、管理模块和数据系统,数据系统包括多个第二设备,第一设备用于存储默克尔B+树中索引节点的数据,多个第二设备用于存储默克尔B+树中数据节点的数据。管理模块在与数据系统中所有的第二设备均正常连接的情况下,接收第一设备发送的数据修改指令,将该数据修改指令中携带的操作信息记录于管理模块中的预写日志,以及根据该数据修改指令生成对应的数据修改消息,根据该数据修改消息对数据系统中第二设备中的节点数据进行操作。如此,通过数据库系统中的分布式架构可将默克尔B+树中的数据节点的操作压力分散到数据系统中的多个第二设备上,可降低单个设备的数据操作压力,从而可提高该数据库系统的吞吐量,进而提升该数据库系统的性能。并且,管理模块在与数据系统中任意一个第二设备断连后,可以持久化预写日志,然后管理模块在与数据系统中断连的第二设备重新连接后,可以根据预写日志恢复数据系统中的第二设备中的节点数据。如此,使得在出现管理模块与第二设备断连这种分布式架构常见的异常场景时,该数据库系统有自恢复和保证数据正确性的能力。
图5是本申请实施例提供的一种计算机设备的结构示意图。如图5所示,计算机设备5包括:处理器50、存储器51以及存储在存储器51中并可在处理器50上运行的计算机程序52,处理器50执行计算机程序52时实现上述实施例中的数据恢复方法中由第一设备、管理模块或第二设备执行的操作。
计算机设备5可以是一个通用计算机设备或一个专用计算机设备。在具体实现中,计算机设备5可以是台式机、便携式电脑、网络服务器、掌上电脑、移动手机、平板电脑、无线终端设备、通信设备或嵌入式设备,本申请实施例不限定计算机设备5的类型。本领域技术人员可以理解,图5仅仅是计算机设备5的举例,并不构成对计算机设备5的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,比如还可以包括输入输出设备、网络接入设备等。
处理器50可以是中央处理单元(Central Processing Unit,CPU),处理器50还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者也可以是任何常规的处理器。
存储器51在一些实施例中可以是计算机设备5的内部存储单元,比如计算机设备5的硬盘或内存。存储器51在另一些实施例中也可以是计算机设备5的外部存储设备,比如计算机设备5上配备的插接式硬盘、智能存储卡(Smart Media Card,SMC)、安全数字(SecureDigital,SD)卡、闪存卡(Flash Card)等。进一步地,存储器51还可以既包括计算机设备5的内部存储单元也包括外部存储设备。存储器51用于存储操作系统、应用程序、引导装载程序(Boot Loader)、数据以及其他程序等。存储器51还可以用于暂时地存储已经输出或者将要输出的数据。
本申请实施例还提供了一种计算机设备,该计算机设备包括:至少一个处理器、存储器以及存储在该存储器中并可在该至少一个处理器上运行的计算机程序,该处理器执行该计算机程序时实现上述任意各个方法实施例中的步骤。
本申请实施例还提供了一种计算机可读存储介质,该计算机可读存储介质存储有计算机程序,该计算机程序被处理器执行时可实现上述各个方法实施例中的步骤。
本申请实施例提供了一种计算机程序产品,当其在计算机上运行时,使得计算机执行上述各个方法实施例中的步骤。
集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请实现上述方法实施例中的全部或部分流程,可以通过计算机程序来指令相关的硬件来完成,该计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,该计算机程序包括计算机程序代码,该计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。该计算机可读介质至少可以包括:能够将计算机程序代码携带到拍照装置/终端设备的任何实体或装置、记录介质、计算机存储器、ROM(Read-Only Memory,只读存储器)、RAM(Random Access Memory,随机存取存储器)、CD-ROM(Compact Disc Read-Only Memory,只读光盘)、磁带、软盘和光数据存储设备等。本申请提到的计算机可读存储介质可以为非易失性存储介质,换句话说,可以是非瞬时性存储介质。
应当理解的是,实现上述实施例的全部或部分步骤可以通过软件、硬件、固件或者其任意结合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。该计算机程序产品包括一个或多个计算机指令。该计算机指令可以存储在上述计算机可读存储介质中。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
在本申请所提供的实施例中,应该理解到,所揭露的装置/计算机设备和方法,可以通过其它的方式实现。例如,以上所描述的装置/计算机设备实施例仅仅是示意性的,例如,模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通讯连接可以是通过一些接口,装置或单元的间接耦合或通讯连接,可以是电性,机械或其它的形式。
作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
以上所述实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围,均应包含在本申请的保护范围之内。
Claims (18)
1.一种数据恢复方法,其特征在于,所述方法应用于数据库系统中的管理模块,所述数据库系统包括第一设备、所述管理模块和数据系统,所述数据系统包括多个第二设备,所述第一设备用于存储默克尔B+树中索引节点的数据,所述多个第二设备用于存储所述默克尔B+树中数据节点的数据,所述方法包括:
在所述管理模块与所述数据系统中所有的第二设备均正常连接的情况下,接收所述第一设备发送的数据修改指令,将所述数据修改指令中携带的操作信息记录于所述管理模块中的预写日志,以及根据所述数据修改指令生成对应的数据修改消息,根据所述数据修改消息对所述数据系统中第二设备中的节点数据进行操作;
在所述管理模块与所述数据系统中任意一个第二设备断连后,持久化所述预写日志;
在所述管理模块与所述数据系统中断连的第二设备重新连接后,将所述管理模块的状态切换为启动恢复状态,从第二目标设备中获取可用区块标识,所述可用区块标识为所述第二目标设备中具有完整信息的一个区块标识,所述第二目标设备为所述数据系统中与所述管理模块重新连接的第二设备;根据所述可用区块标识和所述预写日志恢复所述数据系统中的第二设备中的节点数据。
2.如权利要求1所述的方法,其特征在于,所述管理模块具有多个状态,所述多个状态包括正常状态、切换状态、等待重连状态、所述启动恢复状态;所述方法还包括:
在所述管理模块与所述数据系统中所有的第二设备均正常连接的情况下,将所述管理模块的状态保持为所述正常状态,将根据所述第一设备发送的指令生成的对应的消息添加至第一缓存区,所述第一缓存区中的消息在收到回复后被删除;
在所述管理模块的状态为所述正常状态的情况下,若所述管理模块与所述数据系统中任意一个第二设备断连,则将所述管理模块的状态切换为所述切换状态,将所述第一缓存区中的消息分别移动至第二缓存区和第三缓存区,所述第二缓存区中的消息是发送给所述数据系统中未断连的第二设备的消息,所述第三缓存区中的消息是发送给所述数据系统中已断连的第二设备的消息,所述第二缓存区中的消息在收到回复后被删除;
在所述管理模块的状态为所述切换状态的情况下,若所述第二缓存区被清空,则将所述管理模块的状态切换为所述等待重连状态;
在所述管理模块的状态为所述等待重连状态的情况下,若所述管理模块与所述数据系统中断连的第二设备重新连接,则将所述管理模块的状态切换为所述启动恢复状态。
3.如权利要求2所述的方法,其特征在于,所述在所述管理模块的状态为所述正常状态的情况下,若所述管理模块与所述数据系统中任意一个第二设备断连,则将所述管理模块的状态切换为所述切换状态,包括:
在所述管理模块的状态为所述正常状态的情况下,若所述管理模块与所述数据系统中任意一个第二设备断连,则在已经接收到所述第一设备发送的当前区块的至少一个数据修改指令的情况下,确定是否已经接收到所述当前区块的所有数据修改指令;
若未接收到所述当前区块的所有数据修改指令,则不切换状态,继续接收所述第一设备发送的所述当前区块的数据修改指令,直至接收到所述当前区块的所有数据修改指令,且将根据接收到的所述数据修改指令生成的对应的数据修改消息均已添加至所述第一缓存区且均已向所述数据系统中的第二设备发送后,将所述管理模块的状态切换为所述切换状态。
4.如权利要求2所述的方法,其特征在于,所述多个状态还包括不可用状态,所述方法还包括:
在所述管理模块的状态切换为所述等待重连状态后,若超过预设的时间阈值后所述数据系统中仍存在与所述管理模块断连的第二设备,则将所述管理模块的状态切换为不可用状态。
5.如权利要求2至4任一所述的方法,其特征在于,所述根据所述可用区块标识和所述预写日志恢复所述数据系统中的第二设备中的节点数据,包括:
确定所述预写日志中最早记录有所述可用区块标识的下一个区块标识的日志信息,将所述日志信息和所述预写日志中在所述日志信息之后记录的所有日志信息均作为第一日志信息,以得到k个第一日志信息,所述k为正整数;
按序根据所述k个第一日志信息恢复所述数据系统中的第二设备中的节点数据,以及在数据恢复过程中根据所述第三缓存区对所述第一设备进行回复。
6.如权利要求5所述的方法,其特征在于,所述按序根据所述k个第一日志信息恢复所述数据系统中的第二设备中的节点数据,以及在数据恢复过程中根据所述第三缓存区对所述第一设备进行回复,包括:
令i为1;
根据所述k个第一日志信息中第i个第一日志信息生成至少一个目标消息,所述目标消息是实现所述第i个第一日志信息指示的操作时需要向所述第二设备发送的数据修改消息;
处理所述至少一个目标消息,以及在处理所述至少一个目标消息的过程中根据所述第三缓存区对所述第一设备进行回复,在完成对所述至少一个目标消息的处理后,确定完成针对所述第i个第一日志信息的数据恢复过程;
判断i与k是否相等;
若i与k不相等,则令i=i+1,重新执行所述根据所述k个第一日志信息中第i个第一日志信息生成至少一个目标消息的步骤及后续步骤,直至i与k相等为止。
7.如权利要求6所述的方法,其特征在于,第一目标设备为所述数据系统中除所述第二目标设备之外的第二设备;所述处理所述至少一个目标消息,包括:
对于所述至少一个目标消息中任意的一个目标消息,若所述一个目标消息是需要向所述第一目标设备发送的消息,则根据所述一个目标消息从所述第一目标设备中获取处理所述一个目标消息时所需的节点数据,根据获取到的节点数据对所述一个目标消息进行处理;
若在所述一个目标消息的处理过程中未产生需要向所述第二目标设备发送的消息,则确定完成对所述一个目标消息的处理;
若在所述一个目标消息的处理过程中产生需要向所述第二目标设备发送的指定消息,则将所述指定消息发送给所述第二目标设备,在接收到所述第二目标设备对所述指定消息的回复后,确定完成对所述一个目标消息的处理。
8.如权利要求6所述的方法,其特征在于,所述处理所述至少一个目标消息,包括:
对于所述至少一个目标消息中任意的一个目标消息,若所述一个目标消息是需要向所述第二目标设备发送的消息,则将所述一个目标消息发送给所述第二目标设备,在接收到所述第二目标设备对所述一个目标消息的回复后,确定完成对所述一个目标消息的处理。
9.如权利要求8所述的方法,其特征在于,所述在处理所述至少一个目标消息的过程中根据所述第三缓存区对所述第一设备进行回复,包括:
在接收到所述第二目标设备对所述一个目标消息的回复后,若确定所述第三缓存区中包含所述一个目标消息,则根据所述第二目标设备对所述一个目标消息的回复,生成针对所述一个目标消息对应的数据修改指令的回复消息并发送给所述第一设备,从所述第三缓存区中删除所述一个目标消息。
10.如权利要求8或9所述的方法,其特征在于,第一目标设备为所述数据系统中除所述第二目标设备之外的第二设备,所述目标消息携带区块标识、第二设备标识、数据修改任务,所述数据修改任务包括局部页标识和数据列表;
所述若所述一个目标消息是需要向所述第二目标设备发送的消息,则将所述一个目标消息发送给所述第二目标设备,在接收到所述第二目标设备对所述一个目标消息的回复后,确定完成对所述一个目标消息的处理,包括:
若所述一个目标消息中的第二设备标识所标识的第二设备为所述第二目标设备,则将所述一个目标消息发送给所述第二目标设备;
接收所述第二目标设备发送的磁盘页分配请求,所述磁盘页分配请求用于请求为至少一个新数据节点分配页标识,所述至少一个新数据节点是所述第二目标设备根据所述数据列表修改所述局部页标识所标识的磁盘页中存储的数据节点的数据后得到的;
为所述至少一个新数据节点分配页标识,在为所述至少一个新数据节点分配页标识的过程中,若确定需要在所述第一目标设备中为所述至少一个新数据节点中的第一新数据节点分配局部页标识,则在所述第i个第一日志信息中记录的区块标识不是当前区块标识的情况下,为所述至少一个新数据节点中除所述第一新数据节点之外的第二新数据节点分配所述第二目标设备中的局部页标识;
向所述第二目标设备发送携带有所述第二新数据节点的第二设备标识和局部页标识的磁盘页分配结果;
在接收到所述第二目标设备对所述一个目标消息的回复后确定完成对所述一个目标消息的处理。
11.如权利要求10所述的方法,其特征在于,所述接收所述第二目标设备发送的磁盘页分配请求之后,还包括:
为所述至少一个新数据节点分配页标识,在为所述至少一个新数据节点分配页标识的过程中,若确定需要在所述第一目标设备中为所述至少一个新数据节点中的第一新数据节点分配局部页标识,则在所述第i个第一日志信息中记录的区块标识是所述当前区块标识的情况下,判断所述第三缓存区中是否包含所述一个目标消息;
若所述第三缓存区中未包含所述一个目标消息,则为所述至少一个新数据节点中除所述第一新数据节点之外的第二新数据节点分配所述第二目标设备中的局部页标识;
向所述第二目标设备发送携带有所述第二新数据节点的第二设备标识和局部页标识的磁盘页分配结果;
在接收到所述第二目标设备对所述一个目标消息的回复后确定完成对所述一个目标消息的处理。
12.如权利要求11所述的方法,其特征在于,所述判断所述第三缓存区中是否包含所述一个目标消息之后,还包括:
若所述第三缓存区中包含所述一个目标消息,则为所述第一新数据节点分配所述第一目标设备中的局部页标识,为所述至少一个新数据节点中除所述第一新数据节点之外的第二新数据节点分配所述第二目标设备中的局部页标识;
向所述第二目标设备发送携带有所述至少一个新数据节点中每个新数据节点的第二设备标识和局部页标识的磁盘页分配结果;
在接收到所述第二目标设备对所述一个目标消息的回复后确定完成对所述一个目标消息的处理。
13.一种数据恢复方法,其特征在于,所述方法应用于数据库系统,所述数据库系统包括第一设备、管理模块和数据系统,所述数据系统包括多个第二设备,所述第一设备用于存储默克尔B+树中索引节点的数据,所述多个第二设备用于存储所述默克尔B+树中数据节点的数据,所述方法包括:
所述管理模块在与所述数据系统中所有的第二设备均正常连接的情况下,接收所述第一设备发送的数据修改指令,将所述数据修改指令中携带的操作信息记录于所述管理模块中的预写日志,以及根据所述数据修改指令生成对应的数据修改消息,根据所述数据修改消息对所述数据系统中第二设备中的节点数据进行操作;
所述管理模块在与所述数据系统中任意一个第二设备断连后,持久化所述预写日志;
所述管理模块在与所述数据系统中断连的第二设备重新连接后,将所述管理模块的状态切换为启动恢复状态,从第二目标设备中获取可用区块标识,所述可用区块标识为所述第二目标设备中具有完整信息的一个区块标识,所述第二目标设备为所述数据系统中与所述管理模块重新连接的第二设备;根据所述可用区块标识和所述预写日志恢复所述数据系统中的第二设备中的节点数据。
14.如权利要求13所述的方法,其特征在于,所述方法还包括:
在所述数据库系统重启后,所述第一设备获取第三区块标识和第四区块标识,以及从所述管理模块中获取第五区块标识,所述第三区块标识为所述第一设备最新持久化完成的区块标识,所述第四区块标识为所述第一设备最新执行完成的区块标识,所述第五区块标识为所述数据系统中所有第二设备中每个第二设备最新持久化完成的区块标识中最小的区块标识;
所述第一设备将所述第三区块标识和所述第五区块标识中较小的一个区块标识作为第六区块标识;
所述第一设备恢复所述第六区块标识至所述第四区块标识之间的所有区块标识对应的节点数据。
15.如权利要求14所述的方法,其特征在于,所述第一设备恢复所述第六区块标识至所述第四区块标识之间的所有区块标识对应的节点数据,包括:
所述第一设备回滚所述第六区块标识之后的所有区块标识所标识的区块;
所述第一设备确定所述第一设备中的预写日志中最早记录有所述第六区块标识的下一个区块标识的日志信息,将所述日志信息和所述第一设备中的预写日志中在所述日志信息之后记录的所有日志信息均作为第二日志信息,以得到j个第二日志信息,所述j为正整数;
所述第一设备按序根据所述j个第二日志信息中的每个日志信息恢复所述每个日志信息中记录的区块标识对应的节点数据。
16.一种数据库系统,其特征在于,所述数据库系统包括第一设备、管理模块和数据系统,所述数据系统包括多个第二设备,所述第一设备用于存储默克尔B+树中索引节点的数据,所述多个第二设备用于存储所述默克尔B+树中数据节点的数据;
在所述管理模块,用于与所述数据系统中所有的第二设备均正常连接的情况下,接收所述第一设备发送的数据修改指令,将所述数据修改指令中携带的操作信息记录于所述管理模块中的预写日志,以及根据所述数据修改指令生成对应的数据修改消息,根据所述数据修改消息对所述数据系统中第二设备中的节点数据进行操作;
在所述管理模块,还用于与所述数据系统中任意一个第二设备断连后,持久化所述预写日志;
在所述管理模块,还用于与所述数据系统中断连的第二设备重新连接后,将所述管理模块的状态切换为启动恢复状态,从第二目标设备中获取可用区块标识,所述可用区块标识为所述第二目标设备中具有完整信息的一个区块标识,所述第二目标设备为所述数据系统中与所述管理模块重新连接的第二设备;根据所述可用区块标识和所述预写日志恢复所述数据系统中的第二设备中的节点数据。
17.一种计算机设备,其特征在于,所述计算机设备包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如权利要求1至12任意一项所述的方法。
18.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至12任意一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310297517.0A CN116010430B (zh) | 2023-03-24 | 2023-03-24 | 数据恢复方法、数据库系统、计算机设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310297517.0A CN116010430B (zh) | 2023-03-24 | 2023-03-24 | 数据恢复方法、数据库系统、计算机设备和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN116010430A CN116010430A (zh) | 2023-04-25 |
CN116010430B true CN116010430B (zh) | 2023-06-20 |
Family
ID=86021324
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310297517.0A Active CN116010430B (zh) | 2023-03-24 | 2023-03-24 | 数据恢复方法、数据库系统、计算机设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116010430B (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112035410A (zh) * | 2020-08-18 | 2020-12-04 | 腾讯科技(深圳)有限公司 | 日志存储方法、装置、节点设备及存储介质 |
CN112650629A (zh) * | 2020-12-30 | 2021-04-13 | 杭州趣链科技有限公司 | 区块链索引数据恢复方法、装置、设备和计算机存储介质 |
CN113590596A (zh) * | 2021-07-02 | 2021-11-02 | 阿里巴巴新加坡控股有限公司 | 数据处理方法、系统、设备、计算机程序产品及存储介质 |
Family Cites Families (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8370310B2 (en) * | 2011-03-04 | 2013-02-05 | Microsoft Corporation | Managing database recovery time |
US9411692B2 (en) * | 2013-04-26 | 2016-08-09 | Hewlett Packard Enterprise Development Lp | Applying write elision |
CN107329699B (zh) * | 2017-06-29 | 2020-08-21 | 苏州浪潮智能科技有限公司 | 一种纠删重写方法及系统 |
US11461203B2 (en) * | 2018-07-10 | 2022-10-04 | Here Data Technology | Systems and methods of handling node failure in a distributed data storage using multi-layer consistent hashing |
US10866869B2 (en) * | 2019-01-16 | 2020-12-15 | Vmware, Inc. | Method to perform crash and failure recovery for a virtualized checkpoint protected storage system |
IL292672A (en) * | 2019-10-31 | 2022-07-01 | Zeu Tech Inc | A blockchain-based backup and recovery system and method |
CN111274318B (zh) * | 2020-01-16 | 2023-04-25 | 杭州趣链科技有限公司 | 一种区块链状态数据的存储、回滚方法、设备和存储介质 |
US11341001B1 (en) * | 2020-06-24 | 2022-05-24 | Amazon Technologies, Inc. | Unlimited database change capture for online database restores |
CN114461445A (zh) * | 2021-12-22 | 2022-05-10 | 天翼云科技有限公司 | 数据恢复方法及装置、电子设备、计算机可读存储介质 |
CN114297003A (zh) * | 2021-12-31 | 2022-04-08 | 北京人大金仓信息技术股份有限公司 | 一种数据库节点的故障恢复方法、装置、设备及存储介质 |
CN114546728A (zh) * | 2022-02-28 | 2022-05-27 | 浪潮云信息技术股份公司 | 一种适用于HBase进行数据备份与恢复的方法 |
CN114666195B (zh) * | 2022-03-21 | 2022-09-16 | 江苏红网技术股份有限公司 | 一种多层次安全防护数据交换共享系统及其方法 |
CN115348276A (zh) * | 2022-07-25 | 2022-11-15 | 杭州趣链科技有限公司 | 数据存储方法、装置、计算机设备及存储介质 |
-
2023
- 2023-03-24 CN CN202310297517.0A patent/CN116010430B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112035410A (zh) * | 2020-08-18 | 2020-12-04 | 腾讯科技(深圳)有限公司 | 日志存储方法、装置、节点设备及存储介质 |
CN112650629A (zh) * | 2020-12-30 | 2021-04-13 | 杭州趣链科技有限公司 | 区块链索引数据恢复方法、装置、设备和计算机存储介质 |
CN113590596A (zh) * | 2021-07-02 | 2021-11-02 | 阿里巴巴新加坡控股有限公司 | 数据处理方法、系统、设备、计算机程序产品及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN116010430A (zh) | 2023-04-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11809726B2 (en) | Distributed storage method and device | |
US10628378B2 (en) | Replication of snapshots and clones | |
US8904137B1 (en) | Deduplication system space recycling through inode manipulation | |
JP4117265B2 (ja) | ファイルシステムのバージョンを管理する方法およびシステム | |
US9547706B2 (en) | Using colocation hints to facilitate accessing a distributed data storage system | |
CN108509462B (zh) | 一种同步活动事务表的方法及装置 | |
CN103875229A (zh) | 异步复制方法、装置与系统 | |
US10572177B2 (en) | System and method for synchronizing history data for compression and decompression | |
WO2019209513A1 (en) | Fast and optimized restore using delta information | |
CN107038092B (zh) | 一种数据复制方法及装置 | |
CN111694865A (zh) | 基于分布式系统的四层结构数据获取方法和装置 | |
CN104965835A (zh) | 一种分布式文件系统的文件读写方法及装置 | |
CN109753381B (zh) | 一种基于对象存储的持续数据保护方法 | |
CN110196788B (zh) | 一种数据读取方法、装置、系统及存储介质 | |
CN113190619B (zh) | 分布式kv数据库的数据读写方法、系统、设备和介质 | |
US9594635B2 (en) | Systems and methods for sequential resilvering | |
CN116010430B (zh) | 数据恢复方法、数据库系统、计算机设备和存储介质 | |
CN114595286A (zh) | 一种数据同步方法、装置、电子设备及存储介质 | |
US11256434B2 (en) | Data de-duplication | |
CN115794819A (zh) | 一种数据写入方法及电子设备 | |
CN116069788B (zh) | 数据处理方法、数据库系统、计算机设备和存储介质 | |
CN115422135A (zh) | 数据处理方法以及装置 | |
CN113495807A (zh) | 数据备份方法、数据恢复方法及装置 | |
CN115987759B (zh) | 数据处理方法、装置、电子设备及存储介质 | |
CN116431632A (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 |