CN116339931A - 基于细粒度事务修复的分布式并发控制方法及系统 - Google Patents

基于细粒度事务修复的分布式并发控制方法及系统 Download PDF

Info

Publication number
CN116339931A
CN116339931A CN202310465852.7A CN202310465852A CN116339931A CN 116339931 A CN116339931 A CN 116339931A CN 202310465852 A CN202310465852 A CN 202310465852A CN 116339931 A CN116339931 A CN 116339931A
Authority
CN
China
Prior art keywords
transaction
read
batch
tuple
time stamp
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
CN202310465852.7A
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.)
Shanghai Jiaotong University
Original Assignee
Shanghai Jiaotong University
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 Shanghai Jiaotong University filed Critical Shanghai Jiaotong University
Priority to CN202310465852.7A priority Critical patent/CN116339931A/zh
Publication of CN116339931A publication Critical patent/CN116339931A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/466Transaction processing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/465Distributed object oriented systems
    • 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)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明提供了一种基于细粒度事务修复的分布式并发控制方法及系统,包括:步骤S1:计算节点接收用户请求,并根据请求内容执行事务操作;步骤S2:根据执行事务操作的结果,计算节点本地提交,并将本地提交的事务入队;步骤S3:当计算节点本地事务队列塞满后,将队列中的所有事务打包成一个批处理事务,并向存储节点全局提交批处理事务;如果批处理事务在全局提交过程中不能通过验证,则通过细粒度事务修复将批处理事务恢复到能够提交状态,继续提交批处理事务。本发明利用计算节点的本地缓存来减少事务执行期间读取存储节点数据操作带来的通信,从而降低了事务执行时延。

Description

