数据库管理系统中的高性能事务的制作方法

文档序号:11530768阅读:253来源:国知局
数据库管理系统中的高性能事务的制造方法与工艺



背景技术:

电子设备的用户经常需要访问数据库系统以获得各种类型的信息和/或执行各种操作。已经设计了很多不同的技术来控制数据项的存储和检索。例如,一些最近的硬件平台已经开发了最近的硬件开发,例如多核处理器、多层存储器层次结构和诸如闪存等辅助存储设备,以试图为电子设备提供更高的性能。



技术实现要素:

根据一个一般方面,一种系统可以包括一种装置,该装置包括处理器和事务部件,事务部件包括存储由处理器可执行的可执行指令的计算机可读存储介质。可执行指令包括事务引擎,事务引擎包括多版本并发控制(mvcc)模块,mvcc模块访问存储相应散列(hash)表条目的无锁存散列表,相应散列表条目包括表示相应记录的相应桶项的相应桶。相应桶项每个包括指示项的在时间上最近读取时间的值和描述相应记录的相应版本的描述的版本列表。mvcc模块使用无锁存散列表来执行时间戳顺序并发控制。

根据另一方面,访问无锁存散列表。无锁存散列表包括相应散列表条目,散列表条目包括表示相应记录的相应桶项的相应桶,相应桶项每个包括指示每个项的在时间上最近读取时间的值以及描述相应记录的一个或多个相应版本的一个或多个描述的版本列表。恢复日志用作相应记录的一个或多个相应版本的源。使用无锁存散列表对密钥值储存库执行时间戳顺序并发控制。

根据另一方面,使用用于新到达的存储实体条目的动态存储分配来访问被构造为多个存储缓冲区的存储条目。维持指示特定存储缓冲区内的新请求的存储分配的下一可用位置的偏移变量值,偏移变量值经由原子获取和增量(fai)操作来更新,以向偏移变量值添加所请求的分配的大小,偏移变量值还指示特定存储缓冲区的活动用户的当前数目。使用在存储缓冲区之一中的动态存储分配来发起存储实体中的条目的存储,并且更新偏移变量值。

提供本发明内容以便以简化的形式介绍将在以下具体实施例中进一步描述的一些概念。本发明内容不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于限制所要求保护的主题的范围。在附图和以下描述中阐述了一个或多个实现的细节。根据说明书和附图以及权利要求书,其他特征将是显而易见的。

附图说明

图1描绘了示例存储引擎架构。

图2示出了通过与示例数据部件通信的示例事务部件的示例数据流。

图3示出了与示例数据部件通信的示例事务部件代理。

图4示出了测量示例事务部件的性能的示例实验数据结果。

图5a-5b是使用盲更新操作的数据修改的示例系统的框图。

图6a-6e是示出图5a-5b的系统的示例操作的流程图。

图7是示出图5a-5b的系统的示例操作的流程图。

图8是示出图5a-5b的系统的示例操作的流程图。

图9描绘了示例更新操作。

图10是示例b树原子记录储存库架构的框图。

图11示出了用于高速缓存/存储层的访问方法的示例性架构分层。

图12是用于多访问方法的无锁存日志结构存储装置的示例架构的框图。

图13示出了示例映射表。

图14a-14b示出了示例映射表上的示例增量更新。

图15描绘了示例部分页面交换和示例部分交换增量。

图16a-16c示出了闪存上的示例日志结构存储组织。

图17是使用盲更新操作的数据修改的示例系统的框图。

具体实施方式

i.介绍

在试图提供更高性能(例如,速度、效率)的硬件平台中的最新发展已经开发了多核处理器、多层存储器层次结构和诸如闪存等辅助存储设备。例如,中央处理单元(cpu)的改变已经包括多核处理器和涉及多级缓存的主存储器访问。例如,闪存存储和就地更新损害容量的硬盘供应商识别导致日志结构的使用增加。例如,云数据中心增加了系统规模,并且商品硬件的使用增加了对高可用性技术的重视。

一些示例数据库管理系统(dbms)架构(例如,microsoftdeuteronomy架构)将事务部件(tc)中的事务功能与数据部件(dc)中的数据管理功能分离。例如,基于bw-树架构的dc通过无锁存和日志结构技术实现了高性能(例如,比先前在与示例性deuteronomydc一起使用的tc中实现的最高性能快100倍的因子执行操作)。根据本文中所讨论的示例技术,可以实现tc性能的至少两个数量级的改进。例如,多版本并发控制可以用于有利地改进并发性和性能。

例如,并且如下面进一步讨论的,恢复日志可以为版本存储库做索引(例如,当它们被处理时的记录的版本)。例如,并且如下面进一步讨论的,可以实现仅重做日志记录,例如以减少恢复日志版本(例如,改进处理时间和硬件资源的使用)。

例如,并且如下面进一步讨论的,恢复缓冲区的整体移动可以在数据部件(dc)处应用。例如,并且如下面进一步讨论的,可以使用恢复日志版本来实现时间戳顺序多版本并发控制。例如,并且如下面进一步讨论的,可以实现无锁存架构(例如,通过无锁存技术)。

作为示例,deuteronomy架构提供事务功能(在事务部件(tc)中执行)与数据管理功能(在数据部件(dc)中执行)的干净分离。例如,高性能dc(例如,bw-树密钥值储存库)可以经由无锁存和日志结构技术在现代硬件上实现高性能,并且可以例如用作示例系统中的索引和存储层。例如,这样的dc可以执行比先前针对这样的系统实现的示例最高执行tc快100倍的操作。

使用本文中所讨论的示例技术,可以实现tc性能的至少两个数量级的加速(例如,与示例deuteronomy架构一起使用的先前示例tc相比)。作为示例,完整的deuteronomy堆栈可以总体上实现非常高的性能。

例如,可以使用(至少)无锁存数据结构、日志构造(例如,bw-树类型的技术)来构造tc。如下面进一步讨论的,tc可以包括多版本并发控制(mvcc)以提高并发性和性能。

此外,可以使用重做恢复,其中恢复日志还用作版本储存库高速缓存,例如mvcc技术,以避免过多的拷贝和与dc的通信。例如,更新在日志缓冲区处间隔地被分批处理,并且应用于dc(可能是远程的);这个过程是存储器内日志缓冲区的日志结构清理技术的两倍。

示例原型tc的实验结果已经在示例4套接字(socket)非统一内存访问(numa)机器上缩放到32个内核,并且对于各种工作负载已经提交了超过一百万次的事务处理。

作为示例,deuteronomy架构将数据库内核功能分解为两个交互部件,使得每个部件自身提供有用的能力。因此,在事务部件(tc)提供与提供数据存储和管理职责(例如,访问方法、高速缓存、稳定性)的一个或多个数据部件(dc)交互的并发控制和恢复的情况下,可以强加干净的分层分离职责。tc对数据存储细节一无所知(例如,对于dc的数据存储细节是“不可知的”)。同样,dc对事务功能一无所知(例如,对tc的事务功能是“不可知的”),它可以被实现为密钥值储存库。例如,deuteronomy可以通过利用多个本地和基于云的dc实现tc来实现。

在本上下文中,“事务”是指单个事务功能单元,其包括要对各种对象(例如,数据库对象、密钥值储存库对象等)执行的一个或多个操作(指令)。例如,单个“事务”可以包括要作为单元执行(实行)的很多不同操作,使得在事务执行的终止时所有这样的操作被成功地完成,或者它们都不成功。例如,事务可以被表征为一致性和恢复的原子单位。例如,事务可以包括构成单个事务的多个数据操纵和定义语句。

例如,事务可以被表征为acid:原子(表示全部或者没有)、一致(如果用户在其全部自身执行时为他的应用正确地写他的程序,则它将在事务内正确地工作,其中在事务之外的系统中可能有并发活动)、隔离(事务所做的改变直到事务完成(提交)才能被看到或者如果事务被中止则消失)和持久(即,即使系统在不适当的时间崩溃,提交的事务的结果保证持久)。例如,在“可串行性理论”中,如果事务可以被视为具有与以某些串行顺序执行相同的效果,则它们可以被认为是可串行化的。

使用事务处理的计算机系统可以采用提交协议来确保在数据项中没有进行永久性改变,或者没有对系统的其他节点可见的改变,直到执行指定的“提交”。在本上下文中,“提交”事务通常可以指代将事务的结果安装在数据库中。提交能力表示数据库系统能够在事务被中止时不安装事务的结果。并非所有被启动的事务都最终提交。没有提交的事务被称为中止。事务可能中止的原因是电源(power)可能故障,系统可能崩溃,可能出现与另一事务的并发冲突,或用户(或他的应用程序)可能检测到另一错误并且显式地中止。

例如,多个进程可以在各种节点上执行,每个进程能够以如下方式临时执行事务的动作:该方式使得如果事务需要被中止,则动作可以被“撤消”。

例如,“冲突事务”可以指代两个或更多个事务,该两个或更多个事物包括可以至少潜在地访问由事务中的另一事务更新的数据的至少一个事务。因此,由冲突事务中的至少一个产生的结果将取决于执行事务的顺序。

提交协议可以具有若干属性。例如,它可能涉及事务的原子性。一旦事务被提交,提交或者达到完全完成的状态,或者完全没有完成,没有部分完成,因此如果站点或分布式系统的任何部分在提交操作期间崩溃,则系统恢复到如下状态:其中所有部分完成的部分被移除。此外,系统可以能够在一段时间之后“忘记”提交处理的结果,即,不继续承载陈旧的数据,因为当没有发生崩溃时,需要数据的可能性随时间迅速减小。另外,出于性能原因,使日志写入和消息发送的开销最小化是有利的。

对于支持“撤销”操作的系统,系统可以通过“撤销”其动作(如果有的话)并且“忘记”事务来中止事务。

对于支持锁定的系统,“数据锁定”是用于向数据库中的数据或记录分配排他权的机制。对于这样的系统,第一事务可以锁定特定数据片段,以便确保直到第一事务提交或中止,没有其他事务访问该数据。

多版本数据库指代可以被查询(即,询问或咨询)数据库的状态在指定时间是什么的数据库。在也称为时间数据库的这种多版本数据库中,更新的数据被“标记”有时间值,通常具有对应于数据被更新的时间的时间值。通过适当的支持,时间戳数据库的查询可以提供数据库的事务一致视图,因为它在指定时间存在。这样的时间查询可以在很多计算场景中使用。

例如,如果没有进程对其执行对数据库的任何写入,则事务是完全“只读”的。

如本文中在事务部件的上下文中使用的,“高速缓存”可以指代用于存储用于有效检索的项的实体,以代替在数据部件中存储项。

更一般地,在计算中,高速缓存是透明地存储数据的部件,使得对该数据的未来请求可以被更快地服务。例如,存储在高速缓存内的数据可以是先前已经计算的值或者存储在别处的原始值的复制。如果请求的数据被存储在高速缓存中(高速缓存命中),则可以通过简单地读取高速缓存来服务请求,这相对更快。否则(高速缓存未命中),必须从其原始存储位置重新计算或取出数据,这相对较慢。因此,可以从高速缓存服务的请求的数目越大,整个系统性能变得越快。

可以使用bw-树无锁存访问方法和llama、无锁存日志结构高速缓存和存储管理器,在现代硬件上以高性能实现示例deuteronomy架构,以实现执行每秒数百万次操作的密钥值储存库。这种dc实现不仅可以提供高性能,而且可以提供进一步的架构分解,其维持访问方法和无锁存的日志结构高速缓存和存储引擎之间的“硬”分离。

例如,图1描绘了用于示例数据库管理系统(dbms)的示例存储引擎架构100。如图1所示,示例tc102经由本地或远程通信106与示例dc104通信。例如,如果tc102和dc104彼此位于本地,则通信106可以是“本地”通信,而如果tc102和dc104彼此远离,则通信106可以是“远程”通信。例如,如果部件102、部件104的部分彼此是本地的,并且其他部分是远程的,则通信106可以是“本地”和“远程”通信的混合。

图1的示例示出了app(应用)108,其需要与示例tc102通信的事务密钥值储存库。如图1所示,示例dc104包括访问方法110,其至少包括bw-树范围索引112和线性散列114。图1的示例示出了app(应用)116,其需要与dc104的示例访问方法110通信的原子密钥值储存库。如图1所示,示例dc104包括无锁存日志结构存储引擎118(例如,llama)。图1的示例示出了app(应用)120,其需要与dc104的示例无锁存日志结构存储引擎118通信的高性能“页面”存储引擎。

对于能够每秒数百万操作(ops/sec)的dc,“较慢”tc可能变成瓶颈。例如,以“传统”方式(例如,撤销/重做恢复、锁存管理器等)构建的tc可能仍然限于几万ops/sec。

本文中所讨论的示例技术可以用于高性能事务部件的设计和实现。作为示例,tc架构可以被设计和利用以实现(至少)两个数量级的加速以匹配dc性能(例如,如上面讨论的示例dc)。作为示例,锁定管理可以用由无锁存结构和技术管理的多版本并发控制(mvcc)代替。作为另一示例,撤销/重做恢复可以用纯重做恢复代替,其中恢复日志还用作示例mvcc方法的版本储存库。作为另一示例,还可以使用撤销/重做恢复,例如通过在恢复日志中存储撤销版本。

根据本文中所讨论的示例技术,tc和dc之间的通信可以通过在tc日志缓冲区清理/再循环过程期间有利地实现tc高速缓存和将提交的记录版本迁移到dc来实现(例如,如果tc和dc是远程的,从tc到dc发送完整日志缓冲区)。此外,根据本文中所讨论的示例技术,tc可以与任何数目和类型的dc密钥值储存库(无论是本地还是远程)接口。

通常,tc可以仅是事务密钥值储存库或数据库内核的一部分;其功能是提供事务并发控制和恢复。根据本文中所讨论的示例技术,示例tc可以使用多种技术(诸如锁存自由、日志结构、和经由写时拷贝增量更新的最小化就地更新)来利用新硬件(例如,多核、存储器分层结构和闪存)的特性。此外,由于部件可以被设计为允许(可能很宽的)分离,在tc处引入高速缓存以最小化事务延迟。另外,可以在tc中利用示例多版本并发(mvcc)技术。

例如,高效的高性能设计考虑可以包括各种因子,诸如将tc和dc之间的数据业务限制为仅由dbms内核功能分解所需的数据业务的期望;最小化tc内的数据移动和复制的期望;和/或开发分批以减少开销/操作的期望。它还可以包括在tc处缓存数据。

图2描绘了根据本文的讨论的示例高性能事务部件(tc)202的框图200,其示出了tc202内以及tc202和dc204之间的数据流。如图2所示,示例tc202包括两个主要部件:(a)用于管理并发控制逻辑的mvcc部件206和(b)用于管理重做日志(也用作版本储存库)210以及从dc读取的高速缓存的记录212的版本管理器208。

可能出现的示例问题是用户如何能够在tc处高速缓存数据。因为mvcc用于这个示例,版本被高速缓存在某个地方用于并发控制目的。根据本文中所讨论的示例技术,重做日志210可以用作tc记录版本高速缓存。对于该示例,版本管理器208维持(对于该示例)包括k个存储器内缓冲区214(以及大量稳定缓冲区216)的重做日志210,其中存储器内缓冲区214被密封并且一旦变满则稳定。存储器内缓冲区214被回收和重新使用。由于更新导致的版本被记录用于重做恢复,所以它们在恢复日志(重做日志210)上具有主页。恢复日志缓冲区214、216可以用于保持版本,同时它们经由mvcc部件206被访问,mvcc部件206将版本偏移量218存储为其记录元数据的一部分,并且通过版本管理器208接口请求它们。

可能需要从dc204获取尚未更新的数据版本。为了使mvcc部件206可访问它们,版本管理器208将这些版本保留在读取高速缓存212中。读取高速缓存212和恢复日志缓冲区214、216都受到不同形式的日志结构清理(垃圾收集)。因此,对版本管理器208的mvcc206请求可以命中(1)读取高速缓存212;(2)存储器内日志缓冲区214;或(3)稳定的日志缓冲区216(如果用于目标偏移的存储器内缓冲区已经被循环)。以下进一步讨论有效高速缓存管理的示例细节。

为了最小化数据移动,将更新立即发布在恢复日志上的他们的“最终休息位置”。因为恢复日志缓冲区214、216用作示例高速缓存的一部分,所以可以利用纯重做日志(即,没有“撤销”日志)来避免使用撤销版本以及重做版本来稀释(dilute)高速缓存。立即记录更新表示未提交的更新在日志上,如果它们的事务中止,则无法撤消它们。因此,直到知道包含事务已经提交,不将更新发布到dc204。因此,来自中止的事务的更新在dc204没有被应用。

