基于混合持久化内存数据结构的并行读写优化之二:RNTree

研究目的

作者的研究宗旨在于解决由于原子写大小导致的性能瓶颈,同时提供较好的并发性能。

研究背景

本文是基于混合型内存作为主存的系统架构而言的,叶子节点存储在NVM上,内部节点存储在DRAM。

当今基于NVM的B+树数据结构的性能瓶颈主要由于原子写的大小,因为原子写的大小限制着数据持久化的开销和保持叶子节点有序的开销,并发性和持久性的重叠设计是影响系统可扩展性的关键。

研究概述

作者提出当前面临的两个挑战:其一、持久化写与使叶子节点有序引起的开销权衡,其二、如何降低同步的开销以提高可扩展性。

1、作者利用HTM提供更大的原子写,使原来8字节的原子写扩大为64字节的原子写,以此减少flush指令;

2、通过 dual slot array(双插槽)和重叠并发性和持久性设计提供更好的并发性,使得并发控制只会在节点修改时出现。其中一个作为持久化的插槽,用于数据的更新到NVM上,另一个插槽作为瞬时的插槽,用于当对原始数据进行修改时,把旧数据的拷贝,此时的修改操作将不会影响读操作的并行。并对节点添加lock、version、split等字段,以此来提供并发时的数据一致性和并发控制。

关键技术

作者主要解决了1、有序叶子节点与持久化写开销之间的权衡,2、支持更快速的有条件写(键值唯一),3、重叠持久性与并发性,将持久化指令从临界区移出,有效地减少了线程间的竞争,4、支持持久化的线性一致性。

关键技术如下:

节点设计

 每一行代表一个缓存队列的大小(64 byte),第一行代表节点数据的辅助信息,nlog表示当前节点中已经被分配空间但是可能未被持久化的数据的数量,plog表示节点中已经被持久化的数据的数量。第二行slot array第一个字节表示整个slot array的大小(叶子节点中存储的键值对个数),其它63个字节表示对应顺序下键值对所在顺序。从第三行开始表示存储的键值对。nlog与plog不需要保证崩溃一致性,因为都能从叶子节点恢复。

如此的叶子节点设计可使head、slot array的更改不需要持久化指令并能实现原子写。但是键值对的log的大小可大于64字节,因此需要持久化指令。

slot array设计

其中一个slot array数据是需要持久化的,另一个数据是瞬时的,瞬时的slot array存储的数据是已经被持久化的节点数据,持久化的slot array每次更新也会对应的更新瞬时的slot array,当需要读数据时,都是从瞬时的slot array中读取数据。因此使得读操作与写操作可并行执行,同时作者设置了一个字段version,用来避免读的数据是不一致的,比较version是否一致,不一致便重新再读瞬时的slot array。

  

具体操作

节点插入

先分配空间,然后持久化键值对,完成键值对的持久化后进行并发控制,对节点上锁,修改slot array,在完成器持久化后释放锁,在插入过程中出现分裂操作,则等待分裂操作完成后再释放锁

 

节点分裂

为预防在节点分裂期间电脑发生崩溃,设置了一个undo logs来记录整个分裂操作,当系统出现崩溃时,可以通过undo log实现数据恢复。进入节点分裂后,首先设置节点split字段 ,然后直到数据节点分裂完成,释放undo log 并设置split字段。    split字段最大的作用便在于当数据崩溃后,数据恢复时,判断节点是否完成分裂                                             

 

节点查询

 查询数据时,查询对象都是瞬时slot array,瞬时slot array便是对当前节点数据的快照,对节点的快照数据进行查询,当节点数据在修改时都会重新对持久化的slot array进行快照。如果再一次读的过程中,快照发生变化,此时前后两次读到的数据就会version不同,便会重新读当前快照的数据。

节点修改

对节点数据的修改时,把数据写入当前节点空的空间中,直到节点的数据以及相关信息持久化后,修改旧数据的slot array 使得旧数据无效。

节点删除

删除仅仅需要修改slot array,使其变为无效数据。

实验环境

实验基于DRAAM和NVM的混合内存存储结构,叶子节点存储在NVM,内部节点存储在DRAM。

数据的写操作是不需要并发控制和持久化的。

总结

作者所有的设计基础都是基于使用HTM扩大原子写的大小到64byte。在此基础上对数据结构进行优化。

研究思考

关于数据的更新操作采用copy-on-write。需要一个log记录修改操作以达到数据一致性保证。

如何更好解决关于B+树范围查询的问题

如何解决基于条件写的NVM数据结构实现。

快照的方式是不安全的,可以针对快照在数据节点修改时会变化进行攻击。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值