基于细粒度事务修复的分布式并发控制方法及系统
技术领域
本发明涉及分布式事务处理系统、分布式并发控制领域,具体地,涉及一种基于细粒度事务修复的分布式并发控制方法及系统。
背景技术
近年来,随着云计算技术的快速发展,将传统的分布式事务处理系统移植到云上的需求越来越高。这些系统通常采用存算一体的架构,即计算逻辑和存储逻辑实现在同一个进程或节点上。这种设计源于系统运营商通常也是系统硬件的拥有者,因此服务器上的计算和存储硬件资源通常是固定的、相互耦合的。因此,软件设计不需要将计算逻辑与存储逻辑分离。然而,随着云计算技术的兴起,硬件资源可以灵活配置,这对软件系统的弹性和灵活伸缩能力提出了新的要求。具体而言,一个系统需要能够单独扩展其计算资源或存储资源。
针对这个需求,存算分离架构作为一种新型的分布式系统架构被提出。在存算分离架构中,计算逻辑和存储逻辑被分散到独立的节点中,主要分为计算节点和存储节点。计算节点负责数据的计算和处理,而存储节点则负责数据的存储和管理。计算节点可以根据需要动态地增加或减少,以适应不同的计算负载;同样地,存储节点可以根据需要动态地扩展存储容量,以适应不同的数据规模。这种系统架构提高了分布式系统的弹性和可伸缩性。以Amazon Aurora、Apple FoundationDB、PolarDB、Spanner为代表的云原生数据库已将其作为系统架构的选择。
在存算分离数据库中,负责事务执行的计算节点和负责数据存储的存储节点之间必须通过网络连接来执行和提交分布式事务,这会导致大量的跨节点通信。具体来说,在计算节点执行事务时,事务中的读操作需要读取远程存储节点上的数据;在计算节点提交事务时,现有的分布式提交协议需要多次网络往返以提交一个事务。这种架构特点导致事务执行时延长,拉长了事务提交时拿锁的窗口期,增加了事务间冲突概率,降低了系统的吞吐量。
为了减少计算节点和存储节点之间的网络通信,有两种直观可行的方法:第一种是在计算节点上使用本地缓存来减少事务执行阶段的网络开销。计算节点通过将经常访问的存储节点数据存储在本地缓存中,以便在下次访问时能够快速地获取数据,而不必再次通过网络进行数据传输。第二种是采用批处理的方案来减少事务提交阶段的网络开销。计算节点使用批处理的方法将多个事务组合成一个批次进行提交,从而均摊网络开销。然而,使用上述两种方法也会导致存算分离的分布式数据库事务回滚开销显著增加,主要有两个原因。一方面,当多个计算节点上所执行的事务写操作具有冲突时,计算节点的本地缓存可能会存在过期或失效的数据。当事务准备提交时,这样的事务会因为读取过期数据而被回滚,从而带来额外的开销。另一方面,使用批处理的方法导致事务冲突的粒度由单个事务变为一个批处理事务,进一步增加了事务之间冲突的可能性,加剧了事务回滚带来的开销。
针对上述问题,现有的Amazon Aurora数据库采用了本地缓存和批处理提交,但限制在其事务处理集群中只有一个节点能负责数据更新,从而使得该写者计算节点上的本地缓存不会失效,且不同计算节点间不会有冲突问题。但这样的设计严重受限于单写者的性能。Apple Foundat ioinDB数据库则直接选择不在计算节点上设置本地缓存,事务执行过程中仍需要进行远程读。针对上述系统的局限,本发明提出了一个存算分离分布式数据库,能够同时利用本地缓存和批处理提交,并创新性地使用事务修复机制降低了缓存和批处理带来的分布式事务回滚开销过大的问题。
专利文献CN106874076B公开了一种分布式事务处理方法,包括:多个事务处理节点中的其中一个事务处理节点接收事务启动请求,并将与事务启动请求对应的事务划分为若干子事务;其中一个事务处理节点执行预定的其中一个子事务,并将其余的子事务写入到本地数据库,并将本地数据库中的子事务发布至消息队列;消息队列向其余的事务处理节点推送子事务,以将相应的子事务写入到其余的事务处理节点的本地数据库,并在从其余的事务处理节点接收到成功标识后,从队列中删除相应的子事务;其余的事务处理节点从各自的本地数据库中获取并执行相应的子事务,并在执行完成后,从本地数据库中删除相应的子事务。但该发明没有利用批处理来减少事务提交期间的计算节点与存储节点间通信。
发明内容
针对现有技术中的缺陷,本发明的目的是提供一种基于细粒度事务修复的分布式并发控制方法及系统。
根据本发明提供的一种基于细粒度事务修复的分布式并发控制方法,包括:
步骤S1:计算节点接收用户请求,并根据请求内容执行事务操作;
步骤S2:根据执行事务操作的结果,计算节点本地提交,并将本地提交的事务入队;
步骤S3:当计算节点本地事务队列塞满后,将队列中的所有事务打包成一个批处理事务,并向存储节点全局提交批处理事务;
如果批处理事务在全局提交过程中不能通过验证,则通过细粒度事务修复将批处理事务恢复到能够提交状态,继续提交批处理事务。
优选地,在所述步骤S1中:
所述用户请求内容包括需要执行的事务逻辑以及对应的事务输入;事务逻辑被预先静态编译成一个数据流图,数据流图中的节点表示一个写操作或读操作;
被执行的事务操作中包括对数据的读操作和写操作:
读操作:参数为所读元组的键,执行时对所读的键申请本地共享锁,如果拿锁失败则回滚事务;锁成功申请后,从本地缓存中读取该元组;如果本地缓存未命中,则向存储该元组的存储节点发送读请求,并将读取结果写回本地缓存,将读取到的元组存入事务的读集合;所述读集合是记录了事务读操作读取元组的集合;
写操作:参数为需要写的元组的键值对,执行时对所写的键申请本地互斥锁,如果拿锁失败则回滚事务;锁成功申请后,将所写的键值对以及当前事务的标识符所组成的元组存入事务的写集合中;如果读操作和写操作由于锁冲突无法申请所需的锁,则当前事务需要被回滚,并释放所有已经申请的锁;所述写集合是记录了事务写操作写入元组的集合;
所述元组是存储数据的基本单元,其内容包括用于索引该元组的健,表示用户数据的值以及版本;元组的版本是最后一个修改该元组的事务标识符;事务的标识符是一个64位整形数字,每个事务拥有唯一的标识符。
优选地,在所述步骤S2中:
步骤S2.1:对于执行完成的事务,将该事务的写集合中的元组写入本地缓存;
步骤S2.2:将该事务加入计算节点本地事务队列,释放该事务为其读集合与写集合中的所有元组申请的本地锁;
所述本地事务队列是每个计算节点维护一份的队列数据结构,元素是事务唯一的标识符。
优选地,在所述步骤S3中:
步骤S3.1:在计算节点本地事务队列中的事务达到阈值后,将所有事务合并成一个批处理事务,将所有事务的读写集合分别合并为批处理事务的读集合与写集合,并去重;
步骤S3.2:计算节点向时间戳服务器发送时间戳获取请求,时间戳服务器根据时间戳获取请求,当前批处理事务访问的数据段,将对应数据段的当前时间戳单元组合为结果时间戳,并根据请求的数据段及对应访问类型更新数据段的时间戳单元,将结果时间戳返回给计算节点,当计算节点收到返回时间戳后,进入步骤S3.3;
步骤S3.3:计算节点向存有当前批处理事务读集合与写集合元组的相关存储节点发送准备提交请求;存储节点接收到准备提交请求后,根据对应批处理事务间的时间戳顺序,为批处理事务的读集合和写集合申请存储节点本地共享锁和互斥锁;
步骤S3.4:存储节点对批处理事务的读集合进行验证,将收到的准备提交请求持久化,将验证结果返回对应计算节点;计算节点收集来自相关存储节点的验证结果返回;如果有存储节点验证失败,则进入步骤S3.5;如果存储节点验证全部成功,进入步骤S3.6;
步骤S3.5:计算节点根据验证失败的存储节点返回的最新元组,开始细粒度修复当前批处理事务;在事务修复结束后,计算节点根据批处理事务被修复后的写集合更新本地缓存,进入步骤S3.6;
步骤S3.6:计算节点向存储节点发送提交请求,在存储节点收到提交请求后,如果对应的批处理被修复,则将请求中附带的修复后的写集合持久化,存储节点根据批处理事务的写集合更新本地存储,并将已申请的锁全部释放。
优选地,所述存储节点是一个逻辑的存储节点,由多个物理存储节点通过状态机备份的方式组成,每个物理存储节点初始状态相同,并按照相同顺序处理来自计算节点的请求;
所述准备提交请求包括批处理事务的读集合和写集合、时间戳、事务执行输入;
所述验证指将被验证批处理事务的读集合中的每一个元组和在存储节点本地的相同键的最新元组进行比较,比较两个元组的版本,如果版本相同则验证成功,否则验证失败,所述步骤S3.4在验证失败时,存储节点记录验证失败的元组,并将存储节点本地的相同键的最新元组返回给计算节点;
所述提交确认请求的内容包括确认提交的批处理事务的标识符;每个批处理事务都会被分配一个唯一的标识符;
所述时间戳是一个向量时间戳,该向量的每个元素对应一个数据段的时间戳单元,所述时间戳单元是一对计数器seq和readers,seq计数器记录了该数据段被批处理事务修改的次数,readers计数器记录自当前数据段被最后一次修改后,读取该数据段的批处理事务的数量;
所述时间戳服务器是一个提供时间戳服务的服务器,存储了所有数据段对应的时间戳单元,时间戳服务器在处理来自同一个计算节点的时间戳获取请求时,保证按照对应批处理事务在计算节点本地事务队列中的顺序处理;时间戳服务器通过拿锁保护读取和更新数据段对应时间戳单元的原子性;在更新时间服务器中数据段的时间戳单元时,如果目标数据段被当前批处理事务修改,将时间戳单元的seq计数器加一,readers计数器清零;如果目标数据段被当前批处理事务读取,则将时间戳单元的readers计数器加一;
所述数据段是分配时间戳单元的基本单位,一个数据段包含一个或多个元组,每个节点保存数据段与对应元组的映射关系;一个批处理事务修改一个数据段,表示该批处理事务的写集合中存在对应数据段保护的元组;一个批处理事务读取一个数据段,表示该批处理事务的读集合中存在当前数据段保护的元组,并且该批处理事务不修改当前数据段;当一个批处理事务修改或读取了一个数据段时,称该批处理事务访问了对应数据段;所述时间戳获取请求包含该批处理事务所修改的数据段集合和所读取的数据段集合;
所述时间戳顺序是一个偏序关系;
所述细粒度修复指的是计算节点重新执行需要被重新执行的读操作或写操作,在修复批处理事务时,计算节点根据事务本地提交的顺序,依次修复每一个当前批处理事务中的事务;在修复事务时,计算节点根据拓扑顺序遍历对应事务逻辑的数据流图中的操作节点,对于一个读操作,计算节点在事务执行时记录该操作所读取元组,在修复时将执行时记录的元组与当前事务修复过程的实时元组信息比较,如果当前读操作所读取的元组不同,则当前读操作重新执行,并且所有依赖当前读操作的操作也重新执行。
根据本发明提供的一种基于细粒度事务修复的分布式并发控制系统,包括:
模块M1:计算节点接收用户请求,并根据请求内容执行事务操作;
模块M2:根据执行事务操作的结果,计算节点本地提交,并将本地提交的事务入队;
模块M3:当计算节点本地事务队列塞满后,将队列中的所有事务打包成一个批处理事务,并向存储节点全局提交批处理事务;
如果批处理事务在全局提交过程中不能通过验证,则通过细粒度事务修复将批处理事务恢复到能够提交状态,继续提交批处理事务。
优选地,在所述模块M1中:
所述用户请求内容包括需要执行的事务逻辑以及对应的事务输入;事务逻辑被预先静态编译成一个数据流图,数据流图中的节点表示一个写操作或读操作;
被执行的事务操作中包括对数据的读操作和写操作:
读操作:参数为所读元组的键,执行时对所读的键申请本地共享锁,如果拿锁失败则回滚事务;锁成功申请后,从本地缓存中读取该元组;如果本地缓存未命中,则向存储该元组的存储节点发送读请求,并将读取结果写回本地缓存,将读取到的元组存入事务的读集合;所述读集合是记录了事务读操作读取元组的集合;
写操作:参数为需要写的元组的键值对,执行时对所写的键申请本地互斥锁,如果拿锁失败则回滚事务;锁成功申请后,将所写的键值对以及当前事务的标识符所组成的元组存入事务的写集合中;如果读操作和写操作由于锁冲突无法申请所需的锁,则当前事务需要被回滚,并释放所有已经申请的锁;所述写集合是记录了事务写操作写入元组的集合;
所述元组是存储数据的基本单元,其内容包括用于索引该元组的健,表示用户数据的值以及版本;元组的版本是最后一个修改该元组的事务标识符;事务的标识符是一个64位整形数字,每个事务拥有唯一的标识符。
优选地,在所述模块M2中:
模块M2.1:对于执行完成的事务,将该事务的写集合中的元组写入本地缓存;
模块M2.2:将该事务加入计算节点本地事务队列,释放该事务为其读集合与写集合中的所有元组申请的本地锁;
所述本地事务队列是每个计算节点维护一份的队列数据结构,元素是事务唯一的标识符。
优选地,在所述模块M3中:
模块M3.1:在计算节点本地事务队列中的事务达到阈值后,将所有事务合并成一个批处理事务,将所有事务的读写集合分别合并为批处理事务的读集合与写集合,并去重;
模块M3.2:计算节点向时间戳服务器发送时间戳获取请求,时间戳服务器根据时间戳获取请求,当前批处理事务访问的数据段,将对应数据段的当前时间戳单元组合为结果时间戳,并根据请求的数据段及对应访问类型更新数据段的时间戳单元,将结果时间戳返回给计算节点,当计算节点收到返回时间戳后,进入模块M3.3;
模块M3.3:计算节点向存有当前批处理事务读集合与写集合元组的相关存储节点发送准备提交请求;存储节点接收到准备提交请求后,根据对应批处理事务间的时间戳顺序,为批处理事务的读集合和写集合申请存储节点本地共享锁和互斥锁;
模块M3.4:存储节点对批处理事务的读集合进行验证,将收到的准备提交请求持久化,将验证结果返回对应计算节点;计算节点收集来自相关存储节点的验证结果返回;如果有存储节点验证失败,则进入模块M3.5;如果存储节点验证全部成功,进入模块M3.6;
模块M3.5:计算节点根据验证失败的存储节点返回的最新元组,开始细粒度修复当前批处理事务;在事务修复结束后,计算节点根据批处理事务被修复后的写集合更新本地缓存,进入模块M3.6;
模块M3.6:计算节点向存储节点发送提交请求,在存储节点收到提交请求后,如果对应的批处理被修复,则将请求中附带的修复后的写集合持久化,存储节点根据批处理事务的写集合更新本地存储,并将已申请的锁全部释放。
优选地,所述存储节点是一个逻辑的存储节点,由多个物理存储节点通过状态机备份的方式组成,每个物理存储节点初始状态相同,并按照相同顺序处理来自计算节点的请求;
所述准备提交请求包括批处理事务的读集合和写集合、时间戳、事务执行输入;
所述验证指将被验证批处理事务的读集合中的每一个元组和在存储节点本地的相同键的最新元组进行比较,比较两个元组的版本,如果版本相同则验证成功,否则验证失败,所述模块M3.4在验证失败时,存储节点记录验证失败的元组,并将存储节点本地的相同键的最新元组返回给计算节点;
所述提交确认请求的内容包括确认提交的批处理事务的标识符;每个批处理事务都会被分配一个唯一的标识符;
所述时间戳是一个向量时间戳,该向量的每个元素对应一个数据段的时间戳单元,所述时间戳单元是一对计数器seq和readers,seq计数器记录了该数据段被批处理事务修改的次数,readers计数器记录自当前数据段被最后一次修改后,读取该数据段的批处理事务的数量;
所述时间戳服务器是一个提供时间戳服务的服务器,存储了所有数据段对应的时间戳单元,时间戳服务器在处理来自同一个计算节点的时间戳获取请求时,保证按照对应批处理事务在计算节点本地事务队列中的顺序处理;时间戳服务器通过拿锁保护读取和更新数据段对应时间戳单元的原子性;在更新时间服务器中数据段的时间戳单元时,如果目标数据段被当前批处理事务修改,将时间戳单元的seq计数器加一,readers计数器清零;如果目标数据段被当前批处理事务读取,则将时间戳单元的readers计数器加一;
所述数据段是分配时间戳单元的基本单位,一个数据段包含一个或多个元组,每个节点保存数据段与对应元组的映射关系;一个批处理事务修改一个数据段,表示该批处理事务的写集合中存在对应数据段保护的元组;一个批处理事务读取一个数据段,表示该批处理事务的读集合中存在当前数据段保护的元组,并且该批处理事务不修改当前数据段;当一个批处理事务修改或读取了一个数据段时,称该批处理事务访问了对应数据段;所述时间戳获取请求包含该批处理事务所修改的数据段集合和所读取的数据段集合;
所述时间戳顺序是一个偏序关系;
所述细粒度修复指的是计算节点重新执行需要被重新执行的读操作或写操作,在修复批处理事务时,计算节点根据事务本地提交的顺序,依次修复每一个当前批处理事务中的事务;在修复事务时,计算节点根据拓扑顺序遍历对应事务逻辑的数据流图中的操作节点,对于一个读操作,计算节点在事务执行时记录该操作所读取元组,在修复时将执行时记录的元组与当前事务修复过程的实时元组信息比较,如果当前读操作所读取的元组不同,则当前读操作重新执行,并且所有依赖当前读操作的操作也重新执行。
与现有技术相比,本发明具有如下的有益效果:
1、本发明利用计算节点的本地缓存来减少事务执行期间读取存储节点数据操作带来的通信,从而降低了事务执行时延;
2、本发明利用批处理来减少事务提交期间的计算节点与存储节点间通信,从而均摊全局提交阶段的网络开销到一个批处理事务中的多个事务中,从而降低了单个事务的平均网络开销;
3、本发明对事务进行本地和远端的两阶段分层提交,首先用锁协调计算节点本地事务,然后用基于验证的方法协调来自不同计算节点的事务,使得本地事务间的冲突协调无需在远端存储节点上处理,避免了处理计算节点本地事务冲突的网络消息开销;
4、本发明允许本地提交的事务读未全局提交的事务的更新,提高了吞吐量。使得本地提交的事务会使其写操作对在同一节点上运行的其他事务可见,因此它们不用等待事务的全局提交,提高了系统的并行性;
5、本发明采用细粒度重新执行来修复过时或无效读取,而不是传统的回滚与重试全部事务。这些技术可以降低冲突的成本,使系统具有更好的可扩展性;
6、本发明采用了时间戳服务器确定事务全局提交顺序,避免了全局提交时不同事务在不同存储节点上处理顺序不一致的可能性;
7、本发明采用了偏序的时间戳设计,相比于所有事务使用全序的时间戳,能够让没有冲突的两个批处理事务的全局提交可以同时进行,提高了系统的并行性。
附图说明
通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:
图1为基于细粒度事务修复的分布式并发控制方法流程图。
具体实施方式
下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变化和改进。这些都属于本发明的保护范围。
实施例1:
本发明提供了一种基于细粒度事务修复的分布式并发控制方法及系统,主要针对负责事务处理的计算节点与负责数据存储的存储节点分离的存算分离架构分布式存储系统。通过使用近计算缓存,减少计算节点读取远端数据的时延开销;通过批处理为计算节点上的事务执行分布式提交,分摊分布式提交带来的通信开销;通过允许事务读取同一个计算节点上为完成提交的事务的更新,充分利用了计算节点的计算能力。与现有的工作相比,本发明的主要区别在于使用细粒度事务修复机制能够极大地减少缓存和批处理技术导致的分布式事务冲突增加、回滚开销增大的问题;采用分层的分布式提交,无需由远端存储节点负责处理计算节点内部的事务冲突,降低了事务冲突处理开销;使用专门的时间戳服务器确定事务的提交顺序,并采用偏序的时间戳提高了事务提交的并行性。
根据本发明提供的一种基于细粒度事务修复的分布式并发控制方法,如图1所示,包括:
步骤S1:计算节点接收用户请求,并根据请求内容执行事务操作;
具体地,在所述步骤S1中:
所述用户请求内容包括需要执行的事务逻辑以及对应的事务输入;事务逻辑被预先静态编译成一个数据流图,数据流图中的节点表示一个写操作或读操作;
被执行的事务操作中包括对数据的读操作和写操作:
读操作:参数为所读元组的键,执行时对所读的键申请本地共享锁,如果拿锁失败则回滚事务;锁成功申请后,从本地缓存中读取该元组;如果本地缓存未命中,则向存储该元组的存储节点发送读请求,并将读取结果写回本地缓存,将读取到的元组存入事务的读集合;所述读集合是记录了事务读操作读取元组的集合;
写操作:参数为需要写的元组的键值对,执行时对所写的键申请本地互斥锁,如果拿锁失败则回滚事务;锁成功申请后,将所写的键值对以及当前事务的标识符所组成的元组存入事务的写集合中;如果读操作和写操作由于锁冲突无法申请所需的锁,则当前事务需要被回滚,并释放所有已经申请的锁;所述写集合是记录了事务写操作写入元组的集合;
所述元组是存储数据的基本单元,其内容包括用于索引该元组的健,表示用户数据的值以及版本;元组的版本是最后一个修改该元组的事务标识符;事务的标识符是一个64位整形数字,每个事务拥有唯一的标识符。
步骤S2:根据执行事务操作的结果,计算节点本地提交,并将本地提交的事务入队;
具体地,在所述步骤S2中:
步骤S2.1:对于执行完成的事务,将该事务的写集合中的元组写入本地缓存;
步骤S2.2:将该事务加入计算节点本地事务队列,释放该事务为其读集合与写集合中的所有元组申请的本地锁;
所述本地事务队列是每个计算节点维护一份的队列数据结构,元素是事务唯一的标识符。
步骤S3:当计算节点本地事务队列塞满后,将队列中的所有事务打包成一个批处理事务,并向存储节点全局提交批处理事务;
如果批处理事务在全局提交过程中不能通过验证,则通过细粒度事务修复将批处理事务恢复到能够提交状态,继续提交批处理事务。
具体地,在所述步骤S3中:
步骤S3.1:在计算节点本地事务队列中的事务达到阈值后,将所有事务合并成一个批处理事务,将所有事务的读写集合分别合并为批处理事务的读集合与写集合,并去重;
步骤S3.2:计算节点向时间戳服务器发送时间戳获取请求,时间戳服务器根据时间戳获取请求,当前批处理事务访问的数据段,将对应数据段的当前时间戳单元组合为结果时间戳,并根据请求的数据段及对应访问类型更新数据段的时间戳单元,将结果时间戳返回给计算节点,当计算节点收到返回时间戳后,进入步骤S3.3;
步骤S3.3:计算节点向存有当前批处理事务读集合与写集合元组的相关存储节点发送准备提交请求;存储节点接收到准备提交请求后,根据对应批处理事务间的时间戳顺序,为批处理事务的读集合和写集合申请存储节点本地共享锁和互斥锁;
步骤S3.4:存储节点对批处理事务的读集合进行验证,将收到的准备提交请求持久化,将验证结果返回对应计算节点;计算节点收集来自相关存储节点的验证结果返回;如果有存储节点验证失败,则进入步骤S3.5;如果存储节点验证全部成功,进入步骤S3.6;
步骤S3.5:计算节点根据验证失败的存储节点返回的最新元组,开始细粒度修复当前批处理事务;在事务修复结束后,计算节点根据批处理事务被修复后的写集合更新本地缓存,进入步骤S3.6;
步骤S3.6:计算节点向存储节点发送提交请求,在存储节点收到提交请求后,如果对应的批处理被修复,则将请求中附带的修复后的写集合持久化,存储节点根据批处理事务的写集合更新本地存储,并将已申请的锁全部释放。
具体地,所述存储节点是一个逻辑的存储节点,由多个物理存储节点通过状态机备份的方式组成,每个物理存储节点初始状态相同,并按照相同顺序处理来自计算节点的请求;
所述准备提交请求包括批处理事务的读集合和写集合、时间戳、事务执行输入;
所述验证指将被验证批处理事务的读集合中的每一个元组和在存储节点本地的相同键的最新元组进行比较,比较两个元组的版本,如果版本相同则验证成功,否则验证失败,所述步骤S3.4在验证失败时,存储节点记录验证失败的元组,并将存储节点本地的相同键的最新元组返回给计算节点;
所述提交确认请求的内容包括确认提交的批处理事务的标识符;每个批处理事务都会被分配一个唯一的标识符;
所述时间戳是一个向量时间戳,该向量的每个元素对应一个数据段的时间戳单元,所述时间戳单元是一对计数器seq和readers,seq计数器记录了该数据段被批处理事务修改的次数,readers计数器记录自当前数据段被最后一次修改后,读取该数据段的批处理事务的数量;
所述时间戳服务器是一个提供时间戳服务的服务器,存储了所有数据段对应的时间戳单元,时间戳服务器在处理来自同一个计算节点的时间戳获取请求时,保证按照对应批处理事务在计算节点本地事务队列中的顺序处理;时间戳服务器通过拿锁保护读取和更新数据段对应时间戳单元的原子性;在更新时间服务器中数据段的时间戳单元时,如果目标数据段被当前批处理事务修改,将时间戳单元的seq计数器加一,readers计数器清零;如果目标数据段被当前批处理事务读取,则将时间戳单元的readers计数器加一;
所述数据段是分配时间戳单元的基本单位,一个数据段包含一个或多个元组,每个节点保存数据段与对应元组的映射关系;一个批处理事务修改一个数据段,表示该批处理事务的写集合中存在对应数据段保护的元组;一个批处理事务读取一个数据段,表示该批处理事务的读集合中存在当前数据段保护的元组,并且该批处理事务不修改当前数据段;当一个批处理事务修改或读取了一个数据段时,称该批处理事务访问了对应数据段;所述时间戳获取请求包含该批处理事务所修改的数据段集合和所读取的数据段集合;
所述时间戳顺序是一个偏序关系;
所述细粒度修复指的是计算节点重新执行需要被重新执行的读操作或写操作,在修复批处理事务时,计算节点根据事务本地提交的顺序,依次修复每一个当前批处理事务中的事务;在修复事务时,计算节点根据拓扑顺序遍历对应事务逻辑的数据流图中的操作节点,对于一个读操作,计算节点在事务执行时记录该操作所读取元组,在修复时将执行时记录的元组与当前事务修复过程的实时元组信息比较,如果当前读操作所读取的元组不同,则当前读操作重新执行,并且所有依赖当前读操作的操作也重新执行。
实施例2:
实施例2为实施例1的优选例,以更为具体地对本发明进行说明。
本发明还提供一种基于细粒度事务修复的分布式并发控制系统,所述基于细粒度事务修复的分布式并发控制系统可以通过执行所述基于细粒度事务修复的分布式并发控制方法的流程步骤予以实现,即本领域技术人员可以将所述基于细粒度事务修复的分布式并发控制方法理解为所述基于细粒度事务修复的分布式并发控制系统的优选实施方式。
根据本发明提供的一种基于细粒度事务修复的分布式并发控制系统,包括:
模块M1:计算节点接收用户请求,并根据请求内容执行事务操作;
具体地,在所述模块M1中:
所述用户请求内容包括需要执行的事务逻辑以及对应的事务输入;事务逻辑被预先静态编译成一个数据流图,数据流图中的节点表示一个写操作或读操作;
被执行的事务操作中包括对数据的读操作和写操作:
读操作:参数为所读元组的键,执行时对所读的键申请本地共享锁,如果拿锁失败则回滚事务;锁成功申请后,从本地缓存中读取该元组;如果本地缓存未命中,则向存储该元组的存储节点发送读请求,并将读取结果写回本地缓存,将读取到的元组存入事务的读集合;所述读集合是记录了事务读操作读取元组的集合;
写操作:参数为需要写的元组的键值对,执行时对所写的键申请本地互斥锁,如果拿锁失败则回滚事务;锁成功申请后,将所写的键值对以及当前事务的标识符所组成的元组存入事务的写集合中;如果读操作和写操作由于锁冲突无法申请所需的锁,则当前事务需要被回滚,并释放所有已经申请的锁;所述写集合是记录了事务写操作写入元组的集合;
所述元组是存储数据的基本单元,其内容包括用于索引该元组的健,表示用户数据的值以及版本;元组的版本是最后一个修改该元组的事务标识符;事务的标识符是一个64位整形数字,每个事务拥有唯一的标识符。
模块M2:根据执行事务操作的结果,计算节点本地提交,并将本地提交的事务入队;
具体地,在所述模块M2中:
模块M2.1:对于执行完成的事务,将该事务的写集合中的元组写入本地缓存;
模块M2.2:将该事务加入计算节点本地事务队列,释放该事务为其读集合与写集合中的所有元组申请的本地锁;
所述本地事务队列是每个计算节点维护一份的队列数据结构,元素是事务唯一的标识符。
模块M3:当计算节点本地事务队列塞满后,将队列中的所有事务打包成一个批处理事务,并向存储节点全局提交批处理事务;
如果批处理事务在全局提交过程中不能通过验证,则通过细粒度事务修复将批处理事务恢复到能够提交状态,继续提交批处理事务。
具体地,在所述模块M3中:
模块M3.1:在计算节点本地事务队列中的事务达到阈值后,将所有事务合并成一个批处理事务,将所有事务的读写集合分别合并为批处理事务的读集合与写集合,并去重;
模块M3.2:计算节点向时间戳服务器发送时间戳获取请求,时间戳服务器根据时间戳获取请求,当前批处理事务访问的数据段,将对应数据段的当前时间戳单元组合为结果时间戳,并根据请求的数据段及对应访问类型更新数据段的时间戳单元,将结果时间戳返回给计算节点,当计算节点收到返回时间戳后,进入模块M3.3;
模块M3.3:计算节点向存有当前批处理事务读集合与写集合元组的相关存储节点发送准备提交请求;存储节点接收到准备提交请求后,根据对应批处理事务间的时间戳顺序,为批处理事务的读集合和写集合申请存储节点本地共享锁和互斥锁;
模块M3.4:存储节点对批处理事务的读集合进行验证,将收到的准备提交请求持久化,将验证结果返回对应计算节点;计算节点收集来自相关存储节点的验证结果返回;如果有存储节点验证失败,则进入模块M3.5;如果存储节点验证全部成功,进入模块M3.6;
模块M3.5:计算节点根据验证失败的存储节点返回的最新元组,开始细粒度修复当前批处理事务;在事务修复结束后,计算节点根据批处理事务被修复后的写集合更新本地缓存,进入模块M3.6;
模块M3.6:计算节点向存储节点发送提交请求,在存储节点收到提交请求后,如果对应的批处理被修复,则将请求中附带的修复后的写集合持久化,存储节点根据批处理事务的写集合更新本地存储,并将已申请的锁全部释放。
具体地,所述存储节点是一个逻辑的存储节点,由多个物理存储节点通过状态机备份的方式组成,每个物理存储节点初始状态相同,并按照相同顺序处理来自计算节点的请求;
所述准备提交请求包括批处理事务的读集合和写集合、时间戳、事务执行输入;
所述验证指将被验证批处理事务的读集合中的每一个元组和在存储节点本地的相同键的最新元组进行比较,比较两个元组的版本,如果版本相同则验证成功,否则验证失败,所述模块M3.4在验证失败时,存储节点记录验证失败的元组,并将存储节点本地的相同键的最新元组返回给计算节点;
所述提交确认请求的内容包括确认提交的批处理事务的标识符;每个批处理事务都会被分配一个唯一的标识符;
所述时间戳是一个向量时间戳,该向量的每个元素对应一个数据段的时间戳单元,所述时间戳单元是一对计数器seq和readers,seq计数器记录了该数据段被批处理事务修改的次数,readers计数器记录自当前数据段被最后一次修改后,读取该数据段的批处理事务的数量;
所述时间戳服务器是一个提供时间戳服务的服务器,存储了所有数据段对应的时间戳单元,时间戳服务器在处理来自同一个计算节点的时间戳获取请求时,保证按照对应批处理事务在计算节点本地事务队列中的顺序处理;时间戳服务器通过拿锁保护读取和更新数据段对应时间戳单元的原子性;在更新时间服务器中数据段的时间戳单元时,如果目标数据段被当前批处理事务修改,将时间戳单元的seq计数器加一,readers计数器清零;如果目标数据段被当前批处理事务读取,则将时间戳单元的readers计数器加一;
所述数据段是分配时间戳单元的基本单位,一个数据段包含一个或多个元组,每个节点保存数据段与对应元组的映射关系;一个批处理事务修改一个数据段,表示该批处理事务的写集合中存在对应数据段保护的元组;一个批处理事务读取一个数据段,表示该批处理事务的读集合中存在当前数据段保护的元组,并且该批处理事务不修改当前数据段;当一个批处理事务修改或读取了一个数据段时,称该批处理事务访问了对应数据段;所述时间戳获取请求包含该批处理事务所修改的数据段集合和所读取的数据段集合;
所述时间戳顺序是一个偏序关系;
所述细粒度修复指的是计算节点重新执行需要被重新执行的读操作或写操作,在修复批处理事务时,计算节点根据事务本地提交的顺序,依次修复每一个当前批处理事务中的事务;在修复事务时,计算节点根据拓扑顺序遍历对应事务逻辑的数据流图中的操作节点,对于一个读操作,计算节点在事务执行时记录该操作所读取元组,在修复时将执行时记录的元组与当前事务修复过程的实时元组信息比较,如果当前读操作所读取的元组不同,则当前读操作重新执行,并且所有依赖当前读操作的操作也重新执行。
实施例3:
实施例3为实施例1的优选例,以更为具体地对本发明进行说明。
根据本发明提供的基于细粒度事务修复的分布式并发控制方法包括:
步骤S1:计算节点接收用户请求,并根据请求内容执行事务操作。
步骤S2:根据事务执行结果,进行计算节点本地提交,并将本地提交的事务入队。
步骤S3:当计算节点本地事务队列塞满后,将队列中的所有事务打包成一个批处理事务,并向存储节点全局提交该批处理事务。如果事务在全局提交过程中不能通过验证,则通过细粒度事务修复将事务恢复到可提交状态,进而继续提交事务。
所述存储节点实际上是一个逻辑的存储节点,由多个物理存储节点通过状态机备份的方式组成,每个物理存储节点初始状态相同,并按照相同顺序确定性地处理来自计算节点的请求,进而达到相同地数据状态,起到备份容错的效果。
所述用户请求内容包括需要执行的事务逻辑以及对应的事务输入。事务逻辑会被预先静态编译成一个数据流图,数据流图中的节点是表示一个写操作或读操作。如果操作1的输入是操作2的输出,则在数据流图中会有一条由操作2指向操作1的有向边。在数据流图中,如果有一条路径从操作1流向操作2,则称操作2依赖操作1。
优选地,所述步骤S1中被执行的事务操作中可能包括对数据的读操作和写操作。读操作:参数为所读元组的键,执行时首先对所读的键申请本地共享锁,如果拿锁失败则回滚事务。如果锁成功申请后,尝试从本地缓存中读取该元组。如果本地缓存未命中,则向存储该元组的存储节点发送读请求,并将读取结果写回本地缓存。最后,将读取到的元组存入事务的读集合。写操作:参数为需要写的元组的键值对,执行时首先对所写的键申请本地互斥锁,如果拿锁失败则回滚事务。锁成功申请后,将所写的键值对以及当前事务的标识符所组成的元组存入事务的写集合中。如果读操作和写操作由于锁冲突无法申请所需的锁,则当前事务需要被回滚,并释放所有已经申请的锁。
所述元组(Tuple)是本次发明存储数据的基本单元,其内容包括用于索引该元组的健,表示用户数据的值,以及版本。元组的版本是最后一个修改该元组的事务标识符。事务的标识符是一个64位整形数字,该系统中每个事务拥有唯一的标识符。所述读集合是记录了事务读操作读取元组的集合。所述写集合是记录了事务写操作写入元组的集合。
优选地,所述步骤S2采用:
步骤S2.1:对于执行完成的事务,将该事务的写集合中的元组写入本地缓存。
步骤S2.2:将该事务加入计算节点本地事务队列,然后释放该事务为其读集合与写集合中的所有元组申请的本地锁。
所述本地事务队列是每个计算节点维护一份的队列数据结构,元素是事务唯一的标识符,用来确定本地事务的本地提交顺序。
优选地,所述步骤S3采用:
步骤S3.1:在计算节点本地事务队列中的事务达到阈值后,将所有事务合并成一个批处理事务,将所有事务的读写集合分别合并为批处理事务的读集合与写集合,并去重。
步骤S3.2:计算节点向时间戳服务器发送时间戳获取请求。时间戳服务器根据时间戳获取请求中,当前批处理事务访问的数据段,将对应数据段的当前时间戳单元组合为结果时间戳,并根据请求的数据段及对应访问类型更新数据段的时间戳单元,最后将结果时间戳返回给计算节点。当计算节点收到返回时间戳后,进入步骤S3.3。
步骤S3.3:计算节点向存有当前批处理事务读集合与写集合元组的相关存储节点发送准备提交请求。存储节点接收到准备提交请求后,根据对应批处理事务间的时间戳顺序,为批处理事务的读集合和写集合申请存储节点本地共享锁和互斥锁。
步骤S3.4:存储节点对批处理事务的读集合进行验证,将收到的准备提交请求持久化,然后将验证结果返回对应计算节点。计算节点收集来自相关存储节点的验证结果返回。如果有存储节点验证失败,则进入步骤S3.5。否则,进入步骤S3.6。
步骤S3.5:计算节点根据验证失败的存储节点返回的最新元组,开始细粒度修复当前批处理事务。在事务修复结束后,计算节点根据批处理事务被修复后的写集合更新本地缓存,进入步骤S3.6。
步骤S3.6:计算节点向存储节点发送提交请求。在存储节点收到提交请求后,如果对应的批处理被修复,则将请求中附带的修复后的写集合持久化。随后,存储节点根据批处理事务的写集合更新本地存储,并将已申请的锁全部释放。
所述准备提交请求包括批处理事务的读集合和写集合、时间戳、事务执行输入。
所述验证具体指将被验证批处理事务的读集合中的每一个元组和在存储节点本地的相同键的最新元组进行比较。具体比较两个元组的版本,如果版本相同则验证成功,否则验证失败。所述步骤S3.4在验证失败时,存储节点会记录验证失败的元组,并将存储节点本地的相同键的最新元组返回给计算节点。
所述提交确认请求的内容包括确认提交的批处理事务的标识符。每个批处理事务都会被分配一个唯一的标识符。
优选地,所述时间戳(TS,TimeStamp)是一个向量时间戳,该向量的每个元素对应一个数据段的时间戳单元(TSU,TimeStamp Unit)。所述时间戳单元是一对计数器<seq,readers>,seq计数器记录了该数据段被批处理事务修改的次数,readers计数器记录了自当前数据段被最后一次修改后,读取该数据段的批处理事务的数量。所述时间戳服务器是一个提供时间戳服务的服务器,存储了所有数据段对应的时间戳单元。时间戳服务器在处理来自同一个计算节点的时间戳获取请求时,保证按照对应批处理事务在计算节点本地事务队列中的顺序处理。时间戳服务器通过拿锁保护读取和更新数据段对应时间戳单元的原子性。在更新时间服务器中数据段的时间戳单元时,如果目标数据段被当前批处理事务修改,则将时间戳单元的seq计数器加一,readers计数器清零;如果目标数据段被当前批处理事务读取,则将时间戳单元的readers计数器加一。
所述数据段是分配时间戳单元的基本单位,一个数据段包含若干元组,每个节点会保存数据段与对应元组的映射关系。一个批处理事务修改一个数据段,表示该批处理事务的写集合中存在对应数据段保护的元组。一个批处理事务读取一个数据段,表示该批处理事务的读集合中存在当前数据段保护的元组,并且该批处理事务不修改当前数据段。当一个批处理事务修改或读取了一个数据段时,则称该批处理事务访问了对应数据段。所述时间戳获取请求包含该批处理事务所修改的数据段集合和所读取的数据段集合。
所述时间戳顺序是一个偏序关系。对于两个时间戳TS1和TS2,TS1先于TS2,当且仅当TS1和TS2访问了任意相同数据段,并且TS1在共同数据段上的时间戳单元先于TS1在共同数据段上的时间戳单元。在两种情况下,时间戳单元TSU1<seq1,readers1>先于时间戳单元TSU2<seq2,readers2>。第一种情况是TSU2对应的数据段被当前批处理事务读取,即当seq1<seq2||(seq1==seq2/\readers1==0)时,TSU1先于TSU2;第二种情况是TSU2对应的数据段被当前批处理事务更新,即当seq1<seq2||(seq1==seq2/\readers1<readers2)时,TSU1先于TSU2。
优选地,所述细粒度修复指的是计算节点有选择地重新执行需要被重新执行的读操作或写操作。在修复批处理事务时,计算节点会根据事务本地提交的顺序,依次修复每一个当前批处理事务中的事务。在修复事务时,计算节点会根据拓扑顺序遍历对应事务逻辑的数据流图中的操作节点。对于一个读操作,计算节点在事务执行时会记录该操作所读取元组,在修复时会将执行时记录的元组与当前事务修复过程的实时元组信息比较,如果当前读操作所读取的元组不同,则当前读操作需要重新执行,并且所有依赖当前读操作的操作也需要重新执行。
实施例4:
实施例4为实施例1的优选例,以更为具体地对本发明进行说明。
根据本发明提供的一种基于细粒度事务修复的分布式并发控制方法,如图1所示,包括:
本地执行步骤:计算节点接收用户请求,并根据请求内容执行事务操作。进入本地提交步骤。
本地更新步骤:对于执行完成的事务,将该事务的写集合中的元组写入本地缓存。进入本地放锁步骤。
本地放锁步骤:将该事务加入计算节点本地事务队列,然后释放该事务为其读集合与写集合中的所有元组申请的本地锁。进入全局提交步骤。
事务合并步骤:在计算节点本地事务队列中的事务达到阈值后,将所有事务合并成一个批处理事务,将所有事务的读写集合分别合并为批处理事务的读集合与写集合,并去重。进入时间戳获取步骤。
时间戳获取步骤:计算节点向时间戳服务器发送时间戳获取请求。时间戳服务器根据时间戳获取请求中,当前批处理事务访问的数据段,将对应数据段的当前时间戳单元组合为结果时间戳,并根据请求的数据段及对应访问类型更新数据段的时间戳单元,最后将结果时间戳返回给计算节点。当计算节点收到返回时间戳后,进入锁申请步骤。
锁申请步骤:计算节点向存有当前批处理事务读集合与写集合元组的相关存储节点发送准备提交请求。存储节点接收到准备提交请求后,根据对应批处理事务间的时间戳顺序,为批处理事务的读集合和写集合申请存储节点本地共享锁和互斥锁。进入验证步骤。
验证步骤:存储节点对批处理事务的读集合进行验证,将收到的准备提交请求持久化,然后将验证结果返回对应计算节点。计算节点收集来自相关存储节点的验证结果返回。如果有存储节点验证失败,则进入事务修复步骤。否则,进入全局提交步骤。
事务修复步骤:计算节点根据验证失败的存储节点返回的最新元组,开始细粒度修复当前批处理事务。在事务修复结束后,计算节点根据批处理事务被修复后的写集合更新本地缓存,进入全局提交步骤。
全局提交步骤:计算节点向存储节点发送提交请求。在存储节点收到提交请求后,如果对应的批处理被修复,则将请求中附带的修复后的写集合持久化。随后,存储节点根据批处理事务的写集合更新本地存储,并将已申请的锁全部释放。
所述存储节点实际上是一个逻辑的存储节点,由多个物理存储节点通过状态机备份的方式组成,每个物理存储节点初始状态相同,并按照相同顺序确定性地处理来自计算节点的请求,进而达到相同地数据状态,起到备份容错的效果。
所述用户请求内容包括需要执行的事务逻辑以及对应的事务输入。事务逻辑会被预先静态编译成一个数据流图,数据流图中的节点是表示一个写操作或读操作。如果操作1的输入是操作2的输出,则在数据流图中会有一条由操作2指向操作1的有向边。在数据流图中,如果有一条路径从操作1流向操作2,则称操作2依赖操作1。
具体地,所述本地执行步骤中被执行的事务操作中可能包括对数据的读操作和写操作。读操作:参数为所读元组的键,执行时首先对所读的键申请本地共享锁,如果拿锁失败则回滚事务。如果锁成功申请后,尝试从本地缓存中读取该元组。如果本地缓存未命中,则向存储该元组的存储节点发送读请求,并将读取结果写回本地缓存。最后,将读取到的元组存入事务的读集合。写操作:参数为需要写的元组的键值对,执行时首先对所写的键申请本地互斥锁,如果拿锁失败则回滚事务。锁成功申请后,将所写的键值对以及当前事务的标识符所组成的元组存入事务的写集合中。如果读操作和写操作由于锁冲突无法申请所需的锁,则当前事务需要被回滚,并释放所有已经申请的锁。
所述元组(tuple)是本次发明存储数据的基本单元,其内容包括用于索引该元组的健,表示用户数据的值,以及版本。元组的版本是最后一个修改该元组的事务标识符。事务的标识符是一个64位整形数字,该系统中每个事务拥有唯一的标识符。所述读集合是记录了事务读操作读取元组的集合。所述写集合是记录了事务写操作写入元组的集合。
所述本地事务队列是每个计算节点维护一份的队列数据结构,元素是事务唯一的标识符,用来确定本地事务的本地提交顺序。
所述准备提交请求包括批处理事务的读集合和写集合、时间戳、事务执行输入。
所述验证具体指将被验证批处理事务的读集合中的每一个元组和在存储节点本地的相同键的最新元组进行比较。具体比较两个元组的版本,如果版本相同则验证成功,否则验证失败。所述验证步骤在验证失败时,存储节点会记录验证失败的元组,并将存储节点本地的相同键的最新元组返回给计算节点。
所述提交确认请求的内容包括确认提交的批处理事务的标识符。每个批处理事务都会被分配一个唯一的标识符。
具体地,所述时间戳(TS,TimeStamp)是一个向量时间戳,该向量的每个元素对应一个数据段的时间戳单元(TSU,TimeStamp Unit)。所述时间戳单元是一对计数器<seq,readers>,seq计数器记录了该数据段被批处理事务修改的次数,readers计数器记录了自当前数据段被最后一次修改后,读取该数据段的批处理事务的数量。所述时间戳服务器是一个提供时间戳服务的服务器,存储了所有数据段对应的时间戳单元。时间戳服务器在处理来自同一个计算节点的时间戳获取请求时,保证按照对应批处理事务在计算节点本地事务队列中的顺序处理。时间戳服务器通过拿锁保护读取和更新数据段对应时间戳单元的原子性。在更新时间服务器中数据段的时间戳单元时,如果目标数据段被当前批处理事务修改,则将时间戳单元的seq计数器加一,readers计数器清零;如果目标数据段被当前批处理事务读取,则将时间戳单元的readers计数器加一。
所述数据段是分配时间戳单元的基本单位,一个数据段包含若干元组,每个节点会保存数据段与对应元组的映射关系。一个批处理事务修改一个数据段,表示该批处理事务的写集合中存在对应数据段保护的元组。一个批处理事务读取一个数据段,表示该批处理事务的读集合中存在当前数据段保护的元组,并且该批处理事务不修改当前数据段。当一个批处理事务修改或读取了一个数据段时,则称该批处理事务访问了对应数据段。所述时间戳获取请求包含该批处理事务所修改的数据段集合和所读取的数据段集合。
所述时间戳顺序是一个偏序关系。对于两个时间戳TS1和TS2,TS1先于TS2,当且仅当TS1和TS2访问了任意相同数据段,并且TS1在共同数据段上的时间戳单元先于TS1在共同数据段上的时间戳单元。在两种情况下,时间戳单元TSU1<seq1,readers1>先于时间戳单元TSU2<seq2,readers2>。第一种情况是TSU2对应的数据段被当前批处理事务读取,即当seq1<seq2||(seq1==seq2/\readers1==0)时,TSU1先于TSU2;第二种情况是TSU2对应的数据段被当前批处理事务更新,即当seq1<seq2||(seq1==seq2/\readers1<readers2)时,TSU1先于TSU2。
具体地,所述细粒度修复指的是计算节点有选择地重新执行需要被重新执行的读操作或写操作。在修复批处理事务时,计算节点会根据事务本地提交的顺序,依次修复每一个当前批处理事务中的事务。在修复事务时,计算节点会根据拓扑顺序遍历对应事务逻辑的数据流图中的操作节点。对于一个读操作,计算节点在事务执行时会记录该操作所读取元组,在修复时会将执行时记录的元组与当前事务修复过程的实时元组信息比较,如果当前读操作所读取的元组不同,则当前读操作需要重新执行,并且所有依赖当前读操作的操作也需要重新执行。在上述细粒度修复过程中,如果事务读写了不在原本的读集合或写集合中存在的元祖,则当前被修复事务必须被回滚,其写集合被清空。
本领域技术人员知道,除了以纯计算机可读程序代码方式实现本发明提供的系统、装置及其各个模块以外,完全可以通过将方法步骤进行逻辑编程来使得本发明提供的系统、装置及其各个模块以逻辑门、开关、专用集成电路、可编程逻辑控制器以及嵌入式微控制器等的形式来实现相同程序。所以,本发明提供的系统、装置及其各个模块可以被认为是一种硬件部件,而对其内包括的用于实现各种程序的模块也可以视为硬件部件内的结构;也可以将用于实现各种功能的模块视为既可以是实现方法的软件程序又可以是硬件部件内的结构。
以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在权利要求的范围内做出各种变化或修改,这并不影响本发明的实质内容。在不冲突的情况下,本申请的实施例和实施例中的特征可以任意相互组合。