如图3所示,示例tc302可以包括tc代理322:旨在驻留在dc304旁边的片段。例如,tc代理322可以在缓冲区稳定之后的某一时间从版本管理器308接收日志缓冲区324,并且适当地将其更新发布到dc304。在已知负责更新的事务被提交之后,可以进行发布。当tc代理322对于tc302是本地时,该发布是如何垃圾收集日志缓冲区。否则,一旦缓冲区已经被发送到远程tc代理322,则进行清理。由于向dc304发布更新不是任何操作的等待时间路径的一部分,所以它可以在后台完成。然而,向dc304发布更新使得能够垃圾收集mvcc条目。

本文中所讨论的示例事务部件可以被用作与高性能bw-树密钥值储存库或者用作数据部件的任何密钥值储存库分离但是能够利用其的部件。例如,tc设计的性能增益可以通过使用以下各项来实现:

1.利用时间戳顺序并发控制的变体的多版本并发控制;

2.以高效的方式避免只读事务问题的快速事务提交;

3.一旦恢复日志缓冲区持久,则恢复日志中的提交记录作为事务结果消息的延迟交付的队列;

4.利用恢复日志缓冲区作为tc处的日志结构存储高速缓存的版本管理;

5.将日志缓冲区中的更新发送到dc并从tc代理进行发布时对其进行批处理;

6.通过tc代理在dc使用不需要读取先前版本的盲写操作来应用每个更新;和/或

7.消除性能瓶颈的缓冲区管理和历元中的示例性无锁高速缓存机制,如下面进一步讨论的。

时间戳顺序并发控制涉及向事务t1分配时间戳ts1,使得所有事务的写入与ts1相关联,并且所有读取是在ts1处可见的版本的读取。然后强制执行使用时间戳的操作的正确的时间戳顺序调度。特别地,当不能维持时间戳顺序时,中止事务。

可以使用多个版本来支持较低级别的事务隔离。例如,快照隔离可以避免验证读/写冲突。如果设计重点是实现可串行化,则时间戳顺序的优点是在事务结束时不需要验证步骤。验证在访问时间发生。

根据本文中所讨论的示例技术,tc可以经由事务表(tt)追踪事务。tt中的每个条目表示具有以下各项的事务:事务id(tid)、当事务开始时发布的时间戳、以及由事务进行的更新的链接列表(经由mvcc版本)。在mvcc散列表中,每个版本都标记有tid。这允许每个版本的事务信息的容易检查,包括其时间戳。tt中的标志指示事务是活动的、已提交的还是已中止。周期性地,计算最旧的活动事务(具有最早时间戳的那个),其被称为oat,使得可以执行版本垃圾收集。

根据本文中所讨论的示例技术,可以利用“快速提交”优化,使得一旦其提交记录被写入恢复日志缓冲区,则tc好像事务已经提交一样动作,除了向用户通知提交。为此,可以延迟通知直到包含提交记录的恢复日志缓冲区稳定。这种技术对于写入提交记录并且其提交消息不会在提交持久之前返回给用户的读/写事务是可接受的。

只读事务通常可以不写入这样的提交记录,而是一旦遇到提交操作则返回。如果由这种只读事务读取的版本不是持久的,则可能涉及逻辑错误,因为系统崩溃将中止写入器。为了避免这个问题,可以为只读事务写入提交记录,因此延迟提交的用户,直到他们读取的所有内容都是稳定的。

例如,当这样做时,对只读事务的提交记录的写入可能变成性能瓶颈。根据本文中所讨论的示例技术,可以通过追踪读事务已经读取的最新版本(事务提交记录具有最高lsn的版本)来优化这种情况。然后,如果可以确定该版本已经稳定(表示由事务读取的所有版本都被提交,并且不需要延迟只读事务的提交),则针对这样的读取器避免写入提交记录。下面进一步讨论用于处理事务提交通知的示例技术。

根据本文中所讨论的示例技术,可以维持无锁存散列表以管理mvcc数据。例如,版本可以基于它们的密钥被散列到桶。每个桶项表示记录并且包括以下条目:(a)记录密钥的固定大小的散列;(b)指向整个密钥的指针(密钥可以是可变长度);(c)项的最后读取时间;和(d)描述记录的版本的版本列表。这样的示例固定长度布局可以出于性能原因而被使用:它既是分配器友好的并且保证项保持在高速缓存行大小内(如果线程简单地“通过”寻找桶链中的其他项,则是有利的)。为了执行记录查找,将固定大小的散列与查找关键字的散列进行比较;如果散列匹配整个密钥指针被解除引用,并且执行整个密钥比较以确保它是正确的密钥。然后遍历版本列表以找到要读取的适当版本。在项上的最后读取时间可以在示例时间戳顺序并发控制方法中使用:它表示最近写入的版本的最后读取时间,并且指示新版本a的后续写入者不能在按照时间戳顺序的先前版本b的读取者之前提交。

根据本文中所讨论的示例技术,版本列表中的项可以是固定大小,并且包括:(a)创建事务的事务id(tid);(b)用于引用来自版本管理器的有效载荷的版本偏移;和(c)用于表示该版本是垃圾并且已经创建它的事务被中止的“中止”位——这可以用作垃圾收集过程的快速追踪(如下面进一步讨论的)。

根据本文中所讨论的示例技术,使用无锁存更新协议来维持散列表桶列表和版本列表两者。例如,可以使用比较和交换(cas)操作将新条目附加到列表。管理列表的一个具有挑战性的方面是从列表中的任意位置删除不再需要的项(或版本)。对于此示例,不需要使用以此方式工作的完全一般的无锁列表。相反,示例技术可以有利地总是使用cas从列表的末尾删除。这在本示例中工作,因为最早的版本(变得陈旧并且最终被垃圾收集的版本)自然地位于列表的结尾。这种无锁存去除设计可以有利地简化实现并且自然地减轻在无锁存编程中普遍存在的很多错误。

为了在无锁存列表中提供指针稳定性,可以利用示例历元机制来确保释放的存储器(例如,记录版本)不被重新使用,直到活动线程不再解除引用指向该存储器位置的指针(如下文进一步讨论的)。

根据本文中所讨论的示例技术,mvcc可以通过将所有更新后的版本保持回到oat并且包括对oat可见的那些来保守地维持可以由未提交事务看到的版本。任何比此更旧的更新版本不能被活动事务看到,并且一旦已知它们已经在dc处被应用,则可以从示例散列表中丢弃它们。此外,当没有更新的版本时,只有oat可见的版本可能会从mvcc散列表中删除。然后可以从dc读取所需的但不存在于mvcc表中的版本。如下面进一步讨论的,tc代理可以简洁地向tc报告在dc处安装版本的进展。

根据本文中所讨论的示例技术,tc的主要作业包括提供对版本的快速访问。例如,tc可以服务来自两个位置的版本的请求。第一种是直接来自存储器内恢复日志缓冲区(例如,缓冲区214、缓冲区216)。第二个是用于保存热版本的“读取高速缓存”(212),其可能没有被最近写入足以保留在恢复日志缓冲区中。

根据本文中所讨论的示例技术,tc202批准并且中介所有更新,这允许其缓存和索引通过它更新的版本。为了使其有效,tc202使其恢复日志缓冲区和其mvcc元数据表两者都使用。当事务尝试更新时,其首先寻求mvcc206的批准。如果被批准,则该许可导致新版本被存储在版本管理器内的恢复日志缓冲区(例如,版本管理器208的缓冲区214、缓冲区216)中。之后,在mvcc散列表218中创建用于版本的条目,其包括对版本的偏移量220,并且将其与更新事务(例如,事务id222)相关联。对于由mvcc204批准的该版本的稍后读取可以在存储器中快速找到数据。因此,除了并发控制之外,mvcc204用作版本索引,并且存储器内恢复缓冲区214、216与读取高速缓存212一起填充高速缓存的角色。

根据本文中所讨论的示例技术,mvcc206使用无锁存散列表218来管理版本数据。根据本文中所讨论的示例技术,mvcc项将偏移(例如,版本偏移220)存储到版本管理器208中以用于版本访问。

根据本文中所讨论的示例技术,存储在tc202处的每个更新版本既用作事务的mvcc版本又用作事务的重做日志记录。tc202使用纯重做日志记录,并且不包括这些日志记录中的先前映像。版本被立即写入恢复日志缓冲区,这表示更新在dc204不应用,直到已知被提交,因为没有办法撤消更新(在该示例中),这由tc代理322确保。

恢复日志缓冲区被写入稳定存储装置以确保以通常方式的事务持久性。然而,缓冲区也保留在主存储器中以用作版本的主存储器高速缓存。根据本文中所讨论的示例技术,缓冲区最终以懒惰方式经由日志结构清理过程被再循环,导致相关更新由tc代理322发送到dc204(304)。版本管理器308通过将稳定缓冲区326借给或发送到tc代理322(取决于dc304是本地还是远程)来发起该过程。

可能需要从dc304读取dc304中的预先存在的版本和其元数据已从mvcc表218中移除的版本。这些版本被放置在由版本管理器308维持的读取高速缓存328中,并且元数据条目被添加到它们的mvcc表218。示例高速缓存328可以包括以先进先出(fifo)顺序填充和清理的无锁存日志结构缓冲区。作为另一示例,如果版本自上次清理以来已被引用,近似最近最少使用的第二机会清理策略可以通过将版本从日志的头部复制到尾部来实现。

与llama高速缓存/存储子系统类似,可以以完全无锁存方式执行向恢复日志缓冲区或读取高速缓存缓冲区发布版本。虽然缓冲空间预留涉及协调,但是数据的复制可以有利地以线程安全的方式进行而不进行协调。例如,可以有利地通过使用交换原子添加操作以代替比较和交换操作来提高缓冲区空间保留的可伸缩性,如下面进一步讨论的。

tc代理322的一个示例焦点是从tc302接收稳定恢复日志缓冲区,并且在遵守预写记录协议的同时有效地将其中的版本应用于dc304。例如,tc代理322与dc304运行在同一位置。它执行良好定义的契约,其将tc302和dc304充分分地开,以允许dc304与tc302本地运行或在远程机器上运行。

根据本文中所讨论的示例技术,一旦恢复日志缓冲区稳定,则将其直接发送到tc代理322而不进行进一步的操纵;恢复日志缓冲区本身可以充当更新批处理。对于该示例,仅在tc代理322处,操作被解捆绑并且适当地提交给dc304。

当dc304是本地的时,其通过从版本管理器308借用对其的引用来避免复制恢复日志缓冲区。在dc304是远程的情况下,联网子系统类似地保持对缓冲区的引用,但是仅直到远程tc代理322已经确认其接收。

在一些示例dbms设计中,可以在更新被生成时将更新发送到dc,并且如果事务中止,则撤消操作被发送到dc以补偿较早的更新。在这些示例dbms设计中,tc操作可能是等待时间限制的,因为它直接向dc发出写入。此外,可以在它们在恢复日志上稳定之前发送更新。实际上,更新可以在它们在恢复日志上之前被发送。在那些示例dbms设计中,结束稳定日志控制操作可以通知dc何时应当使操作稳定以实施预写日志协议。

然而,根据本文中所讨论的示例技术,所有更新在它们被发送到tc代理322的时候在稳定日志216上。因此,tc代理322安全地将任何提交的操作应用于dc304而没有延迟。然而,结束稳定日志可以服务于仍然有价值的另一有用目的:dc304可以使用它来确定它何时已经看到直到某个序列号(例如,日志序列号(lsn))的所有操作。这允许它例如重新组织和优化其存储布局,以简化等幂检查。

有利的性能可以取决于处理日志记录尽可能接近单个时间。与一些其他示例设计不同,本文中所讨论的纯重做设计仅涉及提交到dc304的持久提交的操作。理想地,tc代理322在处理恢复日志缓冲区时将仅遇到提交的记录。然后,可以应用它们遇到的所有操作。当缓冲区的扫描完成时,缓冲区可以被标记为清理并且被重新使用。

为了使“理想”场景“几乎为真”,可以延迟缓冲区的更新处理,如图3的示例所示。如图3所示,tc代理322对多个缓冲区(全部稳定)排队,但是其立即扫描到达缓冲区的提交记录并且更新其事务表340。仅在一些延迟之后才执行应用操作的后续扫描。到执行应用操作的扫描时,缓冲区中的几乎所有操作都将具有由稍后缓冲区的先前提交扫描标识的稳定的提交记录。

在图3的示例中,tc代理322从tc302接收完整的稳定恢复日志缓冲区。热衷遍历更新事务状态;延迟传递将提交的操作应用于dc304。对dc304的延迟应用使重新定位到侧边缓冲区342中的操作的数目最小化。

根据本文中所讨论的示例技术,缓冲区内的提交记录可以被链接在一起以最小化提交扫描阶段的成本。这使得能够跳过介入的操作日志记录,其通常可以是日志记录的大部分(例如,90%)。根据本文中所讨论的示例技术,每个提交记录可以包括将在事务结束时被发送的返回消息。因此,提交日志记录可以充当对提交请求的响应的持久队列,从而在等待包含要被使得稳定的消息的恢复日志缓冲区时,从用于分离机制的需要保存tc以存储提交消息。当tc代理322在dc302的本地时,这些提交消息在提交扫描期间被发送到执行事务的用户。在远程情况下,可以紧在将缓冲区发送到tc代理322之前执行提交扫描;tc代理322维持“影子”事务表以追踪提交进展,该提交进展在其接收到缓冲区时照常被更新。tc302还可以支持非持久提交以允许应用程序改进其多线程性能。

在被扫描提交记录之后,每个日志缓冲区被再次扫描以在dc304处应用操作。应用已知要提交的事务的所有操作。丢弃已知要中止的事务的操作。其结果未知的事务的操作被重新定位到侧边缓冲区342中。结果是在操作扫描结束时,整个恢复日志缓冲区被清理并且可以被重新使用。例如,当非常少的操作具有未决定结果时,上面讨论的侧边缓冲区策略可以工作得很好。侧边缓冲区342用于存储未决定的事务操作的空间需求可能非常小。这些操作一旦被确定为提交就应用于dc304,并且在确定它们被中止时被丢弃。

根据本文中所讨论的示例技术,随着时间的推移,版本元数据是从mvcc206收集的垃圾。mvcc206使用事务表来追踪最旧的活动事务的时间戳(oat),并且仅丢弃不是对所有正在进行和未来的事务都是可见的版本的元数据,除了oat可见的可能例外(如上所述)。这防止mvcc206移除对于活动事务正确执行并发控制所需的元数据。

然而,如果允许mvcc206丢弃关于在dc304处尚未应用的版本的元数据,则这样的动作可能导致tc302读取不正确的版本。例如,如果对mvcc206没有元数据的密钥执行读取,则将该读取转发到dc304。如果tc302为mvcc206已经“忘记”的密钥写入较新版本,则当向dc304发出读取时,可以返回太新的版本。

为了防止这种情况,mvcc206元数据垃圾收集可以知道恢复日志应用于dc304的进展。例如,tc代理322可以为tc提供简明的两整数概要用于此目的(例如,如下文进一步讨论的)。通过延迟从mvcc206移除元数据直到在dc304处应用操作,tc302可以确保它总是追踪每个版本的读取和写入时间戳,除了用于比所有其他版本更旧以及可以通过所有事务向前移动安全地从dc读取的每个密钥的读写时间戳。

例如,tc代理322可以使用单个lsn来追踪日志中最早未应用的版本以向tc302报告进展。不幸的是,这可能允许长时间运行的事务停止mvcc206垃圾收集。为了解决这个问题,tc代理322可以使用在tc代理322执行的两个单独的通路中维持的t-lsn和o-lsn。例如,o-lsn可以追踪已经在dc304处应用的日志的前缀,排除属于具有大于t-lsn的提交记录lsn的事务的操作。对于此示例,没有事务可以阻止o-lsn或t-lsn。如果mvcc206版本的lsn小于或等于o-lsn并且其事务的提交记录小于或等于t-lsn,则可以在dc安全地处理mvcc206版本(例如,垃圾收集)。例如,t-lsn和o-lsn可以用于追踪哪些版本已经应用于dc,因此,它们在这些lsn可以被提前之前安装。换言之,这些lsn指示在dc处已经应用的内容。

根据本文中所讨论的示例技术,当在缓冲区中分配空间时,可以使用获取和增量(fai)操作而不是比较和交换(cas)操作来实现缓冲区管理。在本上下文中,“获取和增量(fai)”操作是指返回存储器位置的值并且原子地递增它的不可分的可执行指令。

例如,可以维持一个字offset,以指示缓冲区中的下一存储将被分配在何处。对于该示例,可以假定32比特的字大小;然而,计算领域的技术人员将理解,取决于使用的上下文,(在计算环境中)“字”可以涉及任何数目的比特(例如,16比特、60比特等)。此外,计算领域的技术人员将理解,offset可以被实现为除了“一个字”条目之外的可变实体。

