CN107766478A - 一种面向高竞争情景的并发索引结构的设计方法 - Google Patents
一种面向高竞争情景的并发索引结构的设计方法 Download PDFInfo
- Publication number
- CN107766478A CN107766478A CN201710942890.1A CN201710942890A CN107766478A CN 107766478 A CN107766478 A CN 107766478A CN 201710942890 A CN201710942890 A CN 201710942890A CN 107766478 A CN107766478 A CN 107766478A
- Authority
- CN
- China
- Prior art keywords
- request
- terminal node
- node
- conflict
- concurrent
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2453—Query optimisation
- G06F16/24532—Query optimisation of parallel queries
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2228—Indexing structures
- G06F16/2272—Management thereof
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
- G06F16/2365—Ensuring data consistency and integrity
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Software Systems (AREA)
- Computer Security & Cryptography (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明属于大数据技术领域,具体为基于硬件事务内存的面向高竞争情景的并发索引结构设计方法。本发明按照数据冲突的概率将访问索引结构的过程划分为索引阶段和操作阶段,从而降低事务中止的概率和降低事务重试的开销;使用分段存储的方式,将原本分布在同一缓存行上的相邻数据记录分布到不同的缓存行上,避免访问相近记录的线程同时访问到一条缓存行而造成假冲突;利用冲突控制模块在索引阶段和操作阶段的边界前瞻性地检测和消除冲突;利用自适应冲突控制方法调整冲突管理策略,使在不同竞争程度的工作负载下均能取得良好的性能;基于本方法构建的并发索引结构可以充分利用HTM带来的简洁性与高效性,提高并发索引结构在高竞争工作负载下的吞吐率。
Description
技术领域
本发明属于大数据技术领域,具体涉及基于硬件事务内存的面向高竞争情景的并发索引结构设计方法。
背景技术
索引结构是一种在数据管理系统中提供快速数据查询功能的数据结构,具有代表性的数据结构包括搜索树、SkipList、哈希表等。随着数据管理系统数据量和用户规模的增大,索引结构往往需要面临高并发、高竞争的工作负载。并发索引结构的吞吐率、并发性和可扩展性直接决定了整个系统的性能。然而,由于并发索引结构在查询、插入、删除等过程中涉及频繁且复杂的数据结构变动,设计高性能的并发索引结构一直是一个比较困难的问题。传统的并发索引结构实现方式包括基于细粒度锁的实现和基于无锁方法的实现,然而这些传统的并发控制方式为了维持细粒度的线程同步区间,其线程同步方式往往较为复杂、代码量较大、也需要比较复杂的形式化证明来说明其正确性。而硬件事务内存(HTM)的出现和普及,为设计并发程序提供了一种简洁高效的编程范式,从而给并发索引结构的设计提供了一种新的途径。
目前主流的基于HTM的并发索引结构一般利用一个统一的HTM硬件事务区间保护整个索引结构访问操作的事务性执行。这种HTM保护方式相较于利用细粒度锁和无锁方法的同步方式显著降低了设计和实现的复杂度,并已被成功地运用于一些基于HTM的数据管理系统中,并被证明在一般的工作负载下可以取得优于传统的软件并发控制协议的并发性能。然而,随着数据管理系统并发请求规模的增大、工作负载偏斜程度的增大、读写比例不均衡、分布式数据库拓扑结构趋于复杂等原因,现有数据管理系统面临的工作负载的竞争程度越来越大。尤其是随着大数据时代的到来,大规模、高并发、高竞争的数据访问模式会越来越频繁地出现在现有的数据管理系统中。而本发明通过比较实验发现,现有的基于HTM的并发索引结构在工作负载呈现高竞争模式时,性能会出现数量级的下降;如果不能解决这一性能缺陷,现有硬件事务内存的应用范围和场景就会受到严重限制。因此,如何解决高竞争工作负载下基于HTM的并发索引结构的性能缺陷,成为构建基于HTM的高性能并发索引结构的关键问题。
造成现有的基于HTM的并发索引结构在高竞争负载下性能严重下降的原因主要有以下几点:
第一,高竞争的工作负载会带来较大的数据冲突概率。在基于HTM构建的并发程序中,如果大部分硬件事务不能成功提交,就会陷入中止并重试的循环而造成程序无法向前执行。在基于HTM构建的并发索引结构中,绝大多数HTM硬件事务中止由数据冲突造成,即不同请求同时对同一数据进行了冲突性访问。造成这种现象的直接原因是随着冲突率的提升,在工作负载中多个线程读写到相近或相同记录的概率也随之上升,这造成了不同的线程之间发生冲突的概率增大。
第二,粗粒度的硬件事务保护方式造成重试开销大。传统的基于HTM的并发索引结构采用单一的HTM区间保护整个数据结构操作过程,临界区包括全部索引数据结构的查询过程。尽管这样简单的设计能够显著降低实现的复杂性,但也在竞争程度加大时带来了较高的硬件事务中止和重试的开销。根据对冲突发生原因的分析,并发索引结构中的数据冲突在索引结构上的分布并不均匀,大部分的数据冲突实际发生在索引结构的某些部分,比如基于HTM的B-树,其大部分数据冲突发生在叶子节点;而基于HTM的SkipList,其数据冲突大多发生在底层链表。在这种情况下,索引结构上任意位置发生的冲突都会导致一个请求重新从开始再次执行一遍搜索过程;尽管此时数据结构的大多部分可能完全没有数据冲突,实际并不需要重试。
第三,数据连续排布和共享元数据导致假冲突频繁。假冲突是指并非由于访问到同一个记录而引发的冲突,也就是在业务层面上实际不应该存在的冲突。在基于HTM构建的并发索引结构中,假冲突主要由以下两方面原因导致:(1)连续的内存排布导致的缓存行共享。在一般的并发索引结构中,为方便提供顺序存储和快速查找,关键字往往是按照连续紧密的方式存储在内存中的。由于HTM是以缓存一致性协议为基础检测数据冲突,其检测冲突的粒度是一个缓存行。当不同的线程同时访问存储于一个缓存行的数据时,就会因为缓存行共享而造成一次冲突。因此这种连续而密集的数据存储方式会在冲突率较高时造成比较严重的性能开销。(2) 索引结构中的共享元数据。传统的并发索引结构包含很多共享变量来维持一些索引结构的不变量,比如B-树的高度、SkipList的层数、节点的版本号,节点中的记录数量等等。对这些共享元数据的同时的冲突性访问也会引发数据冲突。
第四,工作负载高竞争率引发的真冲突。真冲突是由不同的请求访问相同的记录而造成的冲突。在竞争率较高的工作负载中,不同的线程同时访问到同一个记录的概率会增大,这种同时对同一个记录的访问是一个重要的冲突来源。
为解决以上基于HTM的并发索引结构在高竞争工作负载下的性能问题,本发明设计了一个在高竞争工作负载下能够取得较高性能的基于HTM的并发索引结构设计模式。本发明通过重新设计并发索引结构的检索过程和数据结构,有效地解决了基于HTM的并发索引结构在高竞争工作负载下面临的种种问题。在支持硬件事务内存的硬件平台上可以取得良好的性能和可扩展性,并相对于传统的通过软件方式进行并发控制的并发索引结构取得较高的性能优势。本发明有效地拓宽了HTM这一新兴硬件特征的适用范围,充分利用了HTM的简洁性和高效性。
发明内容
本发明的目的在于提供一种基于HTM在高竞争工作负载下能够取得良好性能和可扩展性的并发索引结构模式设计方法。
本发明提供的基于硬件事务内存的面向高竞争情景的并发索引结构设计方法,按照数据冲突的概率和比例将访问索引结构的过程划分为索引阶段和操作阶段,将大部分数据冲突和事务重试操作限制在操作阶段内部,从而降低事务中止的概率和降低事务重试的开销;使用分段存储的方式,将原本分布在同一缓存行上的相邻数据记录分布到不同的缓存行上,避免访问相近记录的线程同时访问到一条缓存行而造成假冲突;利用冲突控制模块在索引阶段和操作阶段的边界前瞻性地检测和消除冲突;利用自适应的冲突控制方法自动调整冲突管理策略,从而在不同竞争程度的工作负载下均能取得良好的性能;本发明的具体步骤如下:
(1)首先,划分事务区间,即根据HTM的并发索引结构在高竞争负载下数据冲突在不同执行阶段内发生的概率不同,将索引结构的访问操作划分为冲突稀疏的索引阶段和冲突密集的操作阶段,利用HTM事务内存分别保护划分后每个阶段内部代码的事务性执行;并通过基于版本号的一致性验证策略保证划分前后的语义一致性;
(2)其次,在冲突密集区域内部,按照分散存储的原则,将原有的连续密集存储的键值对集合按照无序的方式分散存储;并在操作阶段引入调度器,将进入操作阶段的多个读写请求,调度到不同的存储结构上,从而降低冲突的可能性;
(3)再次,划分前的整个并发索引结构的访问过程做为整体,为了保证划分后的语义与原有的访问语义一致,在第一步划分后的两个阶段(索引阶段和操作阶段)间引入基于细粒度咨询锁(Advisory Lock)和布隆过滤器的冲突控制模块,前瞻性地检测和消除数据冲突;
(4)最后,利用冲突检测模块自适应地检测工作负载实时的冲突情况,并引入自适应检测模块,用于检测工作负载竞争程度,并根据竞争程度,自适应调整是否采用针对高竞争的优化策略,从而在非高竞争情况下避免不必要的开销,使该数据结构能够适应不同竞争程度的工作负载。
本发明中,步骤(1)中所述的事务区间的划分,依据在HTM保护下的并发索引结构上发生的数据冲突的分布情况,按照数据冲突频率划分索引结构访问操作的过程为:将原有的单一的HTM的区间依据数据冲突的分布情况划分为多个部分;已知在索引结构中,数据冲突的分布并不均匀,大多数冲突是由某一个阶段的操作引发的,因此硬件事务的划分方式应当参照数据冲突的分布方式进行划分:原有的使用统一的HTM区间保护的索引结构查询过程划分为冲突稀疏的沿索引结构向下查询的索引阶段和冲突密集的修改数据记录的操作阶段;完成划分后,两个阶段的并发访问过程分别使用不同的HTM区间进行保护;即冲突率较低的索引阶段划分到一个硬件事务区间中,冲突率较高的操作阶段划分到另一个硬件事务区间中(如图2所示)。这种划分方式可以将硬件事务重试的范围约束在冲突率比较高的操作阶段内部,而不是像单一事务区间中的重试方式那样从根节点开始重试全部索引和操作过程。然而,简单地将一个完整的硬件事务分割为两个部分可能会引入整体一致性无法保证的问题。为此本发明设计了一种基于版本号的投机一致性验证策略。通过基于版本的一致性控制协议保证划分前后的语义一致性,即操作阶段每次发生改变时更新自己的版本号,并传递给指向它的索引结构;每个请求从索引阶段进入操作阶段后,均检测自己从索引阶段携带的版本号与当前操作阶段的版本号是否一致;如果不一致,则发生冲突,应该回退重新执行。
本发明中,步骤(2)中所述在冲突密集区域内部,按照分散存储的原则,将原有的连续密集存储的键值对集合按照无序的方式分散存储;其流程为:
首先,将原本连续的记录存储方式改为分段的存储方式,将原来连续存储的记录按照随机原则分散存储到位于不同缓存行的段中;其次,在该阶段增加请求调度器,对于进入该阶段的多个并发读写请求,调度器随机将它们调度到不同的区段。通过这种随机分配请求到不同区段的方式,原本访问存储位置相近记录的请求被随机分配到了不同的缓存行上,原本可能存在的假冲突从存储位置上被隔开了。另外,并发索引数据结构为了维护数据结构的一些特性,通常需要维护许多元数据,这些元数据在多个请求并发访问时也会引发竞争冲突。通过这种分段存储和随机调度的方式,不同的段维护不同的元数据,从而也进一步降低了并发访问过程中冲突的可能性。具体如图3所示。
在基于HTM构建的并发索引结构中,大部分数据冲突实际发生在修改操作密集的操作阶段。为了进一步避免冲突,在本发明步骤(3)中,在索引阶段和操作阶段的分界处设置了前瞻性的冲突控制模块,以降低操作阶段两个并发请求访问相同数据的概率。具体地说,所述的冲突控制模块,主要采取两种策略来预防和处理真冲突。首先,采用一种细粒度的咨询锁来避免并发请求同时访问到操作阶段中的同一个数据记录。该咨询锁判断即将进入操作阶段的请求是否与已经进入操作阶段的其他请求访问相同的数据,从而引发数据访问冲突;如果存在冲突的可能性较高,则串行化执行该请求,即阻塞该请求,直至比它早的进入操作阶段跟它存在潜在冲突的操作完成。如果判断为不存在冲突,则继续执行该操作请求。其次,同时进入操作阶段的请求如果太多,会增加分布式段存储的段内冲突的可能。为了解决该问题,采用一种类似于布隆过滤器的机制来减小同时进入操作阶段的请求数量。当已进入操作阶段的请求数目超过一定数量,则阻塞后继请求,直至已有足够数量的请求退出操作阶段。同时,当一个读请求试图去查询一个并不存在的记录时,布隆过滤器检测到这次不必要的读取操作,并提前阻止这次请求进入操作阶段,从而降低操作阶段的冲突率。具体如图4所示。
本发明中,在实际场景中工作负载的竞争率是经常变化的。在所有场景都引入针对高竞争的解决机制会引入额外的运行时开销,从而降低工作负载竞争程度较低的性能。为了能够在不同的工作负载竞争程度下均取得良好的性能,本发明中的并发索引结构需要能够识别不同的工作负载竞争程度,并在不同的竞争程度下采用不同的策略。为此,本发明步骤(4)中引入自适应检测模块,用于检测工作负载竞争程度,并根据竞争程度,自适应调整是否采用针对高竞争的优化策略。具体而言,首先,自适应检测模块记录发生在本区域内的冲突率,然后根据历史冲突率数据预测之后工作负载的可能的冲突率。如果某个区域的冲突率长期维持在一个比较低的水平,那么说明该区域处于较低的竞争率下,自适应检测模块判断当前请求为低竞争场景。此时新进入的请求会旁路掉该节点的冲突控制模块,从而避免该模块带来的额外开销。如果自适应检测模块判断当前为高竞争的场景,则在数据访问过程中,全程采用针对高竞争的优化策略。
基于上述原则,本发明提出一种在多核平台上构建基于HTM的并发索引结构的方法,具体如下:
(1)针对具体的并发索引结构冲突的分布划分两个事务区间:上部区间,用来保护对于内部节点的访问的并发一致性,这部分冲突率相对较低;下部区间,用来保护对于操作区域的节点的访问的并发一致性,这部分的冲突率相对较高。
(2)设计基于版本号的投机一致性验证策略:由于在分割后的硬件事务中,一次完整的查询过程由两步构成,第一步访问索引部分,第二步访问操作部分;第一步通过检索索引部分,得到最终需要访问的指向终端节点(终端节点为索引结构的最底层节点,如树形结构的叶子节点)的指针,将搜索内部节点得到的指向某个终端节点的指针传递给第二步,因此这个指向终端节点的指针实际是两个硬件事务之间的“连接点”;如果这个指针指向的终端节点发生了分裂,那么整体操作的一致性也就被违反了;对此,设置一个记录节点分裂情况的版本号来保证整体一致性;即每一个终端节点维护一个版本号,该版本号在终端节点分裂时更新,并传递给它的父节点;当一个请求查询到上部区间的结尾并得到一个指向终端节点的指针时,读取检索节点中保存的终端节点的版本号;此后当该操作进入下部区间开始查询终端节点前,首先比较该终端节点现有的版本号和自己存储的版本号是否相符;如果相符,则目标终端节点尚未发生分裂,本次查询过程有效;否则本次查询过程无效,需要从根节点重试。
(3)设计终端节点的组织结构,降低假冲突的概率:键值对记录基于分散存储的原则存储在位于不同缓存行的区段中;请求分配器进一步把访问数值上相近记录的请求分散到不同的区段上。面向分段存储的终端节点主要包括以下几个部分:区段,请求分配器,版本号,叶子节点锁和预留槽,具体作用如下:
(a)区段:将原本连续存储的数据记录键值对分散到若干个区段中,各个区段在内存分布上不连续;
(b)请求分配器:终端节点内部设置一个请求分配器,用于将同时到达一个终端节点的访问请求随机分配到一个区段中,以降低并发的请求落到同一个区段上的概率;
(c)版本号:每一个终端节点维护一个追踪分裂操作的版本号,用于保证整体操作的一致性;
(d)终端节点锁:每一个终端节点维护一个终端节点私有的锁;当该节点接近满或者该节点正在分裂时,访问该节点的请求需要获取该锁;
(e)预留槽:在终端节点中设置预留槽,用于提供有序的记录存储。
(4)在索引阶段和操作阶段之间,设置冲突控制模块;该冲突控制模块通过一个哈希函数将访问请求映射为位向量中的一个比特,然后通过一个细粒度咨询锁限制请求进入终端节点的并发程度,并通过布隆过滤器降低进入终端节点的请求数量,由此降低发生在终端节点的冲突概率。节点的冲突控制模块的基本数据结构包括:一个哈希函数和两个位向量:lock_bits和mark_bits;作用如下:
(a)哈希函数:将一个请求的目标关键字映射为位向量中的一位;
(b)位向量lock_bits:相当于一个附加在终端节点每一个槽位上的细粒度咨询锁;当哈希函数将一个请求的目标关键字映射为lock_bits中的某个比特后,该请求进入终端节点之前,将该比特置为1,离开该终端节点之后,将该比特清零;该细粒度咨询锁检测并串行化所有访问到一个关键字上的并发请求,以避免冲突请求同时进入保护终端节点的硬件事务区间;
(c)位向量mark_bits:相当于一个布隆过滤器,用来指示一个关键字是否在该终端节点中存在;如果一个读操作试图查询一个并不存在的关键字,mark_bits检测到这一点并阻止本请求进入终端节点。
(5)当发生一个读或写请求时,并发索引结构按照以下过程来处理请求:
(a)并发索引结构首先根据访问请求的语义从根节点搜索到终端节点;该搜索过程的原子性由上部区间的硬件事务机制保证;当内部节点搜索完毕,线程需要退出上部区间时,用一个局部变量记录现有的终端节点的版本号;
(b)当搜索线程结束上部区间即内部节点的查询后,该并发索引结构利用冲突控制模块有可能在终端节点发生冲突的请求,如果存在冲突,则阻塞后面的访问,直至前面的存在冲突的请求完成操作阶段的访问;这个过程是通过原子性地检查和冲突控制模块的lock_bits上每一个关键字的对应位来实现的;如果一个关键字对应比特已经被置为1或者整个终端节点处于被锁住的状态,那么该请求处于阻塞状态;当一个请求成功设置了lock_bits上的对应位后,该请求检查mark_bits上每一位的状态来确定该关键字是否存在于终端节点内;当mark_bits上某一位为0时,确定该关键字一定不存在于该终端节点内;对于一个写请求,如果其目标关键字不存在于终端节点内,那么该请求直接将NULL值赋给返回值,无需再进入终端节点搜索;对于一个读请求,则设置mark_bits为1,然后本次读操作被转化为插入操作;对于写操作,如果要插入的终端节点因为节点容量近满而需要分裂,那么该请求尝试获取终端节点锁以避免后续的并发请求进入该终端节点;
(c)操作终端节点的过程由下部区间的HTM保护;当一个请求开始搜索终端节点后,首先检查终端节点的版本号是否和上部区间中存储的版本号一致;如果版本号已经被修改过,那么说明终端节点在本请求进入下部区间之前已经被其他请求分裂过;此时,如果本请求继续沿着上部区间中获取的终端节点指针搜索终端节点,就会得到错误的结果;因此这种情况下该请求从根节点重新搜索,以得到最新的、正确的终端节点;如果版本号一致,那么该终端节点依然有效;如果目标关键字没有被发现,那么一次读操作插入一个新的关键字;否则该请求更新一个已存在的关键字对应的值。
本发明能够明显的提升性能和可扩展性,且易于实现和应用,主要表现在:
(1)实现逻辑简单,比较容易应用于利用HTM保护的并发索引结构数据结构;
(2)采用分割事务区间、分散存储数值相近记录、设置冲突控制模块等方法有效地消除了数据冲突,降低了事务重试的开销,从而使高竞争的工作负载不再能够影响HTM程序的多核可扩展性;
(3)采用自适应方法控制冲突,在各种竞争率的工作负载下均可以取得良好的性能。
附图说明
图1为按照本发明设计的B+树索引结构示例。
图2为划分索引结构访问过程图示。
图3为分段存储数据记录图示。
图4为利用冲突控制模块检测和消除冲突图示。
图5为B+树叶子节点结构图示。
图6为冲突控制模块图示。
具体实施方式
以下,参照实际案例详细说明本发明的实际用例和具体算法。需要说明的是,本说明书中所使用的术语或词语不能限定解释为通常的含义或辞典中的含义,而应当立足于为了以最佳方式说明其发明人可以对术语的概念进行适当定义的原则解释为符合本发明技术思想的含义和概念。随之,本说明书所记载的实施例和附图中表示的结构只是本发明最佳实施例之一,并不能完全代表本发明的技术思想,因此应该理解到对于本发明而言可能会存在能够进行替换的各种等同物和变形例。
具体实施方式是将本发明的方法应用于不同的并行索引结构。下面结合基于本发明的方法在多核平台上构建一个基于HTM的并发B+树来说明本发明的方法如何具体实施的方式,即如何应用于并行索引结构。B+树是一种在数据库、文件系统中常用的索引结构。在并发B+树中,大多数数据冲突发生在叶子节点(操作阶段的终端节点),少部分数据冲突发生在内部节点(索引阶段)。因此本发明依据冲突的分布划分为两个事务区间:上部区间,用来保护对于内部节点的访问的并发一致性,这部分冲突率相对较低;下部区间,用来保护对于叶子节点的访问的并发一致性,这部分的冲突率相对较高。划分后,发生在叶子节点的数据冲突将只能引发在下部区间内部的重试,而不会再引发从根节点到叶子节点的重试。重试操作的开销因此被降低。B+树的整体设计架构如图1所示。
然而,简单地将原有的事务范围划分开会引入整体一致性的问题。如果上部区间中索引得到的指向目标叶子节点在两个硬件事务区间之间发生了分裂,那么从上部区间得到的指向该叶子节点的指针将不再有效,会出现整体查询过程不一致的情况。为解决这一问题,本发明设计了一种基于版本号的投机一致性验证策略。在分割后的硬件事务中,一次完整的查询过程由两步构成,第一步访问索引部分,第二步访问操作部分。第一步通过检索索引部分,得到最终需要访问的叶子节点的指针,将搜索内部节点得到的指向某个叶子节点的指针传递给第二步,因此这个指向叶子节点的指针实际是两个硬件事务之间的“连接点”。如果这个指针指向的叶子节点发生了分裂,那么整体操作的一致性也就被违反了。因此,整体一致性应当由一个记录节点分裂情况的版本号来保证;即每一个叶子节点维护一个版本号,该版本号在节点分裂时更新。当一个请求查询到上部区间的结尾并得到一个指向叶子节点的指针时,会读取检索节点中保存的叶子结点的版本号。此后当该线程进入下部区间开始查询叶子节点时,比较该叶子节点现有的版本号和自己存储的版本号快照是否相符。如果相符,则目标叶子节点尚未发生分裂,本次查询过程有效;否则本次查询过程无效,需要从根节点重试。
在叶子节点内部,键值对记录按照分散存储的原则存储在位于不同缓存行的区段中。并通过请求分配器将访问数值上相近记录的请求分散到不同的区段上,由此降低假冲突的概率。
在索引阶段和操作阶段之间,设置冲突控制模块。该模块通过一个哈希函数将访问请求映射为位向量中的一个比特,然后通过细粒度的咨询锁限制请求进入叶子节点的并发程度,并通过布隆过滤器降低进入叶子节点的请求数量,由此降低发生在叶子节点的冲突概率。
需要注意的是,尽管本发明已参照具体实施方式进行描述和举例说明,但是并不意味着本发明限于这些描述的实施方式,本领域技术人员可以从中衍生出许多不同的变体,例如将本索引结构设计模式应用于基于HTM的并发二叉树、红黑树等,它们都将覆盖于本发明权利要求的真实精神和范围中。
Claims (10)
1.一种基于硬件事务内存的面向高竞争负载的并发索引结构设计方法,其特征在于,具体步骤为:
(1)首先,划分事务区间,即根据HTM的并发索引结构在高竞争负载下数据冲突在不同执行阶段内发生的概率,将索引结构的访问操作划分为冲突稀疏的索引阶段和冲突密集的操作阶段,利用HTM事务内存分别保护划分后每个阶段内部代码的事务性执行,并基于版本的一致性控制策略保证划分前后的语义一致性;
(2)其次,在冲突密集区域内部,按照分散存储的原则,将原有的连续密集存储的键值对集合按照无序的方式分散存储;并在操作阶段引入调度器,将进入操作阶段的多个读写请求,调度到不同的存储结构上,从而降低冲突的可能性;
(3)再次,在采用步骤(1)的划分策略前并发索引结构的访问过程做为一个整体,为了保证划分后的语义与原有的访问语义一致,在第一步划分后的两个阶段即索引阶段和操作阶段间引入基于细粒度咨询锁和布隆过滤器的冲突控制模块,前瞻性地检测和消除数据冲突;
(4)最后,利用冲突检测模块自适应地检测工作负载实时的冲突情况,并引入自适应检测模块,用于检测工作负载竞争程度,并根据竞争程度,自适应调整是否采用针对高竞争的优化策略,从而在非高竞争情况下避免不必要的开销,使该数据结构能够适应不同竞争程度的工作负载。
2.根据权利要求1所述的方法,其特征在于,步骤(1)中所述的事务区间的划分的流程为:将原有的单一的HTM的区间依据数据冲突的分布情况划分为多个部分;已知在索引结构中,数据冲突的分布并不均匀,大多数冲突是由某一个阶段的操作引发的,因此硬件事务的划分方式参照数据冲突的分布方式进行划分:原有的使用统一的HTM区间保护的索引结构查询过程划分为冲突稀疏的沿索引结构向下查询的索引阶段和冲突密集的修改数据记录的操作阶段;完成划分后,两个阶段的并发访问过程分别使用不同的HTM区间进行保护;即冲突率较低的索引阶段划分到一个硬件事务区间中,冲突率较高的操作阶段划分到另一个硬件事务区间中;为了保证划分前后的一致性,引入基于版本的一致性控制协议保证划分前后的语义一致性,即操作阶段每次发生改变时更新自己的版本号,并传递给指向它的索引结构;每个请求从索引阶段进入操作阶段后,均检测自己从索引阶段携带的版本号与当前操作阶段的版本号是否一致;如果不一致,则发生冲突,应该回退重新执行。
3.根据权利要求2所述的方法,其特征在于,步骤(2)中所述在冲突密集区域内部,按照分散存储的原则,将原有的连续密集存储的键值对集合按照无序的方式分散存储;其流程为:
首先,将原本连续的记录存储方式改为分段的存储方式,将原来连续存储的记录按照随机原则分散存储到位于不同缓存行的段中;其次,在该阶段增加请求调度器,对于进入该阶段的多个并发读写请求,调度器随机将它们调度到不同的区段。
4.根据权利要求3所述的方法,其特征在于,在步骤(3)中所述的冲突控制模块采取两种策略来预防和处理真冲突;
(1)首先,采用一种细粒度的咨询锁来避免并发请求同时访问到操作阶段中的同一个数据记录;该咨询锁判断即将进入操作阶段的请求是否与已经进入操作阶段的其他请求访问相同的数据,从而引发数据访问冲突;如果存在冲突的可能性较高,则串行化执行该请求,即阻塞该请求,直至比它早的进入操作阶段跟它存在潜在冲突的操作完成;如果判断为不存在冲突,则继续执行该操作请求;
(2)其次,当同时进入操作阶段的请求太多时,采用一种布隆过滤器来减小同时进入操作阶段的请求数量;当已进入操作阶段的请求数目超过一定数量,则阻塞后继请求,直至已有足够数量的请求退出操作阶段;同时,当一个读请求试图去查询一个并不存在的记录时,布隆过滤器检测到这次不必要的读取操作,并提前阻止这次请求进入操作阶段,从而降低操作阶段的冲突率。
5.根据权利要求4所述的方法,其特征在于,步骤(4)中引入的自适应检测模块,用于检测工作负载竞争程度,并根据竞争程度,自适应调整是否采用针对高竞争的优化策略,具体流程为:首先,自适应检测模块记录发生在本区域内的冲突率,然后根据历史冲突率数据预测之后工作负载的可能的冲突率;如果某个区域的冲突率长期维持在一个比较低的水平,那么说明该区域处于较低的竞争率下,自适应检测模块判断当前请求为低竞争场景;此时新进入的请求会旁路掉该节点的冲突控制模块,从而避免该模块带来的额外开销;如果自适应检测模块判断当前为高竞争的场景,则在数据访问过程中,全程采用针对高竞争的优化策略。
6.根据权利要求1-5之一所述的方法,其特征在于,对于多核平台上构建的基于HTM的并发索引结构,依据冲突的分布划分为两个事务区间:上部区间,用来保护对于内部节点的访问的并发一致性,这部分冲突率相对较低;下部区间,用来保护对于操作区域的节点的访问的并发一致性,这部分的冲突率相对较高;这里引入基于版本号的投机一致性验证策略;由于在分割后的硬件事务中,一次完整的查询过程由两步构成,第一步访问索引部分,第二步访问操作部分;第一步通过检索索引部分,得到最终需要访问的指向终端节点的指针,将搜索内部节点得到的指向某个终端节点的指针传递给第二步,因此这个指向终端节点的指针实际是两个硬件事务之间的“连接点”;如果这个指针指向的终端节点发生了分裂,那么整体操作的一致性也就被违反了;对此,设置一个记录节点分裂情况的版本号来保证整体一致性;即每一个终端节点维护一个版本号,该版本号在终端节点分裂时更新,并传递给它的父节点;当一个请求查询到上部区间的结尾并得到一个指向终端节点的指针时,读取检索节点中保存的终端节点的版本号;此后当该操作进入下部区间开始查询终端节点前,首先比较该终端节点现有的版本号和自己存储的版本号是否相符;如果相符,则目标终端节点尚未发生分裂,本次查询过程有效;否则本次查询过程无效,需要从根节点重试。
7.根据权利要求6所述的方法,其特征在于,在终端节点内部,键值对记录按照分散存储的原则存储在位于不同缓存行的区段中;并通过请求分配器将访问数值上相近记录的请求分散到不同的区段上,由此降低假冲突的概率;分段存储后的终端节点主要包括以下几个部分:区段,请求分配器,版本号,叶子节点锁,预留槽;其中:
区段,即将原本连续存储的数据记录键值对分散到若干个区段中,各个区段在内存分布上不连续;
请求分配器,即在终端节点内部设置一个请求分配器,用于将同时到达一个终端节点的访问请求随机分配到一个区段中,以降低并发的请求落到同一个区段上的概率;
版本号,即每一个终端节点维护一个追踪分裂操作的版本号,用于保证整体操作的一致性;
终端节点锁,即每一个终端节点维护一个终端节点私有的锁;当该节点接近满或者该节点正在分裂时,访问该节点的请求需要获取该锁;
预留槽,即在终端节点中设置预留槽,用于提供有序的记录存储。
8.根据权利要求7所述的方法,其特征在于,在索引阶段和操作阶段之间,设置冲突控制模块;该冲突控制模块通过一个哈希函数将访问请求映射为位向量中的一个比特,然后通过一个细粒度咨询锁限制请求进入终端节点的并发程度,并通过布隆过滤器降低进入终端节点的请求数量,由此降低发生在终端节点的冲突概率。
9.根据权利要求8所述的方法,其特征在于,一个节点的冲突控制模块的基本数据结构包括:一个哈希函数和两个位向量:lock_bits和mark_bits;其中:
哈希函数,将一个请求的目标关键字映射为位向量中的一位;
位向量lock_bits相当于一个附加在终端节点每一个槽位上的细粒度咨询锁;当哈希函数将一个请求的目标关键字映射为lock_bits中的某个比特后,该请求进入终端节点之前,将该比特置为1,离开该终端节点之后,将该比特清零;该细粒度咨询锁检测并串行化所有访问到一个关键字上的并发请求,以避免冲突请求同时进入保护终端节点的硬件事务区间;
位向量mark_bits的相当于一个布隆过滤器,用来指示一个关键字是否在该终端节点中存在;如果一个读操作试图查询一个并不存在的关键字,mark_bits检测到这一点并阻止本请求进入终端节点。
10.根据权利要求9所述的方法,其特征在于,当一个读或写请求进入并发索引结构时,经历如下过程:
(1)并发索引结构首先根据并发索引结构的语义从根节点搜索到终端节点;该搜索过程的原子性由上部区间的硬件事务机制保证;当内部节点搜索完毕,线程需要退出上部区间时,用一个局部变量记录现有的终端节点的版本号;
(2)当搜索线程结束上部区间即内部节点的查询后,该并发索引结构利用冲突控制模块有可能在终端节点发生冲突的请求,如果存在冲突,则阻塞后面的访问,直至前面的存在冲突的请求完成操作阶段的访问;这个过程是通过原子性地检查和冲突控制模块的lock_bits上每一个关键字的对应位来实现的;如果一个关键字对应比特已经被置为1或者整个终端节点处于被锁住的状态,那么该请求处于阻塞状态;当一个请求成功设置了lock_bits上的对应位后,该请求检查mark_bits上每一位的状态来确定该关键字是否存在于终端节点内;当mark_bits上某一位为0时,确定该关键字一定不存在于该终端节点内;对于一个写请求,如果其目标关键字不存在于终端节点内,那么该请求直接将NULL值赋给返回值,无需再进入终端节点搜索;对于一个读请求,则设置mark_bits为1,然后本次读操作被转化为插入操作;对于写操作,如果要插入的终端节点因为节点容量近满而需要分裂,那么该请求尝试获取终端节点锁以避免后续的并发请求进入该终端节点;
(3)操作终端节点的过程由下部区间的HTM保护;当一个请求开始搜索终端节点后,首先检查终端节点的版本号是否和上部区间中存储的版本号一致;如果版本号已经被修改过,那么说明终端节点在本请求进入下部区间之前已经被其他请求分裂过;此时,如果本请求继续沿着上部区间中获取的终端节点指针搜索终端节点,就会得到错误的结果;因此这种情况下该请求从根节点重新搜索,以得到最新的、正确的终端节点;如果版本号一致,那么该终端节点依然有效;如果目标关键字没有被发现,那么一次读操作插入一个新的关键字;否则该请求更新一个已存在的关键字对应的值。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710942890.1A CN107766478A (zh) | 2017-10-11 | 2017-10-11 | 一种面向高竞争情景的并发索引结构的设计方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710942890.1A CN107766478A (zh) | 2017-10-11 | 2017-10-11 | 一种面向高竞争情景的并发索引结构的设计方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN107766478A true CN107766478A (zh) | 2018-03-06 |
Family
ID=61267064
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710942890.1A Pending CN107766478A (zh) | 2017-10-11 | 2017-10-11 | 一种面向高竞争情景的并发索引结构的设计方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107766478A (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109739857A (zh) * | 2018-12-28 | 2019-05-10 | 深圳市网心科技有限公司 | 高并发下的数据分布式写入方法、装置、终端及存储介质 |
CN110825734A (zh) * | 2019-10-09 | 2020-02-21 | 上海交通大学 | 平衡树的并发更新方法及读写系统 |
CN112181617A (zh) * | 2020-09-17 | 2021-01-05 | 东北大学 | 一种基于特定索引结构的高效调度算法 |
WO2023130953A1 (zh) * | 2022-01-07 | 2023-07-13 | 华为技术有限公司 | 数据查找方法及装置、网络设备 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20090171962A1 (en) * | 2007-12-31 | 2009-07-02 | Goodman James R | System and Method for Implementing Nonblocking Zero-Indirection Transactional Memory |
CN104487946A (zh) * | 2011-10-14 | 2015-04-01 | 英特尔公司 | 用于事务存储器系统中的自适应线程调度的方法、设备和系统 |
CN104598519A (zh) * | 2014-12-11 | 2015-05-06 | 浙江浙大中控信息技术有限公司 | 一种基于连续内存的数据库索引系统及处理方法 |
CN106201771A (zh) * | 2015-05-06 | 2016-12-07 | 阿里巴巴集团控股有限公司 | 数据存储系统和数据读写方法 |
US20170024318A1 (en) * | 2014-06-26 | 2017-01-26 | International Business Machines Corporation | Transactional memory operations with write-only atomicity |
CN106874458A (zh) * | 2017-02-14 | 2017-06-20 | 中国科学技术大学 | 一种基于分层分配的多层数据库的布隆过滤器构造方法 |
-
2017
- 2017-10-11 CN CN201710942890.1A patent/CN107766478A/zh active Pending
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20090171962A1 (en) * | 2007-12-31 | 2009-07-02 | Goodman James R | System and Method for Implementing Nonblocking Zero-Indirection Transactional Memory |
CN104487946A (zh) * | 2011-10-14 | 2015-04-01 | 英特尔公司 | 用于事务存储器系统中的自适应线程调度的方法、设备和系统 |
US20170024318A1 (en) * | 2014-06-26 | 2017-01-26 | International Business Machines Corporation | Transactional memory operations with write-only atomicity |
CN104598519A (zh) * | 2014-12-11 | 2015-05-06 | 浙江浙大中控信息技术有限公司 | 一种基于连续内存的数据库索引系统及处理方法 |
CN106201771A (zh) * | 2015-05-06 | 2016-12-07 | 阿里巴巴集团控股有限公司 | 数据存储系统和数据读写方法 |
CN106874458A (zh) * | 2017-02-14 | 2017-06-20 | 中国科学技术大学 | 一种基于分层分配的多层数据库的布隆过滤器构造方法 |
Non-Patent Citations (1)
Title |
---|
XIN WANG 等: "Eunomia: Scaling Concurrent Search Trees under Contention Using HTM", 《ACM SIGPLAN NOTICES》 * |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109739857A (zh) * | 2018-12-28 | 2019-05-10 | 深圳市网心科技有限公司 | 高并发下的数据分布式写入方法、装置、终端及存储介质 |
CN110825734A (zh) * | 2019-10-09 | 2020-02-21 | 上海交通大学 | 平衡树的并发更新方法及读写系统 |
CN110825734B (zh) * | 2019-10-09 | 2023-04-28 | 上海交通大学 | 平衡树的并发更新方法及读写系统 |
CN112181617A (zh) * | 2020-09-17 | 2021-01-05 | 东北大学 | 一种基于特定索引结构的高效调度算法 |
CN112181617B (zh) * | 2020-09-17 | 2024-05-17 | 东北大学 | 一种基于特定索引结构的高效调度算法 |
WO2023130953A1 (zh) * | 2022-01-07 | 2023-07-13 | 华为技术有限公司 | 数据查找方法及装置、网络设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Wu et al. | An empirical evaluation of in-memory multi-version concurrency control | |
Kim et al. | Ermia: Fast memory-optimized database system for heterogeneous workloads | |
KR102103063B1 (ko) | 분산 컴퓨팅 시스템에서 데이터베이스 트랜잭션들을 프로세싱하는 방법 | |
Tu et al. | Speedy transactions in multicore in-memory databases | |
Yu et al. | Sundial: Harmonizing concurrency control and caching in a distributed OLTP database management system | |
CN107766478A (zh) | 一种面向高竞争情景的并发索引结构的设计方法 | |
Piatov et al. | An interval join optimized for modern hardware | |
Zamanian et al. | Chiller: Contention-centric transaction execution and data partitioning for modern networks | |
Lee et al. | High-Performance Transaction Processing in SAP HANA. | |
US9904708B2 (en) | Apparatus and method for processing query in database with hybrid storage | |
US9576038B1 (en) | Consistent query of local indexes | |
Levandoski et al. | Multi-version range concurrency control in deuteronomy | |
US11714794B2 (en) | Method and apparatus for reading data maintained in a tree data structure | |
CN104573112A (zh) | Oltp集群数据库中页面查询方法及数据处理节点 | |
Chen et al. | Plor: General transactions with predictable, low tail latency | |
RU2667385C2 (ru) | Параллельная сортировка слиянием | |
CN112867999A (zh) | 基于版本的表锁定 | |
Zhang et al. | Everything is a transaction: Unifying logical concurrency control and physical data structure maintenance in database management systems | |
Xie et al. | PI: a Parallel in-memory skip list based Index | |
US6615214B1 (en) | Accommodation of data definition statements in the sharing of dynamic SQL statements | |
JP6477169B2 (ja) | データベースの処理制御方法、処理制御プロラム及びデータベースサーバ | |
Du et al. | Towards dynamic data placement for polystore ingestion | |
Zhang et al. | Eunomia: Scaling concurrent index structures under contention using HTM | |
CN118132598B (zh) | 基于多级缓存的数据库数据处理方法及设备 | |
Wevers et al. | Lazy evaluation for concurrent OLTP and bulk transactions |
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 | ||
WD01 | Invention patent application deemed withdrawn after publication | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20180306 |