Claims (10)

1.一种基于细粒度事务修复的分布式并发控制方法,其特征在于,包括:
步骤S1:计算节点接收用户请求,并根据请求内容执行事务操作;
步骤S2:根据执行事务操作的结果,计算节点本地提交,并将本地提交的事务入队;
步骤S3:当计算节点本地事务队列塞满后,将队列中的所有事务打包成一个批处理事务,并向存储节点全局提交批处理事务;
如果批处理事务在全局提交过程中不能通过验证,则通过细粒度事务修复将批处理事务恢复到能够提交状态,继续提交批处理事务。
2.根据权利要求1所述的基于细粒度事务修复的分布式并发控制方法,其特征在于,在所述步骤S1中:
所述用户请求内容包括需要执行的事务逻辑以及对应的事务输入;事务逻辑被预先静态编译成一个数据流图,数据流图中的节点表示一个写操作或读操作;
被执行的事务操作中包括对数据的读操作和写操作:
读操作:参数为所读元组的键,执行时对所读的键申请本地共享锁,如果拿锁失败则回滚事务;锁成功申请后,从本地缓存中读取该元组;如果本地缓存未命中,则向存储该元组的存储节点发送读请求,并将读取结果写回本地缓存,将读取到的元组存入事务的读集合;所述读集合是记录了事务读操作读取元组的集合;
写操作:参数为需要写的元组的键值对,执行时对所写的键申请本地互斥锁,如果拿锁失败则回滚事务;锁成功申请后,将所写的键值对以及当前事务的标识符所组成的元组存入事务的写集合中;如果读操作和写操作由于锁冲突无法申请所需的锁,则当前事务需要被回滚,并释放所有已经申请的锁;所述写集合是记录了事务写操作写入元组的集合;
所述元组是存储数据的基本单元,其内容包括用于索引该元组的健,表示用户数据的值以及版本;元组的版本是最后一个修改该元组的事务标识符;事务的标识符是一个64位整形数字,每个事务拥有唯一的标识符。
3.根据权利要求1所述的基于细粒度事务修复的分布式并发控制方法,其特征在于,在所述步骤S2中:
步骤S2.1:对于执行完成的事务,将该事务的写集合中的元组写入本地缓存;
步骤S2.2:将该事务加入计算节点本地事务队列,释放该事务为其读集合与写集合中的所有元组申请的本地锁;
所述本地事务队列是每个计算节点维护一份的队列数据结构,元素是事务唯一的标识符。
4.根据权利要求1所述的基于细粒度事务修复的分布式并发控制方法,其特征在于,在所述步骤S3中:
步骤S3.1:在计算节点本地事务队列中的事务达到阈值后,将所有事务合并成一个批处理事务,将所有事务的读写集合分别合并为批处理事务的读集合与写集合,并去重;
步骤S3.2:计算节点向时间戳服务器发送时间戳获取请求,时间戳服务器根据时间戳获取请求,当前批处理事务访问的数据段,将对应数据段的当前时间戳单元组合为结果时间戳,并根据请求的数据段及对应访问类型更新数据段的时间戳单元,将结果时间戳返回给计算节点,当计算节点收到返回时间戳后,进入步骤S3.3;
步骤S3.3:计算节点向存有当前批处理事务读集合与写集合元组的相关存储节点发送准备提交请求;存储节点接收到准备提交请求后,根据对应批处理事务间的时间戳顺序,为批处理事务的读集合和写集合申请存储节点本地共享锁和互斥锁;
步骤S3.4:存储节点对批处理事务的读集合进行验证,将收到的准备提交请求持久化,将验证结果返回对应计算节点;计算节点收集来自相关存储节点的验证结果返回;如果有存储节点验证失败,则进入步骤S3.5;如果存储节点验证全部成功,进入步骤S3.6;
步骤S3.5:计算节点根据验证失败的存储节点返回的最新元组,开始细粒度修复当前批处理事务;在事务修复结束后,计算节点根据批处理事务被修复后的写集合更新本地缓存,进入步骤S3.6;
步骤S3.6:计算节点向存储节点发送提交请求,在存储节点收到提交请求后,如果对应的批处理被修复,则将请求中附带的修复后的写集合持久化,存储节点根据批处理事务的写集合更新本地存储,并将已申请的锁全部释放。
5.根据权利要求4所述的基于细粒度事务修复的分布式并发控制方法,其特征在于:
所述存储节点是一个逻辑的存储节点,由多个物理存储节点通过状态机备份的方式组成,每个物理存储节点初始状态相同,并按照相同顺序处理来自计算节点的请求;
所述准备提交请求包括批处理事务的读集合和写集合、时间戳、事务执行输入;
所述验证指将被验证批处理事务的读集合中的每一个元组和在存储节点本地的相同键的最新元组进行比较,比较两个元组的版本,如果版本相同则验证成功,否则验证失败,所述步骤S3.4在验证失败时,存储节点记录验证失败的元组,并将存储节点本地的相同键的最新元组返回给计算节点;
所述提交确认请求的内容包括确认提交的批处理事务的标识符;每个批处理事务都会被分配一个唯一的标识符。
所述时间戳是一个向量时间戳,该向量的每个元素对应一个数据段的时间戳单元,所述时间戳单元是一对计数器seq和readers,seq计数器记录了该数据段被批处理事务修改的次数,readers计数器记录自当前数据段被最后一次修改后,读取该数据段的批处理事务的数量;
所述时间戳服务器是一个提供时间戳服务的服务器,存储了所有数据段对应的时间戳单元,时间戳服务器在处理来自同一个计算节点的时间戳获取请求时,保证按照对应批处理事务在计算节点本地事务队列中的顺序处理;时间戳服务器通过拿锁保护读取和更新数据段对应时间戳单元的原子性;在更新时间服务器中数据段的时间戳单元时,如果目标数据段被当前批处理事务修改,将时间戳单元的seq计数器加一,readers计数器清零;如果目标数据段被当前批处理事务读取,则将时间戳单元的readers计数器加一;
所述数据段是分配时间戳单元的基本单位,一个数据段包含一个或多个元组,每个节点保存数据段与对应元组的映射关系;一个批处理事务修改一个数据段,表示该批处理事务的写集合中存在对应数据段保护的元组;一个批处理事务读取一个数据段,表示该批处理事务的读集合中存在当前数据段保护的元组,并且该批处理事务不修改当前数据段;当一个批处理事务修改或读取了一个数据段时,称该批处理事务访问了对应数据段;所述时间戳获取请求包含该批处理事务所修改的数据段集合和所读取的数据段集合;
所述时间戳顺序是一个偏序关系;
所述细粒度修复指的是计算节点重新执行需要被重新执行的读操作或写操作,在修复批处理事务时,计算节点根据事务本地提交的顺序,依次修复每一个当前批处理事务中的事务;在修复事务时,计算节点根据拓扑顺序遍历对应事务逻辑的数据流图中的操作节点,对于一个读操作,计算节点在事务执行时记录该操作所读取元组,在修复时将执行时记录的元组与当前事务修复过程的实时元组信息比较,如果当前读操作所读取的元组不同,则当前读操作重新执行,并且所有依赖当前读操作的操作也重新执行。
6.一种基于细粒度事务修复的分布式并发控制系统,其特征在于,包括:
模块M1:计算节点接收用户请求,并根据请求内容执行事务操作;
模块M2:根据执行事务操作的结果,计算节点本地提交,并将本地提交的事务入队;
模块M3:当计算节点本地事务队列塞满后,将队列中的所有事务打包成一个批处理事务,并向存储节点全局提交批处理事务;
如果批处理事务在全局提交过程中不能通过验证,则通过细粒度事务修复将批处理事务恢复到能够提交状态,继续提交批处理事务。
7.根据权利要求6所述的基于细粒度事务修复的分布式并发控制系统,其特征在于,在所述模块M1中:
所述用户请求内容包括需要执行的事务逻辑以及对应的事务输入;事务逻辑被预先静态编译成一个数据流图,数据流图中的节点表示一个写操作或读操作;
被执行的事务操作中包括对数据的读操作和写操作:
读操作:参数为所读元组的键,执行时对所读的键申请本地共享锁,如果拿锁失败则回滚事务;锁成功申请后,从本地缓存中读取该元组;如果本地缓存未命中,则向存储该元组的存储节点发送读请求,并将读取结果写回本地缓存,将读取到的元组存入事务的读集合;所述读集合是记录了事务读操作读取元组的集合;
写操作:参数为需要写的元组的键值对,执行时对所写的键申请本地互斥锁,如果拿锁失败则回滚事务;锁成功申请后,将所写的键值对以及当前事务的标识符所组成的元组存入事务的写集合中;如果读操作和写操作由于锁冲突无法申请所需的锁,则当前事务需要被回滚,并释放所有已经申请的锁;所述写集合是记录了事务写操作写入元组的集合;
所述元组是存储数据的基本单元,其内容包括用于索引该元组的健,表示用户数据的值以及版本;元组的版本是最后一个修改该元组的事务标识符;事务的标识符是一个64位整形数字,每个事务拥有唯一的标识符。
8.根据权利要求6所述的基于细粒度事务修复的分布式并发控制系统,其特征在于,在所述模块M2中:
模块M2.1:对于执行完成的事务,将该事务的写集合中的元组写入本地缓存;
模块M2.2:将该事务加入计算节点本地事务队列,释放该事务为其读集合与写集合中的所有元组申请的本地锁;
所述本地事务队列是每个计算节点维护一份的队列数据结构,元素是事务唯一的标识符。
9.根据权利要求6所述的基于细粒度事务修复的分布式并发控制系统,其特征在于,在所述模块M3中:
模块M3.1:在计算节点本地事务队列中的事务达到阈值后,将所有事务合并成一个批处理事务,将所有事务的读写集合分别合并为批处理事务的读集合与写集合,并去重;
模块M3.2:计算节点向时间戳服务器发送时间戳获取请求,时间戳服务器根据时间戳获取请求,当前批处理事务访问的数据段,将对应数据段的当前时间戳单元组合为结果时间戳,并根据请求的数据段及对应访问类型更新数据段的时间戳单元,将结果时间戳返回给计算节点,当计算节点收到返回时间戳后,进入模块M3.3;
模块M3.3:计算节点向存有当前批处理事务读集合与写集合元组的相关存储节点发送准备提交请求;存储节点接收到准备提交请求后,根据对应批处理事务间的时间戳顺序,为批处理事务的读集合和写集合申请存储节点本地共享锁和互斥锁;
模块M3.4:存储节点对批处理事务的读集合进行验证,将收到的准备提交请求持久化,将验证结果返回对应计算节点;计算节点收集来自相关存储节点的验证结果返回;如果有存储节点验证失败,则进入模块M3.5;如果存储节点验证全部成功,进入模块M3.6;
模块M3.5:计算节点根据验证失败的存储节点返回的最新元组,开始细粒度修复当前批处理事务;在事务修复结束后,计算节点根据批处理事务被修复后的写集合更新本地缓存,进入模块M3.6;
模块M3.6:计算节点向存储节点发送提交请求,在存储节点收到提交请求后,如果对应的批处理被修复,则将请求中附带的修复后的写集合持久化,存储节点根据批处理事务的写集合更新本地存储,并将已申请的锁全部释放。
10.根据权利要求9所述的基于细粒度事务修复的分布式并发控制系统,其特征在于:
所述存储节点是一个逻辑的存储节点,由多个物理存储节点通过状态机备份的方式组成,每个物理存储节点初始状态相同,并按照相同顺序处理来自计算节点的请求;
所述准备提交请求包括批处理事务的读集合和写集合、时间戳、事务执行输入;
所述验证指将被验证批处理事务的读集合中的每一个元组和在存储节点本地的相同键的最新元组进行比较,比较两个元组的版本,如果版本相同则验证成功,否则验证失败,所述模块M3.4在验证失败时,存储节点记录验证失败的元组,并将存储节点本地的相同键的最新元组返回给计算节点;
所述提交确认请求的内容包括确认提交的批处理事务的标识符;每个批处理事务都会被分配一个唯一的标识符;
所述时间戳是一个向量时间戳,该向量的每个元素对应一个数据段的时间戳单元,所述时间戳单元是一对计数器seq和readers,seq计数器记录了该数据段被批处理事务修改的次数,readers计数器记录自当前数据段被最后一次修改后,读取该数据段的批处理事务的数量;
所述时间戳服务器是一个提供时间戳服务的服务器,存储了所有数据段对应的时间戳单元,时间戳服务器在处理来自同一个计算节点的时间戳获取请求时,保证按照对应批处理事务在计算节点本地事务队列中的顺序处理;时间戳服务器通过拿锁保护读取和更新数据段对应时间戳单元的原子性;在更新时间服务器中数据段的时间戳单元时,如果目标数据段被当前批处理事务修改,将时间戳单元的seq计数器加一,readers计数器清零;如果目标数据段被当前批处理事务读取,则将时间戳单元的readers计数器加一;
所述数据段是分配时间戳单元的基本单位,一个数据段包含一个或多个元组,每个节点保存数据段与对应元组的映射关系;一个批处理事务修改一个数据段,表示该批处理事务的写集合中存在对应数据段保护的元组;一个批处理事务读取一个数据段,表示该批处理事务的读集合中存在当前数据段保护的元组,并且该批处理事务不修改当前数据段;当一个批处理事务修改或读取了一个数据段时,称该批处理事务访问了对应数据段;所述时间戳获取请求包含该批处理事务所修改的数据段集合和所读取的数据段集合;
所述时间戳顺序是一个偏序关系;
所述细粒度修复指的是计算节点重新执行需要被重新执行的读操作或写操作,在修复批处理事务时,计算节点根据事务本地提交的顺序,依次修复每一个当前批处理事务中的事务;在修复事务时,计算节点根据拓扑顺序遍历对应事务逻辑的数据流图中的操作节点,对于一个读操作,计算节点在事务执行时记录该操作所读取元组,在修复时将执行时记录的元组与当前事务修复过程的实时元组信息比较,如果当前读操作所读取的元组不同,则当前读操作重新执行,并且所有依赖当前读操作的操作也重新执行。
CN202310465852.7A 2023-04-26 2023-04-26 基于细粒度事务修复的分布式并发控制方法及系统 Pending CN116339931A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310465852.7A CN116339931A (zh) 2023-04-26 2023-04-26 基于细粒度事务修复的分布式并发控制方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310465852.7A CN116339931A (zh) 2023-04-26 2023-04-26 基于细粒度事务修复的分布式并发控制方法及系统