例如,当缓冲区为空时,offset可以被初始化到零。当分配空间时,可以执行fai指令以将分配的大小添加到偏移。然后,空间的请求者从返回给他的偏移值中减去他的大小,以确定其分配的空间的开始。不仅fai提供比cas更好的性能,但在大多数情况下,没有输家。多个fai可以成功,并且每个都将向空间请求者返回不同的结果(并且因此返回缓冲区的不同区域)。

根据本文中所讨论的示例技术,还可能需要追踪缓冲区的活动用户的数目。例如,这可以通过包括users字段作为到偏移字段的字大小的前缀(例如,在“一个字”偏移的上下文中)来实现。例如(假定32比特“字”),通过使用2**32+大小的值作为“增量”,这两个字段可以增加,使得分配请求既在缓冲区中预留空间,又增加在users字段中记录的用户数目。当用户完成将数据写入其已经保留的缓冲区空间时,它可以使用fai来减小users字段以指示它不再是活动写入器。计算领域的技术人员将理解,除了2**32之外的值可以被添加到大小,以完成在users字段的适当比特位置(在该示例中为2**(字大小))中添加1。(在该上下文中,“x**y”表示将“x”提高为被指示为“y”的幂)。

根据本文中所讨论的示例技术,当缓冲区填充并且缓冲区可以被“密封”时,这可以被干净地终止,使得其他人将看到它不再被使用,并且因此将他们的注意力转移到下一缓冲区。此外,当填充缓冲区并且user字段为零(指示没有线程将数据写入缓冲区)时,它可以被写入辅助存储装置。

例如,可以通过由fai产生的偏移是否大于缓冲区并且user字段是否为零来确定缓冲区是否可以被密封。当发生这种情况时,引起这种情况的线程可以使用cas为缓冲区设置seal标志。如果cas成功,则线程可以调度缓冲区写入。seal标志可以方便地用双字的users或偏移部分中的比特表示。

一般来说,无锁存数据结构可能对存储器回收提出挑战。例如,当项从无锁结构解除链接时,某些线程可能仍在访问该项。根据本文中所讨论的示例技术,为了使其“安全”,tc302可以使用基于历元的机制来提供指针稳定性;它可以将未链接的项发送到垃圾列表,在垃圾列表,未链接的项被保持直到没有线程可以再次引用它们。根据本文中所讨论的示例技术,可以使用fai指令(操作)以代替cas指令(操作)来实现无锁存历元管理器。

例如,可以使用单调递增的全局历元(例如,无符号64比特整数)、一组线程本地历元变量(例如,在单独的高速缓存线上对齐)和垃圾列表(在垃圾列表中,每个项被保持直到它可以安全地重新使用其内存)来实现tc的历元保护。

根据本文中所讨论的示例技术,每当线程开始tc操作(例如,读取、写入、提交等)时,它将全局历元的快照复制到其在线程本地历元集中的槽中。在完成tc操作之后,线程将其线程本地历元设置为∞(或表示“非正常”值的某个值,用于与线程本地历元值的“正常”值或者某些预定义的有意义的表示线程已完成tc操作的值相比较)。对于这个示例,每个线程本地历元用作线程何时进入tc以及它可能观察到什么内容的回收操作的指示符。

根据本文中所讨论的示例技术,当项从tc的内部数据结构中的一个解除链接时,获取全局历元的快照,并且将其与指向未链接项的指针一起排队到垃圾列表上。根据本文中所讨论的示例技术,每当项被添加到垃圾列表时,旧项被移除并返回到存储器分配器。垃圾列表是固定大小的环,因此,当新项被插入环的头部时,旧项首先被移除并被解除分配(如果这是安全的话)。

对于使用“∞”值的上述示例,为了确定解除分配项是否“安全”,可以将与项引用一起存储的历元与在线程本地历元集中找到的最小历元进行比较。如果项的纪元较小,则没有线程具有对项的引用(即,对于该示例,在线程本地集合中的任何线程进入tc之前,该项必须已经被解除链接)。

对于要解除分配的每个项,从线程本地历元集合重新计算最小历元可能比所需要的更频繁。相反,每当全局历元递增或者由于低线程本地历元而列表中的项不能被回收时,可以重新计算最小线程本地历元。

最后,当垃圾列表已经累积了大量的需要返回给分配器的新项时,可以周期性地增加全局历元。例如,这可以通过原子fai来完成。例如,每当固定大小的垃圾列表重写其容量的四分之一时,可以递增全局历元,并且可以重新计算和缓存最小线程本地历元。

总的来说,本文中所讨论的示例历元保护可以仅涉及每个tc操作的总成本的一小部分(例如,小于0.1%的壁时间),即使它可能由于三个因素而在快速路径上。首先,在快速路径上没有锁存、原子、竞争或非缓存操作。进入和退出tc302的线程仅需要咨询(缓慢改变的)全局历元并更新专有高速缓存行中的单个字。第二,它利用tc操作短和非阻塞的事实,以用每个tc操作的单个历元进入/退出调用对来保护所有tc的数据结构。这也使得tc内的编程更容易,因为所有tc操作可以安全地保持并且在操作的整个持续时间使用对任何数据结构中的任何项的引用。最后,确定最小线程本地历元的所有沉重工作和高速缓存一致性开销在数十万个解除链接操作中摊销。

无论是通过根据数据分区调度线程还是以某种其他方式管理它们,敏感和仔细的线程管理可以使用现代多核处理器提供高性能。例如,也可以对核心的“几何形状”加权。

尽管示例dbms内核的锁(锁存)自由,但是可能不能通过盲目地跨越更多核运行来获得峰值性能。例如,当系统扩展到单个cpu插槽之外时,工作可以被划分。同时,构建通用且易于使用的系统的目标可以防止设计者在事务之间强制任何种类的划分;设计者可能希望即使在不能通过数据完全分区的工作负载的情况下也能获得最佳性能。

根据本文中所讨论的示例技术,代替以数据相关的方式划分工作,可以通过在负载超过单个套接字内可以处理的内容时将tc和tc代理/dc操作划分到单独的套接字上来缩放示例dbms内核。这允许它利用更多的核心并且减少两个模块上的高速缓存压力,代价是增加它们之间的高速缓存一致性流量。它还通过尝试防止没有直接连接的处理器对之间的通信来有利地使用处理器互连拓扑。

例如,在满载时,dc304可以包括被钉扎(p进)到单个套接字的多达16个附加线程的线程池;线程的精确数目可以适于尝试确保dc304与被tc302记录时一样快地应用操作。例如,在可能的情况下,tc302事务处理可以首先在来自相邻套接字的硬件线程上发生,仅在必要时溢出到作为来自dc304的两个“跳”的核上。

作为示例,dbms内核可以使用专门的异步编程模式来给予其对调度的严格控制,以避免线程上下文切换开销,并且避免线程的浪费的堆栈空间。可以优化模式以避免在通常情况下的上下文状态的昂贵的堆分配。

例如,每当异步事件(例如,i/o)可以使得立即和同步成功完成请求不可能时,此异步模式可以涉及使用“延续”。例如,继续通常可以仅涉及请求的重新执行。然而,涉及重新执行的每个系统级别将其延续添加到构成完全延续的集合。此外,在需要时,延续应该在堆上,因为返回路径将已经折叠堆栈分配。

与非同寻常的使用异步连续发布不同,这样的示例dbms内核可以将其持续存储在堆栈上而不是堆中。当可以同步地执行操作的执行时,例如,当所需数据在高速缓存中时,避免所有堆分配。只有当涉及异步路径时,例如,操作涉及执行i/o操作以将需要的数据带入高速缓存,是从堆被复制到堆栈的延续。这种简单的技术对系统性能有有利的实质性影响,这表示当例如数据全部在存储器中时,完全避免了堆分配开销。

实验结果已经表明,使用本文中所讨论的示例技术的示例dbms内核提供了在现实工作负载上与现代的单片主存储器数据库竞争的性能。对于此示例dbms内核,tc使用基于bw树的dc。

作为通用事务引擎,tc对其工作负载几乎不做出假定。本文中所讨论的初始实验结果探讨多核和读写混合对tc性能的影响。示例性实验机器设置在表1中描述,如下所示。其四个cpu中的每个驻留在单独的numa节点中,这些节点被组织为环。

表1

对于本文中所讨论的示例实验结果,利用类似于ycsb(yahoo!云服务基准)基准的工作负载。例如,dc数据库预装了5000万个100字节的值。例如,客户端线程使用具有被选择的偏斜的齐普夫(zipfian)分布随机选择的密钥读取和更新值,使得20%的密钥接收80%的访问。例如,通过将操作分组为四个集合来创建事务。例如,恢复日志记录和dc更新共享单个商品ssd(固态驱动器)。

图4示出了示例dbms内核的实验结果性能,因为tc跨多个内核扩展。总的来说,84%的发布的操作是独立和随机选择的阅读操作;这导致50%的事务是只读的,另一半发出一个或多个写入。使用16个线程(单个套接字),示例dbms内核以无效的中止率每秒执行110万次事务(每秒总计440万次操作)。

图4的示例指示随着示例实验tc扩展以跨越更多硬件线程执行事务的性能的增加。对于图4的示例,dc使用多达16个附加硬件线程(不包括在轴上的计数)。对于此示例,性能扩展到两个套接字,但是由于涉及更多的numa组,所以性能趋于稳定。对于此示例,超过16个线程性能主要受tcproxy+dc性能的限制。

如本文中所讨论的,示例tc为典型的密钥值储存库crud操作(例如,创建(c),读取(r),更新(u)或删除(d)记录)提供事务支持。本文中所讨论的示例技术提供用于类似dbms内核的先前tc的性能的100倍,甚至同时提供完全事务耐久性。此性能的一部分(但不是全部)是由于使用示例数据部件,其基于一起提供原子记录存储的bw-树和llama。

因此,本文中所讨论的示例技术可以帮助实现状态事务资源管理器。如本文中所讨论的示例架构框架可以使得这样的资源管理器能够利用可重新使用部件来构建,每个部件本身提供有用的功能。本文中所讨论的示例无锁存和日志结构实现方法使得能够以非常高的性能构造这些部件。这种结构灵活性和有利性能的组合可以提供非常期望的dbms产品。

ii.示例操作环境

本文中所讨论的特征被提供作为示例实施例,其可以以计算领域的技术人员可以理解的很多不同方式实现,而不脱离本文中所讨论的精神。这些特征仅被解释为示例实施例特征,而不旨在被解释为仅限于这些详细描述。

如本文中进一步讨论的,图5a-5b是用于实现高性能事务处理的通用系统500的框图。所示的通用系统500仅旨在示出可以被包括在如本文中所讨论的示例技术中的各种示例功能和/或逻辑,而不旨在在各种硬件和/或软件配置中的实现方面进行限制。计算领域的技术人员将理解,系统500可以在硬件实现、软件实现或其组合中实现。如图5a和5b所示,系统500a可以包括包括至少一个处理器504的设备502。设备502可以包括事务部件506,事务部件506可以包括事务引擎508,事务引擎508包括多版本并发控制(mvcc)模块510,mvcc模块510访问包括相应散列表条目的无锁存散列表512,散列表条目包括表示相应记录的相应桶项516a、...、516n的相应桶514,相应桶项516a、...、516n每个包括指示每个项的在时间上最近读取时间的值518a、...、518n以及描述相应记录的一个或多个相应版本的一个或多个描述521的版本列表520a、...、520n,mvcc模块510使用无锁存散列表512执行时间戳顺序并发控制,每个项的时间上的最近读取时间518a、...、518n包括表示每个项被读取的时间上的最后时间的时间戳值。mvcc模块510可以使用恢复日志572作为相应记录的一个或多个相应版本的源。

例如,每个项的时间最近的读取时间可以包括表示每个项被读取的时间上的最后时间的时间戳值。例如,相应的桶可以存储表示相应记录的相应桶项的相应列表,其中,基于使用比较和交换(cas)操作将新的桶项预先添加到相应的列表中,以及使用cas操作从相应桶项的相应列表中删除桶项以从相应桶项的相应列表中移除最后项相应的bucket项,使用无锁存更新协议来维持相应桶项的相应列表。

例如,可以使用无锁存更新协议,基于使用比较和交换操作(cas)将新的描述预先添加到版本列表,以及使用cas操作从版本列表中删除描述以移除版本列表中的最后描述,来维持描述相应记录的一个或多个相应版本的一个或多个描述的版本列表操作。

根据示例实施例,事务部件506或其一个或多个部分可以包括可以存储在有形计算机可读存储介质上的可执行指令,如下所述。根据示例实施例,计算机可读存储介质可以包括任何数目的存储设备和任何数目的存储介质类型,包括分布式设备。

在本上下文中,“处理器”可以包括被配置为处理与计算系统相关联的指令的单个处理器或多个处理器。因此,处理器可以包括并行和/或以分布式方式执行指令的一个或多个处理器。虽然设备处理器504在图5a中被描绘为在事务部件506外部,但是计算领域的技术人员将理解,设备处理器504可以被实现为单个部件、和/或可以位于事务部件506内部或外部的分布式单元、和/或其任何元件。

例如,系统500可以包括一个或多个处理器504。例如,系统500可以包括存储由一个或多个处理器504可执行的指令的至少一个有形计算机可读存储介质,可执行指令被配置为引起至少一个处理器(或至少一个计算设备)执行与被包括在系统500中的各种示例部件相关联的操作,如本文中所讨论的。例如,一个或多个处理器504可以被包括在至少一个处理装置中。计算领域的技术人员将理解,在不脱离这种讨论的精神的情况下,可以根据本文中的讨论来配置处理器和处理设备的很多配置。

在本上下文中,“部件”或“模块”可以指代可以被配置为执行某些操作的指令或硬件。这样的指令可以被包括在指令的部件组内,或者可以分布在多于一个组上。例如,与第一部件的操作相关联的一些指令可以被包括在与第二部件(或多个部件)的操作相关联的指令组中。例如,本文中的“部件”可以指代可以由位于单个实体中的指令实现的功能类型,或者可以在多个实体上扩展或分布,并且可以与和其他部件相关联的指令和/或硬件交叠。

根据示例实施例,事务部件506可以与一个或多个用户设备相关联地实现。例如,事务部件506可以与服务器通信,如下面进一步讨论的。

例如,可以经由数据库接口部件522访问一个或多个数据库。计算领域的技术人员将理解,存在用于存储本文中所讨论的信息的很多技术,诸如各种类型的数据库配置(例如,关系数据库、分层数据库、分布式数据库)和非数据库配置。

根据示例实施例,事务部件506可以包括可以存储诸如中间结果等对象的存储器524。在本上下文中,“存储器”可以包括被配置为存储数据和/或指令的单个存储器设备或多个存储器设备。此外,存储器524可以跨越多个分布式存储设备。此外,存储器524可以分布在多个处理器之间。

根据示例实施例,用户接口部件526可以管理用户528和事务部件506之间的通信。用户528可以与接收设备530相关联,接收设备530可以与显示器532和其他输入/输出设备相关联。例如,显示器532可以被配置为经由内部设备总线通信或经由至少一个网络连接与接收设备530通信。

根据示例实施例,显示器532可以被实现为平面屏幕显示器、打印形式的显示器、二维显示器、三维显示器、静态显示器、移动显示器、传感显示器、例如触觉输出、音频输出和用于与用户(例如,用户528)通信的任何其他形式的输出。

根据示例实施例,事务部件506可以包括网络通信部件534,其可以管理事务部件506和可以经由至少一个网络536与事务部件506通信的其他实体之间的网络通信。例如,网络536可以包括因特网、至少一个无线网络或至少一个有线网络中的至少一个。例如,网络536可以包括蜂窝网络、无线电网络、或者可以支持用于事务部件506的数据传输的任何类型的网络。例如,网络通信部件534可以管理事务部件506和接收设备530之间的网络通信。例如,网络通信部件534可以管理用户接口部件526和接收设备530之间的网络通信。

例如,历元引擎540可以通过拒绝重新使用相应的释放的存储器位置的许可直到活动线程不能解除引用指向相应的释放存储器位置的指针来管理释放的存储器位置的重新使用。

例如,描述相应记录的一个或多个相应版本的一个或多个描述521中的每个可以包括标识与相应记录的相应版本相关联的创建事务的事务标识符(tid)542、指示存储在恢复日志中的对应于版本偏移值的位置处的相应记录的相应版本的副本的引用偏移的版本偏移值544、以及指示创建事务是否已经中止的标志值546。

例如,事务部件506包括事务表550,事务表550包括表示相应事务的相应条目552a、...、552n。例如,相应的条目552a、...、552n可以每个包括事务标识符(tid)554a、...、554n,指示相应事务的开始时间的时间戳值556a、...、556n、表示由事务进行的更新的列表558a、...、558n、以及指示相应事务是活动的、提交的还是中止的标志值560a、...、560n。例如,事务表包括表示由事务引擎508周期性确定的最旧的活动事务的条目562,作为活动的并且与最旧的时间戳相关联的相应事务中的一个。

