面向混合DRAM-NVM主存的联机事务型数据库系统的制作方法

文档序号:24528384发布日期:2021-04-02 10:06阅读:94来源:国知局
本发明涉及数据库处理
技术领域
:,并特别涉及一种面向混合dram-nvm主存的联机事务型数据库系统。
背景技术
::新一代非易失性存储器(nvm)是一种新型存储技术,是对现有dram(动态随机存储器)主存技术的替代或补充。当前的集成电路特征尺寸已经达到5nm,dram技术继续向下扩展至更小的特征尺寸存在巨大的挑战。新一代nvm技术通过改变存储介质的电阻来存储0/1,可以支持更小的特征尺寸,为上述问题提供了一种可行的解决方案。新一代nvm技术包括相变存储器(pcm),自旋转移扭矩磁性随机存取存储器(stt-mram)和忆阻器(memristor),3dxpoint等。与dram技术相比,nvm技术具有下述特点。(1)nvm的读写性能与dram相近,但是比dram慢。(2)nvm的写比读性能差,功耗高,而且写有次数的限制,即同一个存储单元写的次数超过某个阈值,存储单元就会损坏。(3)写入nvm的数据在掉电后不消失,而掉电后dram和cpucache中的数据将会消失。(4)为了保证cpucache中的内容写回nvm,需要执行clwb/clflush/clflushopt等cachelineflush指令和sfence/mfence等内存操作排序指令,这些特殊指令的性能代价比普通写高(例如10倍)。(5)cpu访问nvm的基本单元是一个cacheline(例如64b)。(6)nvm模块内部的访问基本单元可能比cacheline大(例如inteloptanedcpersistentmemory内部的访问单元是256b)。与闪存相比,nvm技术的性能高至少2个数量级,而且nvm允许在原位置写,而不需要类似闪存的擦除等操作。因此,nvm技术的使用特征更加接近于dram,被视作对dram主存技术的一种替代或补充。基于dram的内存数据库技术已经成为数据库领域的主流技术,在oracle,mssqlserver,saphana主流商用数据库产品中,都包括了内存数据库引擎。例如,hekaton是mssqlserver中的事务处理内存数据库引擎,saphana内存数据库支持事务处理。相比传统磁盘数据库使用两段锁协议(2pl),支持联机事务处理的内存数据库倾向使用乐观并发控制(occ)和多版本并发控制(mvcc)以获得高吞吐量。这两种方法预期事务间冲突较少,允许事务激进的运行并在事务提交时检测冲突。其中联机事务为一个或者多个客户端向服务端发出请求,服务端响应和处理所有请求并返回结果。silo使用时间分片为基础的时间戳生成机制和组提交改进occ。mocc基于occ,并结合锁机制处理热数据事务冲突。tictoc将中心化的时间戳分配机制移除,并在事务提交时计算事务时间戳。hekaton在mvcc中应用无锁数据结构。hyper通过直接修改数据和将提交前的数据存储在undo缓冲中,以优化基于列式存储的内存数据库的读性能。cicada使用多个松散同步的时钟来减少mvcc的开销和冲突,尽最大努力内联数据版本以提高cpucache的命中率,并优化事务验证方法。这些方法都需要给每个数据添加元数据,比如读写时间戳,指向不同版本的时间戳,锁位等。这些方法在不考虑数据库持久性的前提下,实现了每秒百万级的事务吞吐量。和传统数据库类似,内存数据库可以使用日志和检查点技术实现持久性。不同的是内存数据库完整存储于内存,因此只有提交事务的redo日志需要写入持久存储设备。内存数据库通过加载最近的检查点到内存并读取redo日志重做已提交的事务来恢复数据库。相比支持联机事务处理的内存数据库,支持联机事务处理的nvm数据库需要重新考虑并发控制和崩溃恢复以完整支持数据库的原子性、一致性、隔离性和持久性(acid特性)。面向nvm的联机事务型数据库同时有dram和nvm两种主存,其中nvm是持久的而且容量显著大于dram,因此联机事务型数据库可以把数据完整存储到nvm,而避免了外存i/o操作。nvm容量大小的联机事务型内存数据库(mmdb):在mmdb中,索引和数据存储于传统的易失主存,事务仅使用普通的cpuload和store指令访问主存中的数据结构。但是,原本的实现受限于dram容量。当数据量大于dram时,将无法支持。如图1(a)所示,本发明可以扩展联机事务型内存数据库,将部分nvm视为易失主存,从而可以利用更大的主存支持超过dram容量的数据量。此外,我们将写前日志(wal)和检查点放入nvm,从而消除外存访问,支持数据库的持久性。数据库崩溃后,数据库根据nvm中存储的持久化的检查点和写前日志恢复易失主存中的数据表和索引等数据结构。其中nvm的特性是可以持久存储数据和字节粒度的存储访问。cpu将数据持久性存储在nvm上,使用和访问内存一样的方式访问nvm,实现和原来一样的功能并且比原来更快,但是不需要磁盘和ssd这样的块设备。消除了磁盘和ssd,即消除了外存访问。基于写后日志(wbl)的联机事务型内存数据库:如图1(b)所示,此技术在dram中存储索引和维护数据记录粒度的缓存。数据被提取到dram中进行事务处理。通过给数据增加事务标志、提交时间戳和上次提交版本的索引等元数据,wbl支持在nvm中存储逻辑数据记录的多个版本。在事务提交时,wbl在nvm上创建新版本的数据记录,并将dram中记录内容的修改持久化到新创建的记录版本中。当崩溃发生时,已提交的新版本可用于崩溃恢复。因此,wbl不需要像写前日志那样在日志中存储数据的修改,并在事务提交后写到nvm。一条写后日志包括两个时间戳:时间戳cp标记此时间前的事务均被完整持久化到nvm,时间戳cd标记cp到cd之间可能存在未完全提交事务的。崩溃发生后,系统检查最后一条写后日志,并回收时间戳处于cp到cd之间的数据记录版本。foedus:如图1(c)所示,foedus将数据记录存储在nvm中的快照数据页中,并在dram中缓存部分数据页。dram中维护数据页的索引,对于每个数据页维护两个指针,一个指向nvm中最新的快照数据页,另一个指向在dram缓冲中的数据页(如果存在)。foedus在dram中运行事务。如果事务需要访问的数据在nvm中,foedus将此数据页加载入dram并更新数据页索引。在事务提交时,foedus将redo日志写到nvm。foedus在后台运行一个loggleaner线程,周期性扫描并回收日志,以map-reduce方式使用redo日志产生新的快照数据页。nvm容量大小的联机事务型内存数据库(mmdb)存在两个问题:第一,数据的修改需要写wal日志和检查点,这会带来额外的2倍nvm写。当数据库容量大于dram,对于存储在作为易失主存的nvm上的数据,修改操作需要再写一次nvm,因此最大有3次nvm写。第二,当数据逐渐变大,越来越多的数据将存储在nvm中,由于mvcc等并发控制机制在读数据记录时也需要修改记录头部的元数据,所以即使是读事务也会引发大量的nvm写。基于写后日志(wbl)的联机事务型内存数据库:相比mmdb,基于写后日志的联机事务型内存数据库显著减少日志并且不需要检查点。因此对数据的修改只会引发一次nvm写。由于该技术在每个数据上都维护了元数据并且这些元数据因为并发控制而经常被修改,因此,此方法仍然有频繁写nvm的问题。foedus在内存中运行事务,因此可以避免nvm上的元数据的频繁修改。但是,该方法有3个明显不足:第一,数据页粒度的缓存会引起nvm的读放大,读取一个数据记录可能导致读取一整个数据页到dram。第二,foedus采用map-reduce方式处理日志生成新的数据页快照,而复杂的map-reduce计算过程在nvm中进行,会带来大量的nvm写。第三,foedus使用io接口来访问nvm,这种方法没有充分利用nvm的字节寻址特性。上述3种现有技术,存在以下三点共性问题:第一,数据记录的元数据修改,mmdb和wbl将每条数据记录的元数据存储在nvm中,由于并发控制的需要,这些元数据被经常修改。第二,数据记录的多次冗余写,mmdb和foedus对一次数据记录的写,会额外带来对日志、检查点或快照数据页的nvm写。第三,nvm空间管理,mmdb和foedus只需要粗粒度的给日志、检查点和数据页分配存储空间,而wbl需要细粒度的为每个数据记录分配空间。由于wbl技术论文未提及空间管控,一个基本的方法是将nvm空间的分配操作以元数据形式持久化到nvm,这个空间管理方法可能带来显著的nvm持久化开销。本发明提出的面向nvm的联机事务型数据库在上述研究的基础上,针对上述3个现有技术的共性问题,分别提出技术解决方案,实验表明zen显著优于上述现有技术。技术实现要素:本发明的目的是解决面向nvm的联机事务型数据库:(1)频繁写nvm上的元数据;(2)冗余写nvm上的数据记录;(3)nvm空间管理;这三方面的现有技术共性问题。针对前述共性问题,本发明提出了一种面向nvm的联机事务型数据库(zen),zen提出(1)元数据增强的数据记录缓存(metadataenhancedtuplecache,metcache);(2)无日志持久事务框架(log-freepersistenttransactions);(3)轻量级nvm空间管理机制(lightweightnvmspacemanagement)。与现有方案相比,zen充分利用nvm的字节寻址特性,减少nvm上的元数据写和数据冗余写,在nvm数据库规模条件下,实现了面向nvm的数据库高吞吐零日志的联机事务处理和高效崩溃恢复。针对现有技术的不足,本发明提出一种面向混合dram-nvm主存的联机事务型数据库系统,其中包括:用于缓存数据的dram和用于持久存储数据的nvm;nvm通过第一数据表记录nvm中存储的多个数据元组,用于事务处理并发控制的元信息仅保存在dram中,即nvm中该数据元组不保存并发控制的元信息,根据访问任务将该数据元组以元组为粒度缓存至dram,且在数据元组缓存至dram时为每个数据元组增加并发控制元信息,dram通过第二数据表记录数据元组及其对应的并发控制元信息;该联机事务型数据库系统还包括混合数据表,该混合数据表包括该第一数据表、该第二数据表,以及用于管理该第一数据表和第二数据表的管理模块。所述的面向混合dram-nvm主存的联机事务型数据库系统,其中该并发控制元信息为以元组为粒度且具有并发控制相关的元信息,该第二数据表缓存按照线程数目划分为多个缓存区域,各线程仅在其对应的缓存区域内修改数据;该第二数据表内的缓存项包括数据元组的存储空间和第二元数据,第二元数据包括活跃位、并发控制字段、元组标识字段、指向nvm版本的指针和缓存替换字段;通过该活跃位判断该缓存项是否被占用通过该活跃位控制该缓存项不被替换,若占用,则当前该缓存项不能被修改替换;事务运行中,根据通过读取和写入该并发控制字段,执行并发控制算法,并根据读取和写入该缓存替换字段,以执行缓存替换策略。所述的混合dram-nvm主存的联机事务型数据库系统,其中该第一数据表中部分数据元组存在多个数据版本,每个数据元组包括其占用的存储空间和第一元数据,第一元数据包括:事务提交时间戳、元组标识字段、删除位和事务提交确认位;通过该事务提交时间戳和该元组标识字段唯一确定事务提交版本,通过该删除位标记逻辑数据的删除;同一事务提交的所有数据元组修改具有相同的事务提交时间戳,且同一事务提交的所有数据元组修改对应的数据版本中,任意一个数据版本事务提交确认位被设置,即可确认事务已被正确提交,数据修改均已持久化。所述的面向混合dram-nvm主存的联机事务型数据库系统,其中事务在执行阶段访问该混合数据表,判断该事务访问的目标数据是否位于dram中,若是则直接访问dram中缓存的该目标数据,否则将nvm中存储的该目标数据缓存到执行当前事务的线程对应的数据缓存区域并填写与之对应的第二元信息;在dram中通过并发执行且成功提交的事务进入持久阶段,将该事务修改的所有数据版本均写到nvm上进行持久存储;事务维护阶段,回收nvm上的因新提交版本而无效的数据版本。所述的面向混合dram-nvm主存的联机事务型数据库系统,其中该持久阶段包括:事务在该持久阶段从所有数据修改所对应的多个数据版本选择最后修改完的数据进行持久化,并只设置最后修改完的数据版本的事务提交确认位为已提交;事务先持久化除最后一个版本的事务提交确认位所在的cacheline的所有版本数据;等待上述持久化操作完成后,原子性持久化最后一个版本的事务提交确认位所在的cacheline。所有要持久化的数据版本都需要按照cpucacheline粒度进行划分,然后,按照cacheline的粒度大小持久化数据。最后一项持久化的数据也同上需要按照cacheline划分,只需要保证包含lp(事务提交确认位)的那个cacheline最后持久化。这里“最后”指的是前面的所有持久化均已完成,在现有cpu技术中使用sfence保证前面的持久化均已完成。需要按照cacheline划分的原因是在现有cpu技术中,cacheline是具有原子性的。所述的面向混合dram-nvm主存的联机事务型数据库系统,其中该混合数据表配备一个主索引,该主索引的存储位置为dram或nvm,该主索引的值为同一逻辑数据最新版本的存储位置。所述的面向混合dram-nvm主存的联机事务型数据库系统,其中当存储于dram中的该主索引因掉电失去时,执行以下步骤:步骤1、初始化已确认提交事务时间戳为0,初始化待判定nvm版本指针集合为空;步骤2、选择nvm中一个元数据版本作为当前元数据版本,根据当前元数据版本的最后持久标记位判断其是否为最新修改版本,若是则将当前元数据的版本和其最新的已确认提交事务时间戳加入该已提交事务时间戳,否则执行步骤3;步骤3、判断当前元数据版本是否为已回收版本或新分配的数据页上的还未被使用过版本,若是则跳过当前元数据版本执行该步骤2,否则执行步骤4;步骤4、判断当前元数据版本的tx-cts是否小于等于当前该已提交事务时间戳,若是则通过该垃圾回收队列回收当前元数据版本,否则将当前元数据版本存入该待判定nvm版本指针集,再次执行步骤步骤2,直到遍历nvm中所有元数据版本执行步骤5;步骤5、对于处于该待判定nvm版本指针集中的元数据版本,判断其tx-cts是否小于等于当前该已提交事务时间戳,若是则通过该垃圾回收队列回收当前元数据版本,否则当前元数据版本未提交,直接回收此版本。所述的面向混合dram-nvm主存的联机事务型数据库系统,其中nvm空间管理分为两层,第一层是数据页粒度的空间管理,通过给nvm上的全局数据结构分配线程,每个线程在数据版本存储空间不够时,向图1中的nvmpagemanager提出请求。nvmpagemanager找到一个nvm数据页,得知其地址,并在nvm上管理数据页属于那个线程的持久空间上记录该地址归属于哪个数据表和哪个线程。最后将此地址告诉提出请求的线程;第二层是数据版本粒度的空间管理,数据版本粒度的nvm空间的分配和释放由dram中的数据结构通过指向nvm地址的指针进行管理。所述的面向混合dram-nvm主存的联机事务型数据库系统,其中数据版本粒度的nvm空间分配和释放采用特定线程合作机制:线程内部使用该管理模块管理nvm空间,线程之间同步当前正在运行的事务最小时间戳,事务在该事务维护阶段根据当前正在运行事务的最小时间戳tx-min,回收nvm中相同逻辑数据但事务提交时间戳小于tx-min的数据版本。任意时刻,所有线程正在执行事务。这些事务在开始时获得一个唯一的时间戳,这个唯一时间戳的大小记录了事务的先后次序。同一线程内后一个事务的时间戳大于前一个事务的时间戳。因此后一个事务提交的时间戳大于前一个提交的事务时间戳。线程间通过同步机制,保证不同线程的后一个提交的事务时间戳大于前一个提交的事务。任意时刻所有正在运行的事务所具有的时间戳中最小的那个即为事务最小时间戳。如果一个nvm版本的时间戳小于上述时间戳,那么这个nvm版本一定不被任何正在运行的事务所需要和访问。由以上方案可知,本发明的优点在于:本发明所提出的zen系统充分利用nvm的特性,消除面向nvm的事务型数据库在nvm上的数据冗余写和元数据读写,实现了nvm容量大小的高性能无日志联机事务型数据库,并实现快速崩溃恢复。附图说明图1为面向nvm的联机事务数据库;图2为zen面向nvm的联机事务型数据库;图3为基于时钟的lrucache替换算法;图4为无日志持久事务框架;图5为事务修改持久化算法;图6为nvm-tupleheap区域崩溃后状态;图7为基于扫描的崩溃恢复算法;图8为ycsb性能实验效果对比图;图9为tpcc-np性能实验效果对比图;图10为tpcc-np扩展性实验效果对比图;图11为崩溃恢复实验效果对比图;图12为并发控制支持效果对比图。具体实施方式发明人在深入理解相关数据库系统的前沿研究工作和深刻理解nvm新硬件特性的基础上,重新思考联机事务型数据库的系统结构,发现现有技术的共性问题:元数据修改,数据多写冗余和nvm空间管理。因此,发明人提出一种新的面向nvm的联机事务型数据库系统设计zen,解决了现有技术存在的共性问题。实验表明,zen相比现有技术有显著的性能提升。本发明申请包括以下关键点:关键点1:一种面向混合dram-nvm主存的联机事务型数据库系统,其特征在于(1)数据表存储在nvm中,一条数据记录可能在nvm中有多个数据记录版本;(2)使用dram作为数据记录缓存,当一个活跃事务需要访问一条数据记录时,系统首先在dram数据记录缓存中搜索该记录,如果缓存缺失,那么系统就从nvm中将最新版本的记录读入dram数据记录缓存;(3)细粒度并发控制所需要的记录级元信息,在nvm记录版本中不保存,当记录被读入dram数据记录缓存时,系统为读入记录添加细粒度并发控制元信息,元信息仅在dram中被访问和使用;(4)无日志的持久化事务,事务处理不记录日志,提交事务所修改的记录直接写入nvm成为新的记录版本;(5)轻量级的nvm空间管理,对于单条记录空间的分配和释放,不在nvm上记录元信息,在崩溃恢复时,通过扫描判断数据记录版本来确定空间是否被占用。技术效果:系统可以利用nvm的大容量,来存储比dram大得多的数据量,而又避免了外存访问的开销。利用dram数据记录缓存,减少活跃事务对于nvm的访问,完全避免在nvm上读写细粒度并发控制元信息,对于所需的记录最多读取一次。无日志的持久化事务避免了在nvm上写事务日志的开销。轻量级的nvm空间管理避免了记录版本分配释放时nvm元信息的修改。整个设计极大减少了nvm的写开销和读开销,降低了事务处理的代价,提高了并发事务处理的吞吐率,同时保证了崩溃恢复的效率。关键点2:dram数据记录缓存,其主要特征是:(1)每个记录在读入dram数据记录缓存时增加细粒度并发控制所需的元信息;(2)具体的细粒度并发控制元信息根据采用的并发控制机制来确定,可以支持包括2pl、occ、mvcc等在内的主流内存事务处理并发控制机制。技术效果:元数据增强的dram数据记录缓存使得nvm中数据记录不需要存储这些并发控制相关的元数据,从而减少nvm上元数据的频繁读写。关键点3:dram数据记录缓存划分为多个region,每个事务处理线程负责一个region的缓存替换和缓存空间管理,一个线程可以读所有region,但是一个线程只能将nvm记录加载放入所属的region。技术效果:减少了多线程缓存访问的冲突,可以在此基础上实现无锁缓存管理,发挥并发线程的效率。关键点4:nvm数据版本堆(nvm-tupleheap)存储一个数据表的数据,其主要特征是:同一逻辑数据记录可能有多个版本,每个版本包含产生该版本的事务的时间戳和该数据记录的id;nvm数据版本堆不存储细粒度并发控制相关的元数据。技术效果:完全消除了事务因为细粒度并发控制元数据对nvm的修改。关键点5:无日志持久化事务,其主要特征是:事务处理划分为3个阶段,分别是运行(perform)、持久(persist)和维护(maintenance)阶段。在运行(perform)阶段,事务读取nvm或dram数据记录缓存中的数据,数据修改仅在dram中进行,系统根据所采用的并发控制机制判断事务是否可以提交。如果事务可以提交,事务进入持久(persist)阶段,否则事务直接回滚,丢弃dram中的数据修改。在持久阶段,事务产生的每条新记录和每个对现有记录的修改,都写回nvm数据版本堆,成为一个新版本。nvm数据版本上除了时间戳和数据记录id外,还包括一个lp标志位。一个事务的写回nvm数据版本堆的新记录版本中,除了最后一个写出的记录版本外,其他记录版本lp标志位为0。对于最后一个写出的记录版本,lp标志位为1,并且要求lp标志位所在的8b是在该记录中最后写入nvm的。在维护(maintenance)阶段,对旧版本的记录进行回收。技术效果:每个事务提交时产生新版本的记录,并不立即覆盖旧版本的记录,在崩溃恢复时,可以根据需要保留新版本或者保留旧版本的记录,从而可以避免写undo/redo事务日志记录。lp标志位避免了事务提交日志记录,可以在崩溃恢复时,通过lp标志位判断一个事务是否完整提交。上述两个方法结合在一起,完全避免了事务日志,从而减少了事务日志可能引入的nvm写开销。关键点6:无日志的崩溃恢复算法,其主要特征是通过扫描nvm数据版本堆,恢复dram中的数据结构,根据lp标志位,判断事务是否完整提交,同时确定nvm中可以回收的记录版本位置。技术效果:崩溃恢复不需要事务日志,可以正确地恢复系统状态,所有提交事务的数据被保留,所有未提交事务的数据被丢弃。关键点7:轻量级nvm空间管理方法,其主要特征是对nvm空间进行二级管理。第一级是页粒度的空间管理,页的大小可以设置,nvm数据页的分配和释放需要在nvm中记录元数据。第二级是数据记录粒度的空间管理,记录粒度的nvm空间分配和释放完全在dram中管理,不需要在nvm中写元信息。分配的记录来源包括两个,一是从新分配的nvm数据页中分配,二是重新利用已回收的nvm记录版本。技术效果:nvm记录版本的分配和释放不需要在nvm中写元信息,因此减少了大量nvm写操作。关键点8:第二级的nvm空间管理是每个线程本地进行的,其主要特征是每个线程nvm堆数据版本的分配和回收是独立的,每个线程都在dram中维护自己的分配队列,把回收的版本地址放入队列,并在需要时从队列中分配数据版本,仅当分配队列为空时,才需要通过第一级的nvm空间管理获取新的nvm页。技术效果:nvm空间的分配和回收基本无竞争,减少多线程冲突对nvm空间管理开销。为让本发明的上述特征和效果能阐述的更明确易懂,下文特举实施例,并配合说明书附图作详细说明如下。本发明提出一种面向非易失主存的联机事务型数据库,主要描述如下:如图2所示,面向nvm的联机事务型数据库总体结构:nvm-tupleheap是在nvm上持久存储数据表的数据结构,具体是一个堆。每个数据表的nvm-tupleheap由2mb的nvm数据页组成,每个nvm数据页可以根据单条数据记录的大小存储若干条nvm-tuple记录。每个nvm-tuple包含16b的元数据和16字节对齐的数据域。同一nvm-tupleheap中可能包含同一逻辑数据记录的多个版本,即数据元组指:存储在nvm上的一条数据,这一条数据由tx-cts和tuple-id唯一确定。逻辑数据指:tuple-id相同的数据。同一逻辑数据可能在nvm上有多个版本。这多个版本的tuple-id相同而tx-cts不同。事务提交时间戳tx-cts和tupleid可以唯一确定一个nvm版本。删除位(deleted)标记一个数据记录的删除被持久化。事务提交标志位(lp)用于识别最后一个被持久化的数据版本,并对并发控制至关重要。每个数据记录元数据16b小于cpucache(64b),因此可以被原子性的持久化。metcache是dram中数据记录粒度的缓存,每个数据表都有自己的nvm-tupleheap和metcache。每个metcacheentry包含数据记录本身和7个元数据域:一个指向nvm-tuple的指针nvm-pointer、tupleid、脏位dirty、活跃位active、支持clockcache替换算法的锁位、一个拷贝位和支持并发控制的cc-meta域。通过metcache,zen完全将并发控制放入内存。一致内存索引是每个htable均配备的数据结构,包含一个主索引和若干可选次级索引。索引可以是hash或者基于树的索引。主索引的键是数据的逻辑主键,值标记metcacheentry位置,或者是nvm-tuple的地址。zen选择用地址保留位来区分这两种情况。由于dram访问频繁,zen选择使用“0”来标记数据在dram的metcache中,以使得zen可以直接使用该值索引metcache数据。对于次级索引,键是用户指定的,值是数据记录的主键。事务运行私有数据:zen支持多线程并发执行事务。每个线程拥有私有内存空间,并在私有空间记录事务的读写、插入等活动。occ和mvcc在单独的数据结构中记录这些操作,两段锁协议(2pl)以日志的形式记录这些修改。nvm空间管理:zen使用两层机制管理nvm空间。第一,nvm数据页粒度的管理,zen分配2mb数据页给每个htable,并在nvm上记录每个2mb页与数据表之间的分配关系。第二,每个htable配备的线程本地的nvm-tuplemanager在内存中管理tuple粒度的nvm空间。每个nvm-tuplemanager由一个nvm-tuple分配器和回收器组成。分配器包含不连续的nvm-tuple可用地址。可用地址的来源有2个,一个是新分配的nvm数据页,另一个是被回收的nvm-tuple地址。zen在分配nvm数据页时将该页数据初始化为0以用tx-cts=0来标记此页所有地址可用。回收器回收无效nvm-tuple版本并将其放入分配器。一个数据表所有nvm-tuplemanager中的回收器以线程合作方式回收无效数据版本。元数据增强的内存数据记录缓存:对于每个htable,zen将metcache划分为多个容量相等的区域(region)。每个线程拥有一个这样的区域。nvm-tupleheap也同样被划分为每个线程的区域。每个线程负责管理其自身的met-cacheregion和nvm-tupleregion。任一线程可以读取其它线程的region,但是只能写自己拥有的region。当metcache缓存需要修改另一个region里的数据记录,需要将该数据记录拷贝到自己的region中同时将原数据记录的copy位设置为1。当有cachemiss的时候,线程从nvm-tupleheap将数据加载到metcache。zen通过lru时钟算法从本地region中选择被替换的metcacheentry。这样的涉及消除了metcache之间的竞争,并且绑定metcache和nvm-tupleheap地址空间到cpu核心,也就是说每个cpu可以无竞争的获取这些dram和nvm空间。zen使用时钟算法来做metcacheentry的替换。如图3所示,该算法在线程本地region选择第一个active和clock位都为0的缓存项。如果active位被设置,该缓存项正在被活跃事务访问,算法跳过这样的缓存项以保证正在被访问的数据项不会被替换出。如果clock位被设置,该数据项最近被使用过,根据lrucache策略,zen优先保留这样的数据项在metcache中。active和clock位的修改均使用原子操作。zen根据在dram的容量有限条件下,根据数据表的大小和每个事务对数据表元组的平均访问数量,来确定metcache的数量。zen根据每个数据表,事务平均访问次数除以数据表的大小,这个参数的大小采用贪心策略来分配每个表的metcache数量。由于zen在nvm上的数据版本不包含并发控制相关的元信息,当一个数据元组从nvm中缓存到metcache时,cc-meta这个字段会填充并发控制相关的信息,这个信息和不同的并发控制算法相关。之后zen完全在内存运行并发控制因为所有被活跃事务访问的元组都已经在内存。这个涉及有5点好处:(1)细粒度的并发控制相关的元数据读写从nvm迁移到内存;(2)元组的读不会引起nvm写;(3)中止的事务不会带来nvm写开销;(4)内存并发控制降低了事务处于临界状态的时间,因此事务的中止率可能会降低。无日志持久事务框架:正常事务执行:事务执行分为3个阶段:(1)执行阶段,zen在dram中处理事务;(2)持久化,zen将最新修改或插入的元组写到nvm;(3)维护阶段:zen回收nvm上的冗余无效版本。图4展示了一个事务的生命周期。数据表维护消费者的账户。初始时,x有$500,y和z分别有$100。运行的事务是x向y和z各转账$100。此图的上半部分展示的是事务运行前的状态。nvm-tupleheap有5个元组,其中r:d已经被删除和垃圾回收。q:300被缓存在met-cache中。索引记录有效版本的位置信息,指向met-cache中缓存的元组(如有,比如q:d)或者nvm-tupleheap中的元组。nvm-tuplemanager中的分配器记录着3个可用分配地址。执行阶段:对于事务请求访问的每一个元组,zen在主索引中寻找其位置。如果此元组在nvm中,zen使用图3所示的算法找到一个met-cache项换出(如果metcache无空闲项)然后将需要访问的元组读到met-cache并使之增强具有并发控制相关的元信息,并更新主索引指向met-cache,否则直接访问met-cache中的数据。在执行阶段的访问数据和验证事务间的冲突时会用到并发控制相关的元信息,事务提交后能否回收此版本(dram和nvm版本)均需要此相关的元信息。更新主索引指向met-cache的原因是最新的数据在met-cacheentry,而不在nvm-tupleheap,该数据即将发生改变或者即使只是被读取进行并发控制,该项met-cacheentry都是逻辑数据的最新数据。zen不需要将被换出的元组写回nvm,因为以下原因:(1)如果此元组只是被当前事务之前的事务读取,此版本未发生改变,索引指向nvm中的相同数据,因此该缓存元组直接丢弃。(2)如果该缓存项被当前事务之前提交的事务修改,该met-cache缓存项必定在前述事务的持久化阶段写回nvm。(3)如果这个事务被中止事务修改,该缓存项无效并且应该被舍弃。图3所示的算法的输入为运行事务的线程号,输出为找到的被替换的met-cacheentry的位置。第一步,根据线程号找到该线程具有写权限的一组连续met-cacheentries区域。第二部,循环访问此区域中的每项met-cacheentry,如果此项entry的active标志位被设置,则跳过此项entry,否则继续判断此项。如果此项entry的clock位为1,则将clock位设置为0,并跳过此项,否则继续判断此项。如果上述两项均未跳过此项entry,则此项entry满足条件,可以被替换。其中clock的意义在于以lru(leastrecentused)策略选择换出项以最大化利用cache性能。每次数据访问met-cacheenrty均会将clock位设置为1。zen因为met-cache这个设计能在完全在dram做并发控制。如果没有冲突事务可以提交,zen进入持久化阶段。如果事务必须中止,zen检查被该事务访问的met-cache项是否是脏数据。对于脏数据,zen使用met-cache的nvm-pointer指向的nvm-tuple来恢复该met-cache项中的数据以使得重试的事务找到正确的数据。图4下半部分展示事务运行后的系统状态。在执行阶段,zen将x、y、z加载到met-cache。索引也对应修改了。事务在met-cache中将x、y、z分别修改为300、200和200.事务的私有数据空间记录事务的读写集合。持久化阶段:zen将事务修改所产生的新元组无日志的持久化到nvm上。这里的挑战是将多个元组原子性的持久化到nvm上并且不写redo日志和提交日志。主要思路是:(1)zen将元组持久化到nvm-tupleheap中的空闲nvm槽位,这样旧版本是完好无损的。zen可以在崩溃恢复时回退到旧版本。并且这个方法已经在wbl中被证明可用。(2)zen使用原子操作标记事务的最后一个修改版本的最后持久标记位(lp)。这个lp位和提交日志有同样的功能。在崩溃恢复时,如果lp位被标记,那么这个事务提交成功,并且所有的修改均已持久化到nvm。否则说明系统崩溃在事务的持久化阶段出现了。因此zen丢弃该事务所有修改。图5展示了1个事务将其对元组的修改持久化到nvm的过程。该事务并发的持久化除了最后一个包含lp位的cpucache-line。cpucache-line是64b对齐的。该算法使用循环每64b使用clwb指令按照cpucache-line写出。前面这些cpucache-line持久化过程的顺序是不影响正确性的。但是这些写回必须先于最后一个修改的lp写回,zen通过sfence指令来保证这一点。包含最后一项修改的元数据能原子性的写回是因为nvm-tuple是16b对齐的并且元数据的大小是16b。该算法可以只用1个sfence,而不需要在最后一个clwb之后再使用1个sfence。这是正确的因为恢复过程无论lp是否被写到nvm都可以正确的处理该事务。并且任何之后事务的sfence都可以保证最后1个clwb指令完成。举个例子,1个用户交互线程可以在将事务结果返回客户端之前执行1个sfence指令。如图4右下部分所示,zen在空闲nvm槽位f、g、h将x’,y’和z’写回,其中z’是最后一项。因此,zen在把lp位设置在z’的元数据中。维护阶段:为了减小竞争,每个线程都有自己的私有nvm-tuple分配器和垃圾回收队列。一个线程当发现有新版版本时就可以回收旧版本。垃圾回收的时机有2个:(1)当事务提交要重写一个新的逻辑版本时,当前线程回收旧的nvm-tuple版本,除非当前版本是从其它线程的region中拷贝过来的。(2)在met-cache替换出该版本时,当前线程回收met-cache中已被复制的nvm-pointer所指向的nvm-tuple版本。这里要注意,当前met-cache项必定已经被另一个提交事务拷贝,并且该事务已写到nvm上一个更新的版本。这样,线程可以在本地回收旧版本。在garbage队列中的回收项不能立即被使用因为相关的旧版本可能正在被其它运行着的事务访问(比如,mvcc并发控制)。每个垃圾回收项包含nvm-tuple指针和事务时间戳。zen通过计算每个线程的最后一次提交时间戳,来维护一个全局最小已提交事务的时间戳,保证运行时的事务时间戳高于该全局时间戳。garbage队列中小于全局最小提交时间戳的回收项可以被放入分配器安全复用。如图4左下方所示,zen将x、y和z的旧版本放入垃圾回收队列。zen将r:d从垃圾回收队列放入分配器,因为该垃圾回收项的时间戳小于全局最小提交时间戳。灵活支持多种并发控制算法上述事务处理设计提供了一个灵活支持多种并发控制方法的框架。zen通过实验证明至少支持10种典型的并发控制算法,包括两段锁、occ、mvcc和基于划分的并发控制。为了支持不同并发控制方法,met-cache的cc-meat使用和并发控制相关元数据。对于两段锁,cc-meta的元数据是锁位。对于occ,cc-meta包括元组的写时间戳,读时间戳写锁位和标记最新版本的位。对于mvcc,cc-meta包括多个时间戳和版本指针。这些并发控制方法均通过met-cache完全在内存中执行。考虑支持版本的并发控制这个特征,并发控制方法分为单版本方法和多版本方法。met-cache是否支持版本是由并发控制方法确定的。nvm-tupleheap支持多版本是为了移除redo日志,和met-cache是否支持多版本无关。队医单版本并发控制方法,met-cache为每个元组维护单一版本,被并发控制保护的元组修改直接修改met-cache中的元组。当在nvm-tupleheap存在多个已提交的数据版本,只有最新的版本被缓存入met-cache。对于多版本并发控制方法,met-cache中有被事务直接访问的多版本,事务会给每次修改创建一个新的版本。缓存替换算法不会替换这些缓存项active位被设置。相关已提交的nvm-tuple版本也必须存在于nvm。只有最新版本在garbage队列中进行记录。同一逻辑元组的多版本不能直接放到分配器的原因是这些元组可能被正在运行的事务访问。多版本并发控制方法通常为同一逻辑元组的多个版本维护为版本链表。主索引一致指向最新版本。旧版本总可以通过版本链表找到。无日志崩溃恢复:崩溃发生后,dram中的数据结构丢失,这些数据包括索引、nvm-tuple管理器、met-cache和事务私有信息。zen需要重建索引和元组粒度的nvm空间管理器。met-cache和事务私有数据不需要被恢复。在nvm中持久化的数据包括nvm元数据(数据表结构、页粒度的页面分配信息)和nvm上的数据表的元组。图6是一个崩溃后的例子。例子中有时间戳分别为1000、1003、1015和1016的4个事务,其中时间戳为1000和1003的两个事务有lp标记,是提交成功的事务。但是另外两个事务未能成功提交。在崩溃恢复时,zen运行多个线程。每个线程扫描一个nvm-tupleheap区域。一个朴素的方法是扫描两次。第一次扫描通过统计lp计算事务提交的全局最大时间戳。第二次扫描通过将元组时间戳和全局最大提交时间比较来识别出所有提交的版本。zen提出一个如图7所示的改进算法来避免扫描两次。算法的主要思想是尽可能用目前的最大提交时间戳识别出更多的提交版本,只有无法确定的版本才需要被在此访问。需要被再次访问的平均元组数目是o(log(n)),这里n是nvm-tuple中版本的数量。算法描述如图7所示。该算法用ts-commit来维护当前最大提交时间戳。zen在扫描的过程中不断通过有lp标记的版本更新为更大的值。zen认为所有小于或等于该时间戳的版本均被提交。zen通过比较时间戳来更新索引,使之指向最新的版本,同时将旧版本回收。如果版本时间戳大于ts-commit,zen暂时不能分辨当前版本是否提交,因此将其放入待定数组。在第一次扫描区域数据之后,ts-commit成为本区域的最大时间戳。之后,zen处理第一次扫描不确定的版本。如果被再次访问的版本时间戳小于等于ts-commit,zen更新索引并回收旧版本。如果被再次访问的版本时间戳大于ts-commit,崩溃一定发生在持久这个版本相关事务的过程中。由于一个线程只能写本地区域,所有同一事务的写在同一个区域。这说明扫描过程识别了此事务的所有版本,但是由于没有lp标记,因此事务未完成提交。zen丢弃这些改变并回收这些版本。正确性:图7所示算法识别了区域内所有的提交版本。第一,如果版本的时间戳小于等于ts-commit,那么该事务一定已提交完成。这是因为区域内的元组由同一个线程写出,并且同一线程的事务时间戳是单调递增的(尽管不同线程之间的时间戳在某些并发控制算法中不是全序关系)。第二,该算法在主扫描循环中执行检查,之后再检查不确定的版本。因此所有的nvm版本都被识别(为提交或者未提交)。该算法正确的重建了索引。该算法对未删除的提交版本调用updateindexgc,这使得最新版本被索引指向。该算法也回收了无用版本槽(比如,旧版本,删除的版本,nvm数据页中的未用版本)。更进一步,该算法是幂等的。该算法不改变提交的元组,将提交时崩溃的事务要修改的版本标记为空槽。因此,当恢复时发生了系统崩溃,zen可以重新运行该算法得到相同的ts-commit并再次恢复索引,得到相同的数据库恢复状态。最后,考虑崩溃发生时,系统运行恢复一段时间了,第二次崩溃发生了。第二次恢复后的数据库不会看到第一次崩溃恢复失败造成的任何未提交版本因为zen在第一次崩溃恢复已将那些版本标记为空槽。恢复效率:在无法确定数组中的元组被访问了两次。因此,无法确定元组的个数决定改进算法相比于简单算法的收益。定理:无法确定数组中的元组数量是平均o(log(n)),这里n是nvm-tupleheap中版本的的数量(通常n是很大的)。证明:假设有不同时间戳的版本随机均匀分布在所有nvm-tupleheap中。设k为有lp标记的版本数量,同样假设这些版本是随机均匀分布在nvm-tupleheap区域中,并且在时间顺序上也是随机均匀分布的。在典型的联机事务系统(oltp)中,同一事务访问元组的数量是有上界的小数常量。因此k和n同数量级。因此这k个具有lp标记的版本将nvm-tupleheap区域划分为k+1个子域,每个子域平均长度为n/(k+1)。如果版本的时间戳大于ts-commit,则被放入待定数组。初始的ts-commit等于0。所以第一个子域的所有元组都被放入了待定数组。考虑第i个子域,由于前面已访问过i-1个具有lp的版本,ts-commit是前i-1个提交版本时间戳最大的,因此第i个子域的提交时间戳有1/i的概率大于之前的ts-commit。因此:l为待定版本的长度,h为欧拉数列。因此l的上界是o(ln(n))。算法输入为nvm上的数据分区和初始索引,输出是完成了的索引。算法会访问全局定义的索引结构。该索引初始为空,算法结束后,该索引被恢复。第一步,定义当前确认的已提交事务时间戳(时间戳小于等于此时间戳的版本一定已提交),初始化为0,和当前无法判定的nvm版本指针集合,初始化为空集合。第二步,对于扫描区域内的任一版本如果该nvm版本的lp位被设置,则选择该nvm版本和已确认提交事务时间戳之中大者作为当前已确认提交事务时间戳。如果该nvm版本的deleted标记被设置或者tx-cts为0(为已回收版本或新分配的数据页上的还未被使用过版本),开始处理下一个nvm版本。如果该nvm版本的tx-cts小于或者等于当前已确认提交事务时间戳,则调用程序,更新索引和回收垃圾nvm版本(updateindexgc);否则(nvm版本的tx-cts大于当前确认已提交时间戳)此nvm暂时不发确认是否提交,将其放入待定nvm版本集合。(经过第二步完整扫描已确定全局提交事务时间戳)第三步,对于处于未决nvm版本集合中的nvm版本,如果nvm版本tx-cts小于已确认全局提交时间戳,则调用程序,更细索引和回收垃圾版本。否则当前nvm版本未提交,直接回收此版本。更新索引和回收垃圾算法输入为nvm版本,无输出。以下为与上述方法实施例对应的系统实施例,本实施方式可与上述实施方式互相配合实施。上述实施方式中提到的相关技术细节在本实施方式中依然有效,为了减少重复,这里不再赘述。相应地,本实施方式中提到的相关技术细节也可应用在上述实施方式中。本发明还提供了一种面向混合dram-nvm主存的联机事务型数据库系统,其中包括:用于缓存数据的该dram和用于持久存储数据的该nvm;nvm通过第一数据表记录nvm中存储的多个数据元组,用于事务处理并发控制的元信息仅保存在dram中,即nvm中该数据元组不保存并发控制的元信息,根据访问任务将该数据元组以元组为粒度缓存至dram,且在数据元组缓存至dram时为每个数据元组增加并发控制元信息,dram通过第二数据表记录数据元组及其对应的并发控制元信息;该联机事务型数据库系统还包括混合数据表,该混合数据表包括该第一数据表、该第二数据表,以及用于管理该第一数据表和第二数据表的管理模块。所述的面向混合dram-nvm主存的联机事务型数据库系统,其中该并发控制元信息为以元组为粒度且具有并发控制相关的元信息,该第二数据表缓存按照线程数目划分为多个缓存区域,各线程仅在其对应的缓存区域内修改数据;该第二数据表内的缓存项包括数据元组的存储空间和第二元数据,第二元数据包括活跃位、并发控制字段、元组标识字段、指向nvm版本的指针和缓存替换字段;通过该活跃位判断该缓存项是否被占用通过该活跃位控制该缓存项不被替换;事务运行中,根据通过读取和写入该并发控制字段,执行并发控制算法,并根据读取和写入该缓存替换字段,以执行缓存替换策略。所述的混合dram-nvm主存的联机事务型数据库系统,其中该第一数据表中部分数据元组存在多个数据版本,每个数据元组包括其占用的存储空间和第一元数据,第一元数据包括:事务提交时间戳、元组标识字段、删除位和事务提交确认位;通过该事务提交时间戳和该元组标识字段唯一确定事务提交版本,通过该删除位标记逻辑数据的删除;同一事务提交的所有数据元组修改具有相同的事务提交时间戳,且同一事务提交的所有数据元组修改对应的数据版本中,任意一个数据版本事务提交确认位被设置,即可确认事务已被正确提交,数据修改均已持久化。所述的面向混合dram-nvm主存的联机事务型数据库系统,其中事务在执行阶段访问该混合数据表,判断该事务访问的目标数据是否位于dram中,若是则直接访问dram中缓存的该目标数据,否则将nvm中存储的该目标数据缓存到执行当前事务的线程对应的数据缓存区域并填写与之对应的第二元信息;在dram中通过并发执行且成功提交的事务进入持久阶段,将该事务修改的所有数据版本均写到nvm上进行持久存储;事务维护阶段,回收nvm上的因新提交版本而无效的数据版本。所述的面向混合dram-nvm主存的联机事务型数据库系统,其中该持久阶段包括:事务在该持久阶段从所有数据修改所对应的多个数据版本选择最后修改完的数据进行持久化,并只设置最后修改完的数据版本的事务提交确认位为已提交;事务先持久化除最后一个版本的事务提交确认位所在的cacheline的所有版本数据,之后原子性持久化最后一个版本的事务提交确认位所在的cacheline。所述的面向混合dram-nvm主存的联机事务型数据库系统,其中该混合数据表配备一个主索引,该主索引的存储位置为dram和/或nvm,该主索引的值为同一逻辑数据最新版本的存储位置。所述的面向混合dram-nvm主存的联机事务型数据库系统,其中当存储于dram中的该主索引因掉电失去时,执行以下步骤:步骤1、初始化已确认提交事务时间戳为0,初始化待判定nvm版本指针集合为空;步骤2、选择nvm中一个数据版本作为当前数据版本,根据当前数据版本的最后持久标记位判断其是否为最新修改版本,若是则选择当前数据版本的事务提交时间戳其和已确认提交事务时间戳中最大者作为已确认提交事务时间戳,否则执行步骤3;步骤3、判断当前数据版本是否为已删除版本或新分配的数据页上的还未被使用过版本,若是则回收该当前数据版本并执行步骤2,否则执行步骤4;步骤4、判断当前数据版本的事务提交时间戳是否小于等于当前该已提交事务时间戳,若是则更新索引指向该数据的最新版本并回收该数据的旧版本,否则将当前数据版本存入该待判定nvm版本指针集,再次执行步骤步骤2,直到遍历nvm中所有数据版本执行步骤5;步骤5、对于处于该待判定nvm版本指针集中的数据版本,判断其事务提交时间戳是否小于等于当前该已提交事务时间戳,若是则更新索引指向该数据的最新版本并回收该数据的旧版本,否则当前数据版本未提交,直接回收此版本。所述的面向混合dram-nvm主存的联机事务型数据库系统,其中nvm空间管理分为两层,第一层是数据页粒度的空间管理,通过给nvm上的全局数据结构分配线程;第二层是数据版本粒度的空间管理,数据版本粒度的nvm空间的分配和释放由dram中的数据结构通过指向nvm地址的指针进行管理。所述的面向混合dram-nvm主存的联机事务型数据库系统,其中数据版本粒度的nvm空间分配和释放采用特定线程合作机制:线程内部使用该管理模块管理nvm空间,线程之间同步当前正在运行的事务最小时间戳,事务在该事务维护阶段根据当前正在运行事务的最小时间戳tx-min,回收nvm中相同逻辑数据但事务提交时间戳小于tx-min的数据版本。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1