Publications (1)

Publication Number Publication Date
CN116339931A true CN116339931A (zh) 2023-06-27

Family

ID=86887865

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310465852.7A Pending CN116339931A (zh) 2023-04-26 2023-04-26 基于细粒度事务修复的分布式并发控制方法及系统

Country Status (1)

Country Link
CN (1) CN116339931A (zh)

Similar Documents

Publication Publication Date Title
US10261869B2 (en) Transaction processing using torn write detection
CN109739935B (zh) 数据读取方法、装置、电子设备以及存储介质
US9021303B1 (en) Multi-threaded in-memory processing of a transaction log for concurrent access to data during log replay
US6981004B2 (en) Method and mechanism for implementing in-memory transaction logging records
JP5660693B2 (ja) ハイブリッドoltp及びolap高性能データベースシステム
US6976022B2 (en) Method and mechanism for batch processing transaction logging records
US8429134B2 (en) Distributed database recovery
CN103077222B (zh) 机群文件系统分布式元数据一致性保证方法及系统
KR101923334B1 (ko) 데이터베이스 엔진 및 개별 분산 저장 서비스를 갖는 데이터베이스 시스템
US5778388A (en) Method of processing a synchronization point in a database management system to assure a database version using update logs from accumulated transactions
CN102831156B (zh) 一种云计算平台上的分布式事务处理方法
CN110196856B (zh) 一种分布式数据读取方法及装置
US20110082832A1 (en) Parallelized backup and restore process and system
US9652492B2 (en) Out-of-order execution of strictly-ordered transactional workloads
US20180276234A1 (en) Distributed transaction conflict resolution
US20220276990A1 (en) Light weight redundancy tool for performing transactions
CN113821382B (zh) 一种实时数据库数据处理方法、系统和设备
WO2020040958A1 (en) Providing consistent database recovery after database failure for distributed databases with non-durable storage leveraging background synchronization point
CN113220490A (zh) 异步写回持久化内存的事务持久化方法及系统
EP0724223A1 (en) Remote duplicate database facility with database replication support for online line DDL operations
CN112559496A (zh) 一种分布式数据库事务原子性实现方法及装置
JPH10289217A (ja) ログ・ストリーム管理システム
Palmieri et al. Transaction execution models in partially replicated transactional memory: the case for data-flow and control-flow
CN116339931A (zh) 基于细粒度事务修复的分布式并发控制方法及系统
JPH10289141A (ja) マルチシステム環境のログ・ストリームを管理する方法

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