例如,事务引擎508发起针对相应只读事务的相应提交操作的相应提交记录写入操作,以存储用于相应只读事务的提交记录564。例如,作为到目前为止通过每个相应的只读事务已经读取的最近读取版本的提交稳定性状态的相应确定的结果,事务引擎508发起针对相应只读事务的相应提交操作的相应提交记录写入操作。

例如,事务部件506包括版本管理器570,版本管理器570包括恢复日志572,恢复日志572在恢复日志缓冲区574a、...、574n中存储纯重做记录和表示与密钥值储存库相关联的相应记录的版本的副本的记录条目。在本上下文中,“纯重做”记录指的是没有撤销记录的重做记录,如上所述。

例如,恢复日志在恢复日志缓冲区中存储与相应事务相关联的纯重做记录以及表示与密钥值储存库相关联的相应记录的版本的副本的记录条目,以代替存储事务撤销记录。

例如,事务引擎508可以批准当前记录的事务更新,发起在恢复日志572中的恢复日志缓冲区574a、...、574n中当前记录的更新版本的副本的存储,并且发起在mvcc无锁存散列表512中生成新条目,该新条目包括指示恢复日志缓冲区574a、...、574n中的当前记录的更新版本的位置的偏移值、以及负责当前记录的事务更新的事务的指示。

例如,版本管理器570将日志缓冲区574a、...、574n发送到接收日志缓冲区574a、...、574n的事务部件代理580,并且将提交的事务发布到与提交的事务相关联的记录的稳定存储。例如,事务部件代理580可以远离事务部件506定位,基本上靠近与稳定存储装置相关联的数据部件582的位置,或者在事务部件506的本地。例如,事务部件代理580将提交的事务发布到用于与提交的事务相关联的记录的稳定存储,由包括密钥值储存库的数据部件的数据部件582管理稳定存储装置。

例如,事务部件代理580维持对数据部件的恢复应用的进展的追踪,并且向事务部件506提供追踪的进展的概述。

例如,事务部件代理580将提交的事务发布到与提交的事务相关联的记录的稳定存储装置,由包括密钥值储存库的数据部件的数据部件582管理稳定存储装置。

例如,事务部件代理对每个接收的日志缓冲区574a、...、574n执行第一扫描,以确定从事务部件接收的提交的事务。例如,事务部件代理针对在第一扫描中确定的提交事务,执行每个接收的日志缓冲区的第二扫描,以在数据部件处应用提交的事务的操作。

例如,对于与被确定为尚未持久提交的相应事务相关联的相应版本,事务部件代理580存储与相应版本相关联的信息。例如,事务部件代理580使用日志序列号(lsn)586对追踪对数据部件582的应用操作的进展。

例如,版本管理器570维持用于存储从数据部件582读取的预先存在的记录版本的副本的记录读取高速缓存588,其中记录读取高速缓存588包括被填充并以先进先出(fifo)顺序被清理的无锁存的日志结构缓冲区。

例如,事务部件506包括版本管理器570,版本管理器570包括恢复日志572,恢复日志572使用用于新到达的恢复日志缓冲区条目的存储装置的动态分配被构造为多个无锁存恢复日志缓冲区574a、...、574n。例如,版本管理器570维持指示在特定恢复日志缓冲区574a、...、574n内新请求的存储装置分配的下一可用位置的偏移变量值590a、...、590n,偏移变量值590a、...、590n经由用于将所请求的分配的大小添加到偏移变量值590a、...、590n的原子获取和增量(fai)操作被更新。根据本文中所讨论的示例技术,在任何时间只有一个“活动”恢复日志缓冲区。因此,只有一个被更新的偏移。此外,每次只有一个缓冲区将具有多于零个活动写入器。例如,偏移变量值590a、...、590n还指示特定恢复日志缓冲区574a、...、574n的活动用户的当前数目。

计算领域的技术人员将理解,在不脱离本文中的讨论的精神的情况下,可以使用很多不同的技术来实现高性能事务处理。

iii.流程图说明

本文中所讨论的特征被提供作为可以以计算领域的技术人员可以理解的很多不同方式实现的示例实施例,而不脱离本文的讨论的精神。这些特征仅被解释为示例实施例特征,而不旨在被解释为仅限于这些详细描述。

图6a-6e是示出根据示例实施例的图5a-5b的系统的示例操作的流程图。如图6a的示例所示,可以访问包括相应散列表条目的无锁存散列表,散列表条目包括表示相应记录的相应桶项的相应桶,相应桶项每个包括指示每个项的在时间上最近读取时间的值、以及描述相应记录的一个或多个相应版本的一个或多个描述的版本列表(602)。可以使用无锁存散列表来执行时间戳顺序并发控制,每个项的时间最近的读取时间包括表示每个项被读取的时间上最后的时间的时间戳值(604)。例如,通过拒绝重新使用相应的释放的存储器位置的许可直到活动线程不能解除引用指向相应释放的存储器位置的指针来管理释放的存储器位置的重新使用(606)。

例如,描述相应记录的一个或多个相应版本的一个或多个描述中的每个包括标识与相应记录的相应版本相关联的创建事务的事务标识符(tid)、指示存储在恢复日志中对应于版本偏移值的位置处的恢复日志中的相应记录的相应版本的副本的引用偏移的版本偏移值、以及指示创建事务是否已中止的标记值(608)。

例如,在图6b的示例中,事务表包括表示相应事务的相应条目(610)。例如,相应条目每个包括事务标识符(tid)、指示相应事务的开始时间的时间戳值、表示由事务进行的更新的列表、以及指示相应事务是活动的、提交的、还是中止的标志值。例如,事务表包括表示由事务引擎周期性确定的最旧的活动事物的条目,为活动的并且与最旧时间戳相关联的相应事物中的一个(612)。

例如,针对相应只读事务的相应提交操作,相应提交记录写入操作被发起,以存储用于相应只读事务的提交记录(614)。例如,作为到目前为止通过每个相应的只读事务中的已经读取的最近读取版本的提交稳定性状态的相应确定的结果,针对相应的只读事务的相应提交操作,相应提交记录写入操作被发起(616)。

例如,在图6c的示例中,版本管理器包括使用用于新到达的恢复日志缓冲区条目的动态存储装置分配被构造为多个无锁存恢复日志缓冲区的恢复日志(618)。例如,维持偏移变量值,偏移变量值指示在特定恢复日志缓冲区内的新请求的存储装置分配的下一可用位置,偏移变量值经由原子获取和增量(fai)操作来更新以向偏移变量值添加所请求的分配的大小(620)。例如,偏移变量值还指示特定恢复日志缓冲区的活动用户的当前数目(622)。

例如,在图6d的示例中,版本管理器包括恢复日志,恢复日志在恢复日志缓冲区中存储纯重做记录和表示与密钥值储存库相关联的相应记录的版本的副本的记录条目(624)。例如,当前记录的事务更新被批准(628),在恢复日志中,在恢复日志缓冲区中当前记录的更新版本的副本的存储被发起(630),并且在mvcc无锁存散列表中,新的条目被生成,该条目包括指示恢复日志缓冲区中的当前记录的更新版本的位置的偏移值以及负责当前记录的事务更新的事务的指示(632)。

例如,维持记录读取高速缓存用于存储从数据部件读取的预先存在的记录版本的副本,其中记录读高速缓存包括以先入先出(fifo)顺序被填充和清除的无锁存的日志结构缓冲区(634)。

例如,在图6e的示例中,日志缓冲区被发送到事务部件代理,事务部件代理接收日志缓冲区并且将提交的事务发布到与提交的事务相关联的记录的稳定存储装置,其中事务部件代理远离事务部件,基本上接近与稳定存储装置相关联的数据部件的位置,或在事务部件的本地(636)。例如,提交的事务被发布到与提交的事务相关联的记录的稳定存储装置(638)。

例如,维持对数据部件的恢复应用的进展的追踪,并且提供追踪的进展的概述(640)。例如,将提交的事务发布到与提交的事务相关联的记录的稳定存储(642)。

例如,每个接收的日志缓冲区的第一扫描被执行以确定接收到的提交的事务(644)。例如,对于在第一扫描中确定的提交事务,每个接收的日志缓冲区的第二扫描被执行,以在数据部件处应用提交的事务的操作(646)。

例如,对于与被确定为尚未持久提交的相应事务相关联的相应版本,与相应版本相关联的信息被存储(648)。例如,在某一时刻,一旦已知事务被提交,如果其任何更新被存储在该“侧边缓冲区”中,那么也将应用这些操作。例如,使用日志序列号(lsn)对来追踪对数据部件的应用操作的进展(650)。

图7是示出根据示例实施例的图5a-5b的系统的示例操作的流程图。如图7的示例所示,使用恢复日志作为相应记录的一个或多个相应版本的源,无锁存散列表可以被访问,该无锁存散列表包括相应散列表条目的相应散列表条目,散列表条目包括表示相应记录的相应桶项的相应桶,相应桶项每个包括指示每个项的在时间上最近读取时间的值以及描述相应记录的一个或多个相应版本的一个或多个描述的版本列表(702)。可以使用无锁存散列表对密钥值储存库执行时间戳顺序并发控制(704)。在恢复日志缓冲区变得持久之后,存储在恢复日志中的提交记录用作事务结果消息的延迟传递的队列,以代替使用单独的排队机制。

图8是示出根据示例实施例的图5a-5b的系统的示例操作的流程图。如图8的示例所示,使用用于新到达的存储装置实体条目的动态存储装置分配被构造为多个存储装置缓冲区的存储装置实体被访问(802)。指示在特定存储装置缓冲区内新请求的存储装置分配的下一可用位置的偏移变量值被维持(804)。经由原子获取和增量(fai)操作来更新偏移变量值,以将所请求的分配的大小添加到偏移变量值,偏移变量值还指示特定存储缓冲区的活动用户的当前数目。使用存储装置缓冲区之一中的动态存储装置分配来发起存储装置实体中的条目的存储(806)。偏移变量值被更新(808)。

例如,存储实体包括使用用于新到达的恢复日志缓冲区条目的动态存储装置分配被构造为多个无锁存恢复日志缓冲区的恢复日志(810)。

例如,通过确定由原子fai操作产生的偏移变量值是否指示大于特定存储缓冲区中的一个的范围的缓冲区偏移值来确定特定存储装置缓冲区中的一个缓冲区是否被密封(812)。

例如,在确定特定存储缓冲区中的一个是否被密封之后,写入操作被发起来将特定存储装置缓冲区中的密封的一个缓冲区写入辅助存储装置的写操作(814)。

以下讨论旨在提供对可以在上面讨论的tc示例的实现中使用的示例技术的进一步解释。例如,讨论包括示例数据部件技术。

可能需要很多索引应用以便以高吞吐量来维持快速写入。对于这样的应用,在写入(查找密钥的现有值)之前所需的读取输入/输出(i/o)可能是用于索引插入吞吐量的瓶颈。存在广泛的应用类别(例如,反向索引),其中与密钥相关联的值可以在不知道现有值的情况下被更新(例如,对于项的发布列表添加新的文档标识符(id))。对于这样的应用,更新不需要涉及读取i/o,但是底层密钥值储存库可能不支持这样的优化。根据本文中所讨论的示例技术,可以在通用密钥值储存库的框架内使用用于“盲”更新(不需要读取来执行写入操作)的机制,而不对高级应用进行任何假定。与本文中所讨论的示例密钥值储存库的日志结构存储装置组织一起,可以以可接近顺序存储写入带宽的吞吐量来维持密钥更新。

根据本文中所讨论的示例技术,还讨论了用于对被包括在与示例密钥值储存库相关联的逻辑页面中的记录进行“盲”更新(不需要读取来执行写入操作)的机制。根据与本文中所讨论的tc相关联的示例技术,可以支持“盲写”,即使在更新版本之前读取版本。例如,如果读取并随后更新版本,则版本被缓存在tc中。用户可以知道他/她构造的更新与由于tc中的mvcc而读取的版本相关。当任何这样的更新被应用于dc时,不需要在dc处读取先前版本以便执行更新,因为在dc处可以利用盲更新来执行更新。

在本上下文中,“密钥值储存库”通常可以指代可以存储相应键(或项)和值的对以及当相应键是已知时的检索值的数据库管理系统的形式。例如,密钥值储存库可以包括具有与相应项相目关联的对象的列表的项(例如,密钥)。例如,密钥值储存库可以存储包括与相应项相关联的文档标识符的相应列表的索引。

例如,在反向索引环境(例如,lucene)中,常见的方法是“分段索引”。当文档到达时,段索引被一一写入。尽管这样的写入避免了读取,但它们可能使查询服务路径复杂化。例如,查询可以扫描多个分段索引,因此用户可以在查询时间和结果的新鲜度之间做出折衷。

在本上下文中,“反向索引”通常可以指代存储从内容(例如,字或数字)到其在数据库文件中或在文档或文档集合中的位置的映射的索引数据结构。例如,当文档被添加到数据库时,以增加的处理为代价,可以使用反向索引来实现快速全文本搜索。例如,反向索引可以包括存储对于每个字的文档的引用的列表的记录级反向索引(例如,反向文件索引或反向文件),或者可以另外存储文档内的位置词的字级反向索引(例如,完全反向索引或反向列表)。例如,在通用密钥值储存库环境(例如,日志结构合并树(lsm-树))中,可能不支持语义值合并。因此,涉及读取i/o以执行写入,并且这可能减慢索引插入的速度。

根据本文中所讨论的示例技术,可以在驻留在存储装置(例如,磁盘或闪存)上的索引页的存储器中保持细长的页面存根。该页面存根存储信息,该信息帮助将该页的其余部分定位在辅助存储装置上(例如,存储指示页的其余部分所在的位置的位置信息)。例如,它还可以存储一些访问方法特定信息。例如,它可以存储与索引页面相关联的密钥边界(例如,与索引页面相关联的索引的最小和最大密钥值)。因此,例如,当执行盲更新时,存根可以提供帮助确定特定密钥属于(或不属于)特定页面的信息。例如,如果页在处理期间被分割,则存根具有关于边界的信息。

在本上下文中,“页面”可以指代存储装置中的对象,其可以经由物理存储装置地址来访问。如本文中所使用的,“页面”可以与灵活尺寸相关联,并且可以表示可以被分布在多个不连续存储的存储装置段上的存储装置页面单元。存储装置可以包括易失性和/或稳定存储装置。

在本上下文中,“逻辑页面”可以包括基页和指示对页面的更新的零个或多个增量记录,因此允许在页面被冲刷时将页面以分片写入闪存。因此,闪存上的逻辑页面可以对应于可能在链接在一起的不同物理设备块上的记录,例如使用文件偏移量作为指针。此外,物理块可以包括来自多个逻辑页面的记录。此外,逻辑页面可以指代存储相关信息的位置。

根据本文中所讨论的示例技术,当对页面上的密钥的盲更新到达时,这可以作为“增量记录”(例如通过链接到现有页面存根)而预先附加到页面。可能不需要读取i/o,因为页面存根足以更新成功。

这样的增量记录可以最终使用“增量页面冲刷”被冲刷到存储装置,其中页面的未冲刷部分被复制到基本上大的冲刷缓冲区,该冲刷缓冲区可以使用单写入i/o(例如,使用llama)被附加到存储装置上的“数据日志”的末尾,因此利用全存储装置写入带宽。在本上下文中,“冲刷”操作可以指代通过将页面复制到输出缓冲区将页面从主存储器(例如,高速缓存存储装置)传送到辅助存储装置。

根据本文中所讨论的示例技术,可以通过预先附加描述对存在于存储器中的页面存根的更新的信息而有利地避免(或实质上避免)在这样的盲更新之前执行读取i/o的需要。根据本文中所讨论的示例技术,可以例如使用单个写入i/o来执行将存储这样的密钥值更新的页面附加到存储装置的大冲刷缓冲区的增量冲刷。

图9描绘了对索引的示例更新操作。如图9所示,并且根据本文中所讨论的示例技术,可以与存储基页934的固态设备(ssd)932相关联地执行盲更新。如图9所示,基页934可以包括可以被更新的多个记录960a、960b、960c。例如,如果记录不存在,则upsert操作可以插入记录,并且如果记录存在(例如,经由对基页934的“整个记录”更新),则upsert操作可以用记录的更新版本代替记录。根据本文中所讨论的示例技术,页面存根938可以用于将所请求的盲更新970、972和974附加到基页934中的记录(不读取基页934),直到它们可以被进一步处理。

例如,页面存根938可以被附加到基页934。可以接收用于请求向基页934添加记录rj的第一盲更新请求970以用于处理。盲更新请求970可以被预先附加到页面存根938,从而更新页面存根938的当前状态以包括针对页面934盲更新请求970。

如图9所示,可以接收用于请求向包括基页934和先前更新请求970的逻辑页面添加记录ri的第二盲更新请求972以用于处理。盲更新请求972可以预先附加到页面存根938,从而更新页面存根138的当前状态以包括对于基页934的盲更新请求972(以及盲更新请求970)。

如图9所示,可以接收请求关于包括基页934以及先前更新请求970和972的逻辑页面的记录r2的添加/更新(例如,其可以包括对现有记录r2的代替)的第三盲更新请求974用于处理。盲更新请求974可以被预先附加到页面存根938以及先前的更新请求970和972,从而更新页面存根938的当前状态以包括对于基页934的盲更新请求974(以及盲更新请求970、972)。

可以利用基页934对盲更新970、972、974执行合并操作980,这可能导致基页934的至少一部分被读入存储器。可以执行合并操作980以合并盲更新970、972、974与基页934以生成合并的页面982(从基页934)。

尽管图9仅示出存储在存储设备中的几个页面,但是计算领域的技术人员将理解,在不脱离本文中所讨论的精神的情况下,很多页面可以存储在各种存储设备中。

例如,bw-树和llama技术(下面进一步讨论)可以用于反向索引应用,以提供用于索引插入/更新的持续吞吐量。例如,与bw-树和llama技术一起使用的日志结构存储设计可以使用用于写入的完全存储吞吐量。然而,索引插入/更新可能涉及页面读取,并且这样的读取可能干扰持续写入吞吐量的递送,特别是在硬盘上。

例如,bw-树可以提供类似结构化查询语言(sql)的语义(参见例如发明人为davidlomet等人的2012年6月20日提交的标题为“structuringstoragebasedonlatch-freeb-trees”的共同拥有的美国专利申请序列号13/527,880以及j.levandoski等人的2“thebw-tree:ab-treefornewhardwareplatforms”,第29届ieee国际数据工程会议(icde2013),2013年4月8日-11日)。因此,如果它已经存在,插入对密钥执行查找并返回错误。更新对密钥执行查找,如果不存在则返回错误。

在索引更新期间的上述读取源可能干扰数据库应用的持续索引插入/更新吞吐量。可以如下避免(或基本上避免)索引更新期间的这样的读取源:索引可以有利地避免类似sql的插入/更新语义,而不是在描述对密钥的增量更新的页面上发布增量记录。因此,插入/更新可以不涉及读取整个页面。

盲写(即,不涉及读取先前版本的更新)可以有利地包括避免读取先前版本以及在事务部件(tc)处同时更新的可能性,如下面进一步讨论的。下面讨论用于处理盲写入的示例技术和它们被应用到的聚合对象。

根据本文中所讨论的示例技术,本文中可以被称为llama(无锁存日志结构访问方法感知)的示例系统包括用于(至少)最近开发的硬件环境的缓存和存储装置子系统(例如,闪存,多核),但是计算领域的技术人员将理解这样的示例技术不仅限于最近开发的硬件。

例如,llama可以支持用于任意选择的面向页面的访问方法的应用编程接口(api),其提供高速缓存和存储管理,以优化处理器高速缓存和辅助存储装置。例如,高速缓存(cl)和存储(sl)层可以使用分离页面的逻辑和物理位置的公共映射表。例如,高速缓存层(cl)可以经由其映射表上的无锁存的比较和交换原子状态变化来支持数据更新和管理更新(例如,用于索引重组)。

例如,存储层(sl)可以使用相同的映射表来处理每次页面冲刷时由日志构造产生的页面位置改变。例如,可以使用无锁存bw-树实现(例如,使用bw-树的实现,作为有序b树样式索引的示例)。在本上下文中,“无锁存”可以指代允许多个线程对页面的并发访问。

本文中所讨论的示例技术可以提供可以虚拟化页面的位置和大小二者的映射表。例如,这种虚拟化可以用于主存储器设计和稳定的存储装置设计(例如,日志结构存储装置设计),如本文中进一步讨论的。

本文中所讨论的示例技术可以将访问方法层与高速缓存/存储装置管理分离。作为示例,本文中所讨论的技术可以用于实施预写日志协议。例如,在冲刷页面之前,常规数据库内核可以检查页面日志序列号(lsn)以确定在事务日志中是否存在尚不稳定的更新。例如,llama高速缓存管理可以利用示例增量更新来“交换”部分页面。例如,它可以从缓存中丢弃已经存在于辅助存储装置上的页面部分(不包括最近的增量更新)。例如,访问方法层可以定期冲刷事务日志检查点。因此,高速缓存管理器将找到足够的候选(可能是部分)页面以满足任何缓冲区大小约束。

本文中所讨论的示例技术可以提供使得大量访问方法(即,不仅仅是单个示例)能够通过实现提供它们的子系统层来利用这些技术的框架。此外,可以实现日志结构存储,用于将数据写入提供有利效率的辅助存储。因此,访问方法可以集中在其索引的主存储器方面,并且本文中所讨论的示例技术可以提供用于实现类似于bw-树的性能度量的性能度量的框架。

例如,诸如llama等技术通过其api可以提供无锁存页面更新,其经由映射表上的比较和交换(cas)原子操作在主存储器中实现。

例如,在管理高速缓存时,诸如llama等技术可以通过仅从存储器中丢弃页面的先前冲刷部分来回收主存储器,从而不涉及任何输入/输出(i/o)操作,即使当换出“脏”页时。因此,诸如llama等技术可以能够在没有来自其访问方法用户的输入的情况下控制其缓冲区高速缓存存储器大小。

例如,对于辅助存储装置的有效管理,诸如llama等技术可以利用日志结构。例如,诸如llama技术可以通过使用部分页面冲刷和基本上没有空白空间的页面(即,基本上100%的存储利用率)来与常规日志结构相比提高性能。当页面被冲刷时,这些可以减少输入/输出操作(i/o)的数目和每页所消耗的存储装置量,并且因此可以减少当使用日志结构时可能经历的写入放大。此外,所有与存储相关的操作可以是完全无锁存的。

例如,诸如llama的技术可以提供(至少)有限形式的系统事务。在这个意义上,系统事务不是用户级事务,而是利用日志结构存储,纯粹提供对访问方法的“私有使用”(例如,用于索引结构修改(smo))的原子性。例如,这可以使得索引在它们增长时适应,同时并发更新继续。

例如,bw-树结构可以包括一种类型的无锁存b树结构。例如,可以基于向先前页面状态预先附加更新增量来执行对bw-树节点的更新。因此,bw-树可以是无锁存的,因为它可以允许多个线程对页面的并发访问。因为这种增量更新保持页面的先前状态,所以其可以提供改进的处理器高速缓存性能。

图10是示例b树原子记录存储架构(例如,示例bw-树架构)的框图1000。访问方法层或b树层1002是顶层,如图10所示。b树层1002与缓存层1004交互,缓存层1004是中间层。示例高速缓存管理器可以被构建在存储层1006之上,存储层1006可以支持示例日志结构闪存储存库。根据本文中所讨论的示例实施例,日志结构储存库可以管理闪存和磁盘存储装置。示例映射表1008可以被包括在高速缓存层1004中。

使用bw-树的示例技术可以进一步提供也是无锁存的并且可以使用b链路树型侧指针的分页技术。分页(和其他结构修改操作)在主存储器内和当被使得稳定时可以是原子的。例如,原子记录储存库可以基于bw-树架构来实现。

计算领域的技术人员将理解,在不脱离本文中的讨论的精神的情况下,可以有很多方式来实现本文中讨论的高性能事务处理。

在llama层(参见例如由davidlomet等人于2013年6月22提交的题为“latch-free,log-structuredstorageformultipleaccessmethods”的共同拥有的美国专利申请序列号13/924,567、以及levandoski等人的“llama:acache/storagesubsystemformodernhardware”,vldbendowmentproceedings,卷6,10号(第39届国际大数据库会议,2013年8月26日),页面是被操作的抽象。为了支持盲写入,llama可以使得页面被更新,而不管它们是在高速缓存中还是在稳定存储装置中。

根据本文中所讨论的示例技术,示例更新接口可以支持(至少)增量更新(更新-d)和代替更新(更新-r)(例如,当整个页面在高速缓存中可用时)。

根据本文中所讨论的示例技术,llama可以有利地支持部分页面,包括部分页面交换(swap-出)。

图11示出了用于高速缓存/存储装置层的访问方法的示例架构分层。如图11所示,访问方法层1102是顶层。访问方法层1102与缓存层1104交互,缓存层1104是中间层。应用程序接口(api)1106可以用于访问方法层1102和缓存层1104之间的活动。示例存储装置层1108可以与映射表1110交互,映射表1110可以在缓存层1104和存储器层1108之间被共享。例如,llama1112包括高速缓存层1104和存储装置层1108。例如,存储装置层可以支持日志结构闪存存储。根据本文中所讨论的示例技术,日志结构存储可以管理闪存和磁盘存储装置。例如,该设计可以适合作为独立或deuteronomy样式的原子记录储存库(ars)。

例如,诸如llama等技术可以支持页面抽象,以支持用于高速缓存/存储装置层的访问方法实现。此外,可以在顶部添加事务部件(例如,deuteronomy类型的事务部件)。图12是用于多访问方法的无锁存日志结构存储的示例架构的框图。如图12所示,事务部件1202可以支持事务密钥值储存库,并且可以与可以包括原子密钥值储存库的数据部件1204一起操作。如图12所示,数据部件1204可以包括无锁存有序索引1206和/或无锁存线性散列索引1208。如图12所示,数据部件1204还可以包括示例无锁存日志结构访问方法感知(llama)存储装置引擎1210(例如,图11的llama1112)。

示例api1106可以是“数据不透明的”,这表示示例llama实现不“查看”(例如,不检查或分析或取决于)访问方法(例如,访问方法层1102)在页面或增量记录中放入什么内容,并且独立于通过访问方法在页面或增量记录中提供的内容而动作。因此,示例llama实现可以响应于访问方法已经选择了要在其上操作的页面的特定操作而动作,并且llama执行的操作不取决于所提供的数据参数。

如图13所示,可以经由映射表1304访问页面1302,映射表1304在主存储器高速缓存1312中中或者在辅助存储装置1314上将页面标识符(pid)1306映射到状态1308(例如,经由存储在映射表1304中的“物理地址”1310)。例如,主存储器高速缓存1312可以包括随机存取存储器(ram)。例如,辅助存储装置1314可以包括闪存。例如,页面1302可以根据需要从辅助存储装置1314被读取到主存储器高速缓存1312中,它们可以被冲刷到辅助存储装置1314,并且它们可以被更新以在高速缓存1312中改变页面状态。例如,根据本文中所讨论的示例技术,基本上所有页面状态改变(数据状态和管理状态两者)可以被提供为原子操作。如图13所示,示例物理地址1310可以包括指示物理地址是否与闪存或存储器(例如,高速缓存)存储相关联的闪存/存储器标志1316(例如,对于1比特,如示例中所示),地址字段1318(至少)用于地址本身(例如,对于63比特,如示例所示)。计算领域的技术人员将理解,在不脱离本文中的讨论的精神的情况下,存在表示“物理地址”(例如,除了64比特表示)的很多方式。

根据本文中所讨论的示例技术,llama通过其api可以经由映射表1304上的比较和交换(cas)原子操作来提供无锁存页面更新(例如,以代替通过阻塞线程从并发访问保护页面的传统锁存)。例如,cas策略可以有利地提高处理器利用率并且改善多核缩放。

根据本文中所讨论的示例技术,在管理高速缓存时,llama可以通过仅从存储器中丢弃页面的先前冲刷部分来回收主存储器,从而即使在换出“脏”页时也不使用任何i/o。因此,诸如llama的示例架构可以控制其缓冲区高速缓存存储器大小,而不需要由其访问方法用户检查存储在页面中的数据(例如,作为示例架构,诸如llama不知道事务和预写日志)。

诸如llama等示例架构可以使用日志结构来管理辅助存储装置(例如,以提供避免随机写入,减少经由大多页缓冲区的写入的数量以及涉及闪存的损耗均衡的优点)。此外,诸如llama等示例架构可以有利地提高具有基本上没有空白空间(即基本上100%利用率)的部分页面冲刷和页面的性能(例如,与常规日志结构相比)。例如,这些可以减少当页面被冲刷时每页消耗的i/o和存储装置的数目,并且因此可以减少当使用日志结构时可能遇到的写入放大。此外,基本上所有与存储装置相关的操作可以是完全无锁存的。

另外,诸如llama等示例架构可以支持(至少)有限形式的系统事务(关于系统事务,参见例如d.lomet等人的“unbundlingtransactionservicesinthecloud”,conferenceoninnovativedatasystemsresearch(cidr),2009)。例如,系统事务可以不是用户事务,而是可以纯粹地为访问方法的“私有使用”提供原子性(例如,对于索引结构修改(smo)-参见例如c.mohan等人的“aries/im:anefficientandhighconcurrencyindexmanagementmethodusingwrite-aheadlogging”,inproceedingsofthe1992acmsigmodinternationalconferenceonmanagementofdata(sigmod'92),1992,pp.371-380)。例如,与事务日志分开记录的系统事务可能有效的属性是deuteronomy方法对分解数据库内核的有利理解的示例。

在设计诸如llama等示例系统时,设计目标可以包括尽可能作为“通用目的”的目标,这有时可能导致目标“尽可能低”。然而,对于诸如llama的示例系统是“通用的”,可能期望在尽可能少地了解访问方法在使用其设施时所做的有效操作。因此,诸如llama等示例系统的操作可以是“基元(primitive)”,目标是高速缓存管理和页面的更新。例如,诸如llama等示例系统可以包括一些附加的设施以支持可以有利地包括用于smo(例如,页面拆分和合并)的基元事务机制。

根据本文中所讨论的示例技术,诸如llama的示例系统可以在关于日志序列号(lsn)、预写日志或用于事务日志的检查点的接口中不包括任何内容。根据本文中所讨论的示例技术,诸如llama的示例系统可以不包括用于用户操作的幂等性测试。此外,根据本文中所讨论的示例技术,诸如llama的示例系统可以不包括事务恢复(例如,根据本文中所讨论的示例技术,其可以由使用诸如llama等示例系统的访问方法来处理)。

示例性访问方法可以响应于用户操作而改变状态。例如,用户可能想要创建(c)、读取(r)、更新(u)或删除(d)记录(例如,crud操作)。根据本文中所讨论的示例技术,诸如llama的示例系统可以不直接支持这些操作。相反,示例性访问方法可以将它们实现为对llama页面的状态的更新。

例如,还可以存在作为示例访问方法操作的一部分的结构改变。例如,bw-树页面分割可以包括将分割增量发布到原始页面o,使得搜索者知道新页面现在包含o中的密钥的子范围的数据。例如,这些也可以被处理为对llama页面o的更新。

根据本文中所讨论的示例技术,诸如llama的示例系统可以支持两种形式的更新,例如增量更新和代替更新。例如,访问方法可以根据用户的愿望来选择利用这些形式的更新。例如,bw-树可以进行一系列增量更新,并且在某些点决定通过将增量更新应用于基页来“合并”并且优化页面。例如,bw-树然后可以使用代替更新来生成新的基页。

根据本文中所讨论的示例技术,诸如llama的示例系统可以在如本文中所讨论的更新操作和代替操作期间保持关于在辅助存储装置中的页面的物理位置的信息,使得系统100具有用于读取页面的辅助存储装置页面位置信息,假定它被换出主存储器高速缓存并且用于垃圾收集则重新读取页,如本文进一步讨论的。因此,系统300可以记住先前的页面位置和稳定的页面状态信息。

例如,增量更新可以被指示为更新-d(pid,进-ptr,出-ptr,数据)。例如,增量更新可以预先附加描述对页面的先前状态的改变的增量。例如,对于bw-树,更新-d的“数据”参数可以包括至少<lsn,关键词,数据>,其中lsn启用幂等性。例如,“进-ptr”指向页面的先前状态,并且“出-ptr”指向页面的新状态。

例如,代替更新可以被指示为更新-r(pid,进-ptr,出-ptr,数据)。例如,代替更新可能导致页面的完全新的状态。在使用更新-d时保留的先前状态可以用“数据”参数代替。因此,“数据”参数包含具有增量“折叠”的页面的整个状态。

例如,“读取”可以被指示为读取(pid,出-ptr)。例如,读取可以经由“出-ptr”返回页面的主存储器中的地址。如果页面不在主存储器中,则映射表条目可以包含辅助存储装置地址。例如,在这种情况下,页面可以被读取进入主存储器中,并且映射表可以用新的主存储器地址来更新。

除了支持数据操作之外,本文中所讨论的示例系统(例如,llama)可以提供用于管理页面的存在、位置和持久性的操作。为了调整存储的数据量,访问方法可以从其被管理的收集中添加或减去页面。为了提供状态持久性,访问方法可以不时地将页面冲刷到辅助存储装置。为了管理该持久性,可以适当地注释页面(例如,使用对数序列号(lsns))。例如,页面管理器可以被配置为控制页面上的冲刷操作、分配操作和自由操作。

例如,冲刷操作可以被指示为冲刷(pid,进-ptr,出-ptr,注释)。例如,冲刷可以将页面状态复制到日志结构储存库(lss)i/o缓冲区中。在对主存储器的影响中,冲刷可能在某种程度上类似于更新-d,因为它将增量(带有注释)添加到先前状态。该增量可以被标记为“冲刷”。根据本文中所讨论的示例技术,诸如llama的示例系统可以在冲刷增量中存储页面所在的lss辅助存储装置地址(称为闪存偏移量)和调用者“注释”。例如,冲刷可能无法向用户确保i/o缓冲区在返回时是稳定的。

例如,缓冲区管理器可以被配置为经由无锁存更新操作来控制对日志结构辅助存储装置缓冲区的更新。因此,例如,多个线程可以经由无锁操作同时更新日志结构辅助存储装置缓冲区。

例如,“使稳定”操作可以被指示为mk_稳定(lss地址)。例如,mk_稳定操作可以确保被冲刷到lss缓冲区的页面直到lss地址自变数(argument)在辅助存储装置上是稳定的。当mk_稳定返回时,提供的lss地址和所有较低的lss地址被确保在辅助存储装置上是稳定的。

例如,“高稳定”操作可以被指示为hi_稳定(出-lss地址)。例如,hi_稳定操作可以返回在辅助存储装置上当前稳定的最高lss地址。

例如,页面管理器可以被配置为基于将第一页面的页面状态的副本发起到辅助存储装置缓冲区中以及发起将冲刷增量记录预先附加到页面状态来发起缓存层存储装置中的第一页面到辅助存储装置中的位置的冲刷操作,冲刷增量记录包括指示第一页面在辅助存储装置中的存储位置的辅助存储装置地址和与呼叫者相关联的注释。

例如,缓冲区管理器可以被配置为发起稳定性操作,用于确定冲刷到具有较低地址直到第一辅助存储地址自变数的辅助存储缓冲区的页面在辅助存储装置中稳定。

例如,“分配”操作可以被指示为分配(出-pid)。例如,分配操作可以返回在映射表中分配的新页面的pid。所有这样的页面可以被持久地记住,因此分配可以被包括作为系统事务的一部分(如下面进一步讨论的),其可以自动地冲刷其所包括的操作。

例如,“释放”操作可以被指示为释放(pid)。例如,释放操作可以使由pid标识的映射表条目可用于重新使用。在主存储器中,pid可以被放置在用于当前历元的pid的待定释放列表上(如下面进一步讨论的)。再次,因为活动页面可能需要被记住,释放可以被包括作为系统事务的一部分。

根据本文中所讨论的示例技术,示例llama系统事务可以用于为结构修改(例如,smo)提供相对持久性和原子性(全部或全部)。例如,lss及其面向页面的记录可以用作“日志记录”。例如,除了改变高速缓存中的页面状态之外,事务内的所有操作还可以自动被冲刷到存储器内lssi/o缓冲区。例如,对于严格为“页面”储存库的示例lss,每个lss条目可以包括页面的状态。

如下面进一步讨论的,在主存储器中,事务内的所有这样的操作可以被隔离地保持,直到事务提交。例如,在提交时,事务中的所有页面改变可以被原子地冲刷到lss缓冲区。例如,在中止时,可以丢弃所有改变。例如,系统事务管理器可以被配置为提交事务和中止事务。

例如,可以经由llama支持的操作来发起和终止系统事务。例如,“事务开始”操作可以被指示为t开始(出-tid)。例如,可以发起由事务id(tid)标识的事务。这可以涉及将其输入由示例llama高速缓存层(cl)管理器维持的活动事务表(att)。

例如,“事务提交”操作可以被指示为t提交(tid)。例如,可以从活动事务表中移除事务,并且可以提交事务。例如,事务中的页面状态改变可以被安装在映射表中并且被冲刷到lss缓冲区。

例如,“事务中止”操作可以被指示为t终止(tid)。例如,事务可以从活动事务表中移除,改变的页面可以被重置为高速缓存中的“事务开始”,并且没有冲刷任何改变。

根据本文中所讨论的示例技术,除了分配和释放之外,可以在事务内允许更新-d操作以改变页面状态。例如,可以不使用更新-r,因为它可能使事务撤销复杂化,如下面进一步讨论的。

根据本文中所讨论的示例技术,事务操作可以都具有输入参数:tid和注释。例如,tid可以被添加到高速缓存中的增量,并且注释可以被添加到在事务中更新的每个页面(例如,好像它被冲刷)。当被安装在冲刷缓冲区中并且被提交时,高速缓存中的所有更新的页面可以具有预先描述其位置的冲刷增量(例如,好像它们独立于事务被冲刷)。

bw-树(参见例如j.levandoski等人的“thebw-tree:ab-treefornewhardwareplatforms”,第29届ieee国际数据工程会议(icde2013),2013年4月8日-11日)可以提供示例密钥值储存库,其可以使得用户事务能够被支持(例如,对于事务部件202)。例如,它可以管理lsn,实施预写日志(wal)协议,并且响应于deuteronomy数据部件(dc)所期望的检查点建立请求(参见,例如,j.levandoski等人的“deuteronomy:transactionsupportforclouddata”,创新数据系统研究会议(cidr)(2011年1月),第123-133页和d.lomet等人的“unbundlingtransactionservicesinthecloud”,创新数据系统研究会议(cidr),2009)。本文中的讨论包括在使用诸如llama的示例系统时如何实现该目的。

更新-d和更新-rllama操作的“数据”内容可以包括密钥、lsn和密钥值储存库的“数据部分”。例如,bw-树因此可以经由这些操作实现密钥值储存库,经由lsn提供幂等性,经由更新-d执行增量更新,经由更新-r执行其页面合并,以及使用llama读取或冲刷操作访问用于读取或写入的页面。例如,系统可以包括记录管理器,其可以被配置为基于更新增量记录操作和代替更新操作来控制更新。

例如,访问方法可以将lsn存储在其经由更新操作提供给llama的数据中。此外,存储在冲刷增量中的冲刷操作注释参数可以提供用于描述页面内容的附加信息。例如,这些可以允许bw-树实施预写日志(wal)。例如,在冲刷页面之后的稳定操作(例如,mk-稳定)可以使得更新对于事务日志检查点设置是稳定的。

例如,分配和释放操作可以允许示例bw-树实现增长和收缩其树。例如,开始事物(例如,t开始)和提交/中止(例如,t提交/t中止)可以在执行结构修改操作(smo)时实现所期望的原子性。

例如,更新操作(例如,更新-d/更新-r)可以不限于“用户级”数据。例如,如下面进一步讨论的,在关于系统事务实现smo时,bw-树可以使用更新-d发布其“合并”和“拆分”增量。

根据本文中所讨论的示例技术,关于高速缓存层数据操作,页面更新可以通过使用比较和交换操作(cas)在映射表1304中安装新的页面状态指针1402来完成,如图14所示,而不管是增量更新还是代替更新。例如,代替更新(例如,更新-r(pid,进-ptr,出-ptr,数据))可以包括期望的新状态和页面在lss中的先前状态的位置。例如,新的更新增量1404(例如,更新-d(pid,进-ptr,出-ptr,数据))指向页面1302的先前状态1406,其已经包括该lss位置。

例如,这种无锁存方法可以避免由锁存引入的延迟,但是它可能导致其自身的惩罚,如“乐观的”并发控制方法,即cas可能失败,并且更新随后将重试。例如,可以由示例llama用户来适当地重试其操作,作为示例,llama实现可以指示何时发生故障。

根据本文中所讨论的示例技术,虽然没有操作可以阻止数据何时在高速缓存(例如,1312)中,但是从辅助存储装置读取页面可以涉及等待页面出现在高速缓存中。映射表(例如,映射表1304)将指向lss页面,甚至对于高速缓存的页面,如上所述,以使得能够在高速缓存和lss之间移动页用于有效的高速缓存管理。

根据本文中所讨论的示例技术,当页面被冲刷时,示例llama实现可以确保高速缓存中表示的内容(例如,1312)与lss中的内容(例如,1314)匹配。因此,冲刷增量可以包括冲刷增量中的pid和lss偏移,并且可以通过将其附加到页面1302来将该增量包括在lss缓冲区和高速缓存(例如,1312)中。

根据本文中所讨论的示例技术,因为示例llama实现可以支持增量更新,所以页面状态可以包括不连续片段。将该特征与冲刷活动组合可以导致高速缓存页面的状态的一部分在lss中(已经被更早地冲刷),而最近的更新可以仅存在于高速缓存中。当这发生时,可以降低下一次冲刷的存储成本。

因此,示例llama实现可以通过写入仅包括自先前冲刷以来的改变的增量来冲刷这样的页面。例如,使用指向页面的剩余部分的指针lss,通过写入连续形式的增量(其在本文中可以被称为“c-增量”),高速缓存中的多个更新增量可以全部连续用于冲刷。因此,整个页面可以在lss中可访问,但是可能是几个分片。

根据本文中所讨论的示例技术,冲刷操作可以观察缓存页面状态,其可以具有已经以这种方式随着时间被冲刷的几个部分,导致单独的分片及其lss地址在其中被表示的缓存页面。根据本文中所讨论的示例技术,在任何时候,冲刷可以通过连续地(并且冗余地)写入不连续页面片段的内容,将这些片段带到lss存储装置中。例如,由于读取访问和存储成本不同,当lss使用闪存存储装置时,用户可能愿意将这些分片分离,而当lss使用磁盘存储装置时,用户可能希望这些分片邻接。

根据本文中所讨论的示例技术,当页面被冲刷时,可能希望系统在冲刷之前知道页面的什么状态被冲刷。例如,这可以使用锁存器容易地确定,因为系统可以简单地锁存页面并且执行冲刷。然而,在无锁存方法中,系统可能在正确地排序页面冲刷方面具有相当大的困难。例如,这可能在预写式日志协议的实施中或者当冲刷作为结构修改的一部分时发生。例如,当它们执行它们的cas时,不合适的冲刷可能会失败。因此,根据本文中所讨论的示例技术,可以使用指向要在cas中冲刷的页面状态的指针,其然后可以仅捕获该特定状态,并且如果状态在冲刷完成之前已经被更新,则可能失败。但是,这可能会引起其他问题。

在研究中,在确定当执行高速缓存管理和将页面冲刷到lss时可能有利的强不变量的种类时遇到困难。例如,不变量可以包括各种属性,诸如:

被成功冲刷到lss的页面在高速缓存中被立即看到已经被冲刷,并且页面的冲刷状态将在所有稍后状态的冲刷之前在lssi/o缓冲区中。冲刷失败的页面不会呈现为在缓存中冲刷,并且在查看lss时冲刷未成功是很清楚的。

例如,两种替代方法可以包括:

a.可以通过首先执行cas来确保冲刷的成功。一旦cas成功,该页面可以被发布到lss。例如,如果这样做,则竞争条件可能破坏可信的lss恢复。例如,页面可以随后可以取决于较早冲刷的页面被冲刷,其中该“稍后”冲刷在系统崩溃之前成功写入lss,而“较早”冲刷太慢而不能完成并且不出现在稳定中lss。这种情况可能损害一种形式的因果关系。

b.可以捕获期望被冲刷的页面的页面状态,并且将其写入lss缓冲区。然后可能尝试cas,并且cas可能失败。因此,如果系统崩溃,则将页面写入lss,而没有用于区分冲刷是成功还是失败的指示。例如,可以存在在多个时间写入lss的多个这样的页面。例如,可以写入比失败cas更早出现在lss中的页面的稍后状态。如上所述,它开始较晚,但在较早冲刷之前获得其缓冲区槽。

例如,如下所述,可以解决以上讨论的困境。例如,如果足够早地执行cas,则可以在将页面的状态复制到日志缓冲区之前确定冲刷是否将成功。因此,可以如下执行示例冲刷过程:

步骤1:标识意图被冲刷的页面的状态。

步骤2:占用要写入状态的lss缓冲区中的空间。

步骤3:执行cas以确定冲刷是否成功。将获得冲刷增量中的lss偏移量以便进行这一操作(如上面步骤2中所提供的)。

步骤4:如果步骤3成功,则将要保存的状态写入lss。当这被写入lss时,本文中所讨论的示例llama技术可以防止缓冲区被写入lss辅助存储装置。

步骤5:如果步骤3失败,则将指示“失败冲刷”的指示写入缓冲区中的保留空间。这可能消耗存储装置,但是解决了哪些冲刷成功或失败的模糊性。

该示例过程的结果是,在恢复期间,lss可能不会观察到已经失败的cas的结果的页面。例如,这也保留了在lss中稍后出现(在“日志”中的位置方面)的任何页面将是页面的稍后状态而不是lss日志中的页面的所有先前实例这一属性。

根据本文中所讨论的示例技术,可能需要示例llama实现来管理高速缓存和换出数据以便满足其存储器约束。例如,示例llama实现可以知道增量更新、代替更新和冲刷,并且可以识别这些中的每个。然而,示例llama实现将不知道页面的内容,如果它是通用的。因此,示例llama实现不知道访问方法层是否通过在页面中维持lsn来支持事务。因此,可能提出的问题包括关于当示例llama实现可能没有看到lsn并且实施预写日志协议时如何提供高速缓存空间管理(包括逐出页面)的潜在问题。

例如,已经被冲刷的任何数据可以从高速缓存中被丢弃。例如,其中页面被适当地更新的系统可以被防止换出(从缓存中丢弃)任何最近更新的和“脏的”页面。然而,由于增量更新,示例llama实现可以确定页面的哪些部分已经被冲刷。例如,每个这样的部分可以用冲刷增量来描述,并且那些冲刷的部分可以被高速缓存“换出”。

在“换出”页面的部分中,简单地释放存储装置并且重新使用它可能是不利的,因为这可能留下对被交换的部分的暂停引用。因此,根据本文中所讨论的示例技术,可以使用描述页面的什么部分已被换出的增量。

例如,对于完全换出的页面,其在映射表1304中的主存储器地址可以用来自页面的最近冲刷增量的lss指针代替。

图15描绘了示例部分页面换出和示例部分交换增量。例如,对于部分换出的页面,可以使用cas来插入“部分交换”增量记录1502。例如,该增量记录1502可以指示页面已被部分换出(例如,因此高速缓存中的页面内容不能用于满足通常的页面读取操作),并且可以指向指示lss中的位置信息以用于定位页面1506的丢失部分的冲刷增量记录1504。例如,一旦“部分交换”增量1502已经安装了cas,则可以使用示例历元机制来释放被丢弃的页面的部分的存储器。

例如,页面管理器可以被配置为基于发起将部分交换增量记录预先附加到与第一页面相关联的页面状态,来发起高速缓存层存储装置中的第一页面的一部分到辅助存储装置中的位置的交换操作,部分交换增量记录包括指示冲刷增量记录的存储位置的辅助存储装置地址,冲刷增量记录指示第一页面的丢失部分在辅助存储装置中的位置。

例如,页面管理器还可以被配置为使用历元机制来发起用于与第一页面的该部分相关联的高速缓存层存储装置的释放操作。

根据本文中所讨论的示例技术,该方法可以有利地为用户提供几个有用的特征。例如,这样的示例llama实现的高速缓存层1104可以在没有关于页面的实际内容的知识的情况下回收存储器(例如,1312)。例如,丢弃冲刷页面和页面的冲刷部分可能不涉及i/o操作。例如,将部分冲刷的页面带回到主存储器可能涉及比lss中具有多个部分的完全冲刷的页面的情况更少的lss读取。

如本文中所讨论的,“逻辑页面”可以包括基页和指示对页面的更新的零个或多个增量记录,因此允许在页面被冲刷时将页面分片写入闪存。因此,闪存上的逻辑页面可以对应于可能在使用文件偏移量作为指针链接在一起的不同物理设备块上的记录。此外,物理块可以包括来自多个逻辑页面的记录。图16a示出了闪存1314上的示例日志结构存储装置组织1600a。

例如,可以通过从闪存上的链(其在顺序日志1602中的偏移可以从映射表1304获得)的头开始并且跟随链接的记录,将逻辑页面从闪存1314读取到存储器(例如,ram1312)中。例如,可以从映射表1304获得偏移量1604,用于访问增量记录1606,以获得当前状态,以及用于从闪存1314将相应的“逻辑页面”读取到存储器1312中的基页1608。

例如,可以从映射表1304获得偏移1610,用于访问增量记录1612,以获得增量和链接,以访问第二增量记录1614,并且随后访问基页1616,用于将相应的“逻辑页面”从闪存1314读取到存储器1312中。

例如,当它们被一起冲刷时,冲刷进程可以有利地将相同逻辑页面的多个增量记录合并成闪存上的连续c-增量。此外,当逻辑页面在存储器中被合并之后被冲刷时,可以在闪存上合并逻辑页面,这可以有利地提高页面读取性能。

图16b描绘了示例映射表1304,其基于用页面1642的新状态1644的物理地址(例如,由于具有多个预先附加的增量记录的页面1642的合并而产生的)代替第一存储对象1646的物理地址(例如,在图16b中,其包括具有多个预先附加的增量记录的基页1642)来指示具有页面1642的新状态1644的页面1642的先前状态1640的代替。

例如,如图16c所示,使用页面1642的新状态1644代替页面1642的先前状态1640可以包括将多个增量记录合并成连续的c-增量1650,其然后可以与基页1642一起被冲刷。

例如,用页面1642的新状态1644代替页面1642的先前状态1640可以包括生成当前页面1642的修改版本,或者确定用于代替当前页面1642的另一页面,并且经由映射表1304上的原子比较和交换操作,用页面1642的新状态1644的物理地址代替当前页面1642的物理地址(例如,修改的版本或用于代替的其他页面)。

例如,作为图16b和图16c的特征之间的区别,当将页面写入辅助存储装置时,llama可以执行图16c所示的合并,但其取决于执行更新-r的访问方法来执行图16b的合并。

根据本文中所讨论的示例技术,示例llama实现可以完全无锁存。此外,专用线程可能不用于冲刷i/o缓冲区,因为这可能使保持线程工作负载平衡变得复杂。因此,所有线程可以参与管理该缓冲区。例如,传统方法已经利用锁存。然而,这样的传统技术可能仅在缓冲区中分配空间时锁存,以在数据传送之前释放锁存,其然后可以并行地继续。

根据本文中所讨论的示例技术,示例llama实现可以避免用于缓冲区空间分配的传统锁存,而使用用于原子性的cas,如本文中所讨论的示例系统中的其他地方所做的。例如,这涉及定义cas执行的状态。例如,缓冲区状态的常数部分可以包括其地址(base)和大小(bsize)。例如,可以使用相对于base的偏移来追踪缓冲区中使用的存储器的当前高水位标记。例如,使用缓冲区的每个请求可以开始于为页面冲刷保留空间大小。

根据本文中所讨论的示例技术,为了在缓冲区中保留空间,线程可获取当前偏移并且计算偏移+大小。例如,如果偏移+大小≤bsize,则该请求可以存储在缓冲区中。例如,线程可以发布具有当前偏移作为比较值的cas,并且发布偏移+大小作为新值。如果cas成功,则偏移可以被设置为新值,空间可以被保留,并且缓冲区写入器可以将数据传送到缓冲区。

根据本文中所讨论的示例技术,即使当整个页面不在高速缓存中时,也可以进行更新。然而,可能存在更新需要被读取的页面的版本在读取和后续更新之间保持不变的时候。例如,用户可能希望确定页面状态是否已经改变,因为它之前被“看过”(即,被观察)。

例如,在“非盲”更新中,映射表指针(其标识先前读取的页面状态)的值可以伴随更新,从而证实状态在其被读取之后没有改变。由于对页面的读取操作涉及在高速缓存中的页面的存在,这可以确保将对高速缓存中的全页面进行更新。

盲更新还可以涉及页面状态,以确保可能的冲突操作没有干预。对于这些操作,可以使用操作p-读取(部分页面读取),其读取当前在用于状态的页面缓存中的任何内容,而不在整个页面不应该存在的情况下触发全页面的读取。然后返回的地址可以像以前一样用在更新中,而不需要整个页面在缓存中。如果映射表仅存储闪存偏移,则p-读取可以将闪存中引用的页面的第一部分读入高速缓存,而不需要引入整个页面。

因此,具有这样的p读取操作的访问方法可以满足llama支持来自访问方法的盲更新。

例如,可以通过使用具有特定注释的冲刷增量以及其对高速缓存中的页面状态的剩余部分的引用以及对于其中页面已被放置在稳定存储中的位置的闪存偏移量(稳定存储位置)来提供“页面存根”。例如,当缓存管理器通过“部分交换”换出页面直到最后的冲刷增量时,可以“创建”存根。然而,根据本文中所讨论的示例技术,可以将冲刷增量保留在适当位置,而不是用闪存偏移代替映射表地址。剩余的冲刷增量可以保留该闪存偏移加上llama的用户的注释(例如bw-树)。访问方法可以用p读取读取页面存根(或页面的更多部分,如果存在于高速缓存中)以确定它可以对页面做什么。

如上所述,bw-树可以用作被建立为在llama之上作为其面向页面的高速缓存管理器执行的索引记录管理器。在此层,记录管理器至少支持典型的crud(创建、读取、更新、删除)操作。crud操作可以涉及对记录存储器的先前状态的了解,这可以涉及在llama处的高速缓存操作,其可以涉及读取整个页面以获取该知识。

为了支持“盲”式记录操作,可以利用附加操作。例如,upsert操作使用新的记录版本代替现有记录(如果存在),或者创建(插入)记录(如果记录尚不存在)。因此,它将crud的c与u组合(创建和更新)。在上面讨论的llama示例中,upsert可以执行p-读取而不是普通读取,然后继续其更新(例如,使用更新-d)。

例如,除了在删除之前检查版本是否存在的“正常”删除之外,可以使用示例盲-d操作或盲删除(crud中的d),因此涉及页面读取。该操作可以仅涉及执行p-读取。这种盲-d操作可以具有各种不同的定义。例如,它可以在页面最终被读取和合理化时删除先前版本,并且如果没有先前版本,则可以是空操作。

作为另一示例,它可以作为删除请求,而仅作为为该记录添加的后续版本而“放弃”。

在任一情况下,在页面经由读取完全在存储器中之前可能不会完全实现盲-d的效果。

例如,应用可以支持upsert形式的记录的盲增量更新。增量记录改变(与上面讨论的记录更新的完全代替更新模型相反)可能涉及面向记录的访问方法(例如bw-树)通常不知道的“内部记录”语义。

产生改变但不替换记录的增量记录更新(更新-i)可以使用与盲写入相同的llama操作,即p读取而不是读取。因此,它们可以类似于upsert来处理。然而,bw-树本身不能理解如何将这些更新合并到记录版本中。下面讨论的是用于处理这种“合并”的两种示例技术,

作为第一示例,使用bw-树的应用可以发布记录读取(读取)(crud中的r)。例如,bw-树可以经由其已经接收到的分片的连接来一起收集更新的记录的片段。在此读取之后,应用将合并记录呈现为“正常”更新,其将先前的拼接在一起的记录代替为由应用程序合并的记录。不能涉及额外的功能(除了更新-i)。

作为第二示例,应用可以向bw-树提供理解如何将连接片段格式的记录合并成应用理解的合并格式的过程。一旦在关于由bw-树支持的“表”的信息保留或通过提供bw-树可以调用以执行该功能的回叫点,存在可以提供该过程的各种方式,例如在作为读取的一部分传送记录之前,或者在由bw-树完成的页面合并过程期间,因为它将增量更新合并到合并页面中。

根据本文中所讨论的示例技术,可以支持这两种变体。

以下讨论用于通过上述示例技术将作为更新-1的结果的记录段代替为已经被合并的版本的示例技术。

因此,可能期望将合并的记录存储在bw-树中,以代替之前提供的更新-i增量。

例如,当合并-i操作已经由先前的更新-i操作单独更新时,它可以在记录上工作。这样的合并-i操作可以识别要代替的先前更新-i,然后将该合并版本发布到bw-树中。可以假定每个更新-i具有用于幂等性的lsn。当合并发生时,知道哪个更新-i进入生成的合并版本。因此,当在页面的更新增量中使用时,合并的记录可以保留这些lsn。这使未来的操作(未来的整合和未来的bw-树操作)提供幂等性。

bw-树知道如何合并页面,并且可以使用更新-rllama操作来用新的表单代替页面的当前形式。在此过程中,bw-树可以从页面中移除在合并-i操作中捕获的所有更新-i,以将它们代替为合并的记录。未使用合并记录捕获的任何更新-i操作可能仍保留为该记录的未合并条目(例如,稍后合并)。bw-树不需要了解合并的细节来完成这一点。它只需要知道在合并记录中捕获的lsn信息。

计算领域的技术人员将理解,在不脱离本文中的讨论的精神的情况下,可以使用很多其他类型的技术来实现高性能事务处理。

本文中所讨论的特征作为可以以计算领域的技术人员可以理解的很多不同方式实现的示例实施例来提供,而不脱离本文中的讨论的精神。这些特征仅被解释为示例实施例特征,而不旨在被解释为仅限于这些详细描述。

如本文中进一步讨论的,图17是用于实现高性能事务处理的通用系统1700的框图。所示的通用系统1700被示出仅旨在示出可以被包括在如本文中所讨论的示例技术中的各种示例功能和/或逻辑,而不旨在在各种硬件和/或软件配置中的实现方面进行限制。计算领域的技术人员将理解,系统1700可以在硬件实现、软件实现或其组合中实现。如图17所示,系统1700可以包括设备1702,设备1702包括至少一个处理器1704。设备1702可以包括页面更新管理器1706,页面更新管理器1706可以包括获取规定与密钥值储存库相关联的逻辑页面的更新的多个更新请求1710的更新获取控制器1708。

例如,页面数据存储装置1712可以包括任何类型的页面数据存储装置,包括(至少)诸如主存储器的易失性存储装置和诸如“辅助存储装置”的更稳定的存储装置(例如,更多的非易失性存储装置),其可以包括闪速存储装置以及其他类型的磁盘驱动器等。计算领域的技术人员将理解,在不脱离本发明的精神的情况下,存在可以与本文中所讨论的技术一起使用的很多类型的页面数据存储装置。

根据示例实施例,页面更新管理器1706或其一个或多个部分可以包括可以存储在有形计算机可读存储介质上的可执行指令,如下所述。根据示例实施例,计算机可读存储介质可以包括任何数目的存储设备和任何数目的存储介质类型,包括分布式设备。

在本上下文中,“处理器”可以包括被配置为处理与计算系统相关联的指令的单个处理器或多个处理器。因此,处理器可以包括并行和/或以分布式方式执行指令的一个或多个处理器。虽然设备处理器1704在图17中被描绘为在页面更新管理器1706外部,然而计算领域的技术人员将理解,设备处理器1704可以被实现为单个部件、和/或可以位于页面更新管理器1706的内部或外部的分布式单元、和/或其任何元件。

例如,系统1700可以包括一个或多个处理器1704。例如,系统1700可以包括存储由一个或多个处理器1704可执行的指令的至少一个有形计算机可读存储介质,可执行指令被配置为引起至少一个处理器执行与被包括在系统1700中的各种示例部件相关联的操作,如本文中所讨论的。例如,一个或多个处理器1704可以被包括在至少一个处理装置中。计算领域的技术人员将理解,在不脱离这种讨论的精神的情况下,可以根据本文中的讨论来配置处理器和处理设备的很多配置。

在本上下文中,“部件”或“模块”可以指代可以被配置为执行某些操作的指令或硬件。这样的指令可以被包括在指令的部件组内,或者可以分布在多于一个组上。例如,与第一部件的操作相关联的一些指令可以被包括在与第二部件(或多个部件)的操作相关联的指令组中。例如,本文中的“部件”可以指代可以由位于单个条目中的指令实现的功能类型,或者可以在多个条目上扩展或分布,并且可以与和其他部件相关联的指令和/或硬件交叠。

根据示例实施例,页面更新管理器1706可以与一个或多个用户设备相关联地实现。例如,页面更新管理器1706可以与服务器通信,如下面进一步讨论的。

例如,可以经由数据库接口部件1722访问一个或多个数据库。计算领域的技术人员将理解,存在用于存储本文中所讨论的信息的很多技术,诸如各种类型的数据库配置(例如,关系数据库、分层数据库、分布式数据库)和非数据库配置。

根据示例实施例,页面更新管理器1706可以包括可以存储诸如中间结果等的对象的存储器1724。在本上下文中,“存储器”可以包括被配置为存储数据和/或指令的单个存储器设备或多个存储器设备。此外,存储器1724可以跨越多个分布式存储设备。此外,存储器1724可以分布在多个处理器之间。

根据示例实施例,用户界面部件1726可以管理用户1728和页面更新管理器1706之间的通信。用户1728可以与接收设备1730相关联,接收设备1730可以与显示器1732和其他输入/输出设备相关联。例如,显示器1732可以被配置为经由内部设备总线通信或者经由至少一个网络连接与接收设备1730通信。

根据示例实施例,显示器1732可以被实现为平面屏幕显示器、打印形式的显示器、二维显示器、三维显示器、静态显示器、移动显示器、传感显示器、例如触觉输出、音频输出以及用于与用户(例如,用户1728)通信的任何其他形式的输出。

根据示例实施例,页面更新管理器1706可以包括网络通信部件1734,其可以管理页面更新管理器1706和可以经由至少一个网络1736与页面更新管理器1706通信的其他实体之间的网络通信。例如,网络1736可以包括因特网、至少一个无线网络或至少一个有线网络中的至少一个。例如,网络1736可以包括蜂窝网络、无线电网络、或者可以支持用于页面更新管理器1706的数据传输的任何类型的网络。例如,网络通信部件1734可以管理页面更新管理器1706和接收设备1730之间的网络通信。例如,网络通信部件1734可以管理用户接口部件1726和接收设备1730之间的网络通信。

例如,高速缓存层管理器1738可以包括映射表管理器1740,映射表管理器1740可以被配置为在间接地址映射表1742上发起表操作,表操作包括发起对间接地址映射表1742中的条目的原子比较和交换(cas)操作,用于使用页面的新状态代替与页面数据存储装置1712相关联的页面的先前状态。

例如,使用这样的原子操作可以提供完全多线程能力——即,任何线程可以访问任何数据,因此,有利地提供处理中的速度能力。

例如,映射表管理器1740可以被配置为在与数据不透明接口1743相关联的间接地址映射表1742上发起表操作,其中间接地址映射表1742共同用于管理数据存储,包括高速缓存层存储装置1744和辅助存储装置1746。

例如,间接地址映射表1742将页面的逻辑位置与页面的对应物理位置分离,其中页面数据存储装置装置的用户存储在引用页面数据存储装置的数据结构中的其他地方页面标识符值,以代替页面的物理位置地址值。

例如,更新管理器1748可以被配置为使用对于间接地址映射表1742中的条目的无锁存比较和交换操作来控制数据更新和管理更新,以在间接地址映射表1742上产生原子状态改变。

例如,存储装置层1749可以包括日志结构存储装置层管理器1750,其可以被配置为使用对间接地址映射表1742中的条目的无锁存比较和交换操作,来控制与由页面冲刷产生的日志结构相关联的页面位置改变。

例如,缓冲区管理器1751可以被配置为经由无锁存更新操作来控制对日志结构辅助存储装置缓冲区的更新。因此,例如,多个线程可以经由无锁操作同时更新日志结构辅助存储缓冲区。

例如,缓冲区管理器1751可以被配置为发起稳定性操作,以用于确定被冲刷到具有较低地址直到第一辅助存储地址自变量的日志结构辅助存储缓冲区的页面在日志结构辅助存储中是稳定的。

例如,页面管理器1752可以被配置为控制页面上的冲刷操作、分配操作和自由操作。例如,页面管理器1752可以被配置为基于将第一页面的页面状态的副本发起到辅助存储装置缓冲区中,发起在页面状态之前预先附加冲刷增量记录,冲刷增量记录包括指示第一页面在辅助存储装置中的存储位置的辅助存储地址和与呼叫者相关联的注释,以及基于通过比较和交换(cas)操作将冲刷增量记录的地址安装在映射表中以发起对页面状态的更新,来发起高速缓存层存储器中的第一页面到辅助存储装置中的位置的冲刷操作。

例如,页面管理器1752可以被配置为基于发起将部分交换增量记录预先附加到与第一页面相关联的页面状态来发起高速缓存层存储中的第一页面的一部分到辅助存储装置中的位置的交换操作,部分交换增量记录包括指示冲刷增量记录的存储位置的主存储器地址,冲刷增量记录指示第一页的丢失部分在辅助存储装置中的位置。

例如,系统事务管理器1754可以被配置为提交事务和中止事务。

例如,记录管理器1756可以被配置为基于更新增量记录操作和代替更新操作来控制更新。

例如,页面管理器1752可以被配置为基于经由比较和交换(cas)操作在映射表中安装指向冲刷增量记录的指针来冲刷辅助存储装置的页面状态,冲刷增量记录被预先附加到经由cas操作在映射表中代替的现有页面状态。

例如,页面管理器1752可以被配置为:如果确定cas操作成功,则确定cas操作是否成功,并且发起将现有页面状态写入辅助存储冲刷缓冲区的写入操作。

例如,如果确定cas操作失败,则页面管理器1752可以被配置为发起对先前分配给现有页面的存储空间的空操作。

更新发布引擎1760可以使用获得的更新请求来发布更新,而不经由读取操作访问逻辑页面。

例如,页面存根管理器1762可以经由表示页面存根的页面存根增量记录来发起将页面存根预先附加到逻辑页的当前状态,页面存根包括逻辑页面的当前状态的地址的指示以及指定逻辑页面的属性的元数据,通过原子操作,通过将表示页面存根的页面存根增量记录的地址安装在映射表中来发起将页面存根预先附加到当前状态。例如,页面存根可以包括与逻辑页相关联的密钥边界的值。

例如,更新获取模块1708可以获得指定对逻辑页面的记录更新的多个更新请求1710。

例如,更新发布引擎1760可以使用获得的多个更新请求1710来发布所获得的记录更新,而不经由读取操作访问逻辑页面。

例如,更新发布引擎1760可以通过将多个相应的增量记录预先附加到页面存根来发布所获得的记录更新。相应的增量记录可以包括指定在相应的多个更新请求中指定的对逻辑页面的相应更新的记录更新信息。

例如,合并引擎1763可以使用预先附加到页面存根的多个相应增量记录,经由预定义合并功能来合并所获得的记录更新。

例如,更新获取模块1708可以获得指定对逻辑页面中的记录的增量更新的多个更新请求1710。

例如,更新发布引擎1760可以使用获得的更新请求1710递增地发布所获得的指定的增量更新,而不经由读取操作访问逻辑页面。

例如,更新发布引擎1760可以通过递增地将多个相应增量记录预先附加到页面存根来递增地发布所获得的指定增量更新,其中多个相应增量记录包括指定对记录的相应更新的密钥更新信息。

例如,数据检索引擎1764可以发起对密钥值储存库中的密钥的查找,以经由从存储装置到存储器的读取操作在逻辑页面的当前状态获得逻辑页面的至少一部分的表示。

例如,合并引擎1766可以使用预先附加到页面存根的多个相应的增量记录,经由预定义的合并功能来合并所获得的指定的增量更新。例如,预定义的合并功能包括用户定义的合并功能。

例如,增量冲刷引擎1768可以将逻辑页面的内容与预先附加到页面存根的多个相应增量记录递增地冲刷到使用单个写入操作预先附加到存储器的冲刷缓冲区存储区域。

例如,密钥值储存库包括表示与相应文档相关联的项的密钥以及表示相应文档标识符的相应值。

例如,逻辑页面存储在辅助存储装置上。

计算领域的技术人员将理解,在不脱离本文中的讨论的精神的情况下,可以使用很多不同的技术来实现高性能事务处理。

iv.某些实施例的各方面

本文中所讨论的特征被提供作为可以以计算领域的技术人员可以理解的很多不同方式实现的示例实施例,而不脱离本文中所讨论的精神。这些特征仅被解释为示例实施例特征,而不旨在被解释为仅限于这些详细描述。

一种系统,包括至少一个处理器和事务部件,事务部件包括存储由至少一个处理器可执行的可执行指令的计算机可读存储介质。可执行指令包括事务引擎,事务引擎包括多版本并发控制(mvcc)模块,其访问无锁存散列表,无锁存散列表包括相应散列表条目,散列表条目包括表示相应记录的相应桶项的相应桶,相应桶项每个包括指示每个项的在时间上最近读取时间的值以及描述相应记录的一个或多个相应版本的一个或多个描述的版本列表,使用恢复日志作为相应记录的一个或多个相应版本的源,mvcc模块使用无锁存散列表执行时间戳顺序并发控制,每个项的时间上的最近读取时间包括表示每个项被读取的时间上的最后时间的时间戳值。

如前述段落中的系统,还包括历元引擎,其通过拒绝重新使用相应释放的存储器位置的许可直到活动线程不能解除引用指向相应释放的存储器位置的指针来控制释放的存储器位置的重新使用。

描述相应记录的一个或多个相应版本的一个或多个描述中的每个包括:事务标识符(tid),其标识与相应记录的相应版本相关联的创建事务、版本偏移值,其指示在恢复日志中存储在与所述版本偏移值相对应的所述恢复日志中的位置处的相应记录的相应版本的副本的参考偏移、以及指示创建事务是否已中止的标志值。

事务部件包括事务表,事务表包括表示相应事务的相应条目,其中相应条目每个包括事务标识符(tid)、时间戳值,其指示相应事务的开始时间、表示由事务做出的更新的列表、以及指示相应事务是活动的、提交的还是中止的标志值。

事务表包括表示由事务引擎周期性地确定的最旧的活动事务的条目,作为相应事务中活动且与最旧的时间戳相关联事务。

事务引擎控制针对相应只读事务的相应提交操作的相应提交记录写入操作,以存储针对相应只读事务的提交记录。

作为对迄今已经被相应只读事务中的每个只读事务读取的最近的读取版本的提交稳定性状态的相应确定的结果,事务引擎发起针对相应只读事务的相应提交操作的相应提交记录写入操作。

事务部件包括版本管理器,版本管理器包括恢复日志,恢复日志在恢复日志缓冲区中存储纯重做记录和记录条目,该记录条目表示与密钥值储存库相关联的相应记录的版本的副本。

事务引擎批准当前记录的事务更新,发起将恢复日志缓冲区中的当前记录的更新版本的副本在恢复日志中的存储,并且发起mvcc无锁存散列表中的新条目的生成,新条目包括指示恢复日志缓冲区中的当前记录的更新版本的位置的偏移值以及负责当前记录的事务更新的事务的指示。

版本管理器向事务部件代理发送日志缓冲区,事务部件代理接收日志缓冲区并且向用于与提交的事务相关联的记录的稳定存储装置发布提交的事务,其中事务部件代理远离事务部件,基本上接近与稳定存储器相关联的数据部件的位置,或在事务部件的本地。

事务部件代理向用于与提交的事务相关联的记录的稳定存储装置发布提交的事务,稳定存储装置由包括密钥值储存库的数据部件的数据部件管理,其中事务部件代理维持对对数据部件的恢复应用的进展的追踪,并且向事务部件提供所追踪的进展的概述。

事务部件代理向与提交的事务相关联的记录的稳定存储装置发布提交的事务,稳定存储装置由包括密钥值储存库的数据部件的数据部件管理,其中事务部件代理执行每个接收的日志缓冲区的第一扫描以确定从事务部件接收的提交的事务,并且事务部件代理执行对每个接收的日志缓冲区的第二扫描,以对于在第一扫描中确定的提交的事务,在数据部件处应用提交的事务的操作,其中对于与被确定为不是持久地提交的相应事务相关联的相应版本,事务部件代理存储与相应版本相关联的信息,其中事务部件代理使用日志序列号(lsn)的对来追踪对数据部件应用操作的进展。

版本管理器维持用于存储从数据部件读取的预先存在的记录版本的副本的记录读取高速缓存,其中记录读取高速缓存包括以先入先出(fifo)顺序被填充和清除的无锁存的日志结构缓冲区。

事务部件包括版本管理器,版本管理器包括恢复日志,恢复日志使用新到达的恢复日志缓冲区条目的动态存储分配被构造为多个无锁存恢复日志缓冲区,其中版本管理器维持偏移变量值,该偏移变量指示特定恢复日志缓冲区内的用于新请求的存储分配的下一可用位置,偏移变量值经由原子获取和增量(fai)操作被更新,以向偏移变量值添加所请求的分配的大小,以及偏移变量值还指示特定恢复日志缓冲区的活动用户的当前数目。

一种方法,包括访问无锁存散列表,无锁存散列表包括相应散列表条目,相应散列表条目包括表示相应记录的相应桶项的相应桶,相应桶项每个包括指示每个项的在时间上最近读取时间的值以及描述相应记录的一个或多个相应版本的一个或多个描述的版本列表,使用恢复日志作为相应记录的所述一个或多个相应版本的源;以及使用所述无锁存散列表执行针对密钥值储存库的时间戳顺序并发控制。

如前述段落中的方法,其中存储在恢复日志缓冲区变为持久之后,恢复日志中存储的提交记录被用作用于事务输出消息的延迟递送的队列,以代替使用单独的排队机制。

一种计算机程序产品,包括存储可执行指令的计算机可读存储介质,可执行指令在由至少一个处理器执行时引起至少一个计算设备访问使用用于新到达的存储条目的存储的动态分配被构造为多个存储缓冲区的存储实体,并且维持指示特定存储缓冲区内的新请求的存储分配的下一可用位置的偏移变量值,偏移变量值经由原子获取和增量(fai)操作被更新,以向偏移变量值添加所请求的分配的大小,偏移变量值还指示特定存储缓冲区的活动用户的当前数目。当由处理器执行时,可执行指令引起至少一个计算设备使用存储缓冲区之一中的动态存储分配来控制存储条目中的条目的存储,并且更新偏移变量值。

如前段所述的计算机程序产品,其中存储实体包括使用新到达的恢复日志缓冲区条目的存储的动态分配被构造为多个无锁存恢复日志缓冲区的恢复日志。

可执行指令在由至少一个处理器执行时引起至少一个计算装置通过确定由原子fai操作产生的偏移变量值是否指示大于特定存储装置缓冲区中的一个缓冲区的范围的缓冲区偏移值来确定特定存储缓冲区中的一个缓冲区是否被密封。

可执行指令在由至少一个处理器执行时引起至少一个计算装置在确定特定的存储装置缓冲区是否被密封之后,发起将特定存储缓冲区中的密封的一个缓冲区入写入辅助存储装置的写操作。

计算领域的技术人员将理解,在不脱离本文的讨论的精神的情况下,可以有很多实现高性能事务处理的方式。

客户隐私和机密性在计算环境中一直是很多年来的持续考虑。因此,用于高性能事务处理的示例技术可以使用由已经通过与应用相关联的一个或多个订阅协议(例如,“服务条款”(tos)协议)或与这样的技术相关联的服务提供许可的用户提供的用户输入和/或数据。例如,尽管可以明确指示(例如,经由用户接受的协议)每个参与方可以控制传输和/或存储如何发生以及什么级别或持续时间的存储可以被维持(如果有的话),但是用户可以提供同意将他们的输入/数据传输和存储在设备上。此外,可以例如通过对实际用户信息进行散列来模糊可以用于识别用户使用的设备的标识符。应当理解,可以根据任何相关管辖区的隐私法律和法规来获得任何用户输入/数据。

本文中所描述的各种技术的实现可以在数字电子电路中或者在计算机硬件、固件、软件或它们的组合(例如,配置成执行指令以执行各种功能的装置)中实现。

实现可以被实现为在信号(例如,纯信号,例如纯传播信号)中实施的计算机程序。这样的实现在本文中将被称为经由“计算机可读传输介质”来实现,其在本文中不限定为如下所述的“计算机可读存储介质”或“计算机可读存储设备”。

或者,可经由机器可用或机器可读存储装置(例如,磁性或数字媒体,例如通用串行总线(usb)存储装置、磁带、硬盘驱动器、光盘(cd)、数字视频盘(dvd)等)来实现,机器可用或机器可读存储装置存储可执行指令(例如,计算机程序),可执行指令用于由计算装置(例如,数据处理装置)执行或控制计算装置(例如,数据处理装置)的操作,例如,可编程处理器、专用处理器或设备、计算机或多个计算机。这样的实现在本文中可以被称为经由“计算机可读存储介质”或“计算机可读存储设备”来实现,并且因此不同于纯信号的实现,诸如纯传播信号(并且因此在本文中不限于如上所述的“计算机可读传输介质”)。因此,如本文中所使用的,对“计算机可读存储介质”或“计算机可读存储设备”的引用明确排除信号(例如,传播信号)本身。

诸如上述计算机程序等计算机程序可以以任何形式的编程语言编写,包括编译、解释或机器语言,并且可以以任何形式部署,包括作为独立的程序、或作为适于在计算环境中使用的模块、部件、子例程或其他单元。计算机程序可以有形地实施为在机器可用或机器可读存储设备(例如,计算机可读介质)上的可执行代码(例如,可执行指令)。可以实现上述技术的计算机程序可以被部署为在一个计算机上、或者在一个站点处或分布在多个站点上并且通过通信网络互连的多个计算机上执行。

方法步骤可以由执行计算机程序以通过对输入数据进行操作并生成输出来执行功能的一个或多个可编程处理器执行。一个或多个可编程处理器可以并行地执行指令,和/或可以以分布式配置来布置以用于分布式处理。本文中所讨论的示例功能还可以由一个或多个硬件逻辑部件来执行,并且装置可以至少部分地被实现为一个或多个硬件逻辑组。例如而非限制,可以使用的硬件逻辑部件的说明性类型可以包括现场可编程门阵列(fpga)、程序特定集成电路(asic)、程序特定标准产品(assp)、片上系统(soc)、复杂可编程逻辑器件(cpld)等。

适合执行计算机程序的处理器包括例如通用和专用微处理器以及任何种类的数字计算机的任何一个或多个处理器。通常,处理器将从只读存储器或随机存取存储器或两者接收指令和数据。计算机的元件可以包括用于执行指令的至少一个处理器和用于存储指令和数据的一个或多个存储器设备。通常,计算机还可以包括用于存储数据的一个或多个大容量存储设备,例如磁盘、磁光盘或光盘,或者可操作地耦合以从其接收数据或向其传送数据。适合实施计算机程序指令和数据的信息载体包括所有形式的非易失性存储器,包括例如半导体存储器设备,例如eprom、eeprom和闪存设备;磁盘,例如内部硬盘或可移动盘;磁光盘;和cd-rom和dvd-rom盘。处理器和存储器可以由专用逻辑电路补充或并入专用逻辑电路中。

为了提供与用户的交互,可以在具有用于向用户显示信息的显示设备(例如,阴极射线管(crt)、液晶显示器(lcd)或等离子体监视器)以及用户可以通过其向计算机提供输入的键盘和指示设备(例如鼠标或轨迹球)的计算机上实现各种实现。其他种类的设备也可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的感觉反馈,例如视觉反馈、听觉反馈或触觉反馈。例如,输出可以经由任何形式的感觉输出提供,包括(但不限于)视觉输出(例如视觉手势、视频输出)、音频输出(例如,语音、设备声音)、触觉输出(例如,触摸、装置移动)、温度、气味等

此外,可以以任何形式接收来自用户的输入,包括声音、语音或触觉输入。例如,可以经由任何形式的感觉输入(包括(但不限于)视觉输入(例如,手势、视频输入)、音频输入(例如,语音、设备声音)、触觉输入(例如,触摸、设备移动)、温度、气味等。

此外,自然用户界面(nui)可以用于与用户交互。在这种情况下,“nui”可以指代使得用户能够以“自然”方式与设备交互而不受诸如鼠标、键盘、遥控器等输入设备强加的人为约束的任何接口技术。

nui技术的示例可以包括取决于以下各项的nui技术:语音识别、触摸和指示笔识别、屏幕上和与屏幕相邻的姿势识别、空气姿势、头部和眼睛追踪、语音和声音、视觉、触摸、手势、和机器智能。示例nui技术可以包括但不限于触敏显示器、语音和语音识别、意图和目标理解、使用深度相机的运动姿势检测(例如,立体相机系统、红外相机系统、rgb(红色、绿色、蓝色)相机系统和这些的组合)、使用加速度计/陀螺仪的运动手势检测、面部识别、3d显示、头部、眼睛和注视追踪、沉浸式增强现实和虚拟现实系统,所有这些可以提供更自然的接口、以及使用电场感测电极(例如,脑电图(eeg)和相关技术)感测脑活动的技术。

实现可以在包括后端部件(例如,作为数据服务器)、或包括中间件部件(例如,应用服务器)、或包括前端部件(例如具有用户可以通过其与实现交互的图形用户界面或web浏览器的客户端计算机)、或者这样的后端、中间件或前端部件的任何组合的计算系统中实现。部件可以通过任何形式或介质的数字数据通信(例如,通信网络)互连。通信网络的示例包括局域网(lan)和广域网(wan),例如因特网。

尽管已经以对结构特征和/或方法动作专用的语言描述了主题,但是应当理解,所附权利要求中定义的主题不一定限于上述具体特征或动作。相反,上面描述的具体特征和动作被公开作为实现权利要求的示例形式。尽管已经如本文中所述示出了所描述的实施方式的某些特征,但是本领域技术人员现在将想到很多修改、代替、改变和等同物。因此,应当理解,所附权利要求旨在覆盖落入实施例的范围内的所有这样的修改和改变。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1