fast2020《Hybrid Data Reliability for Emerging Key-Value Storage Devices 》

 

题目:新兴键值存储设备的混合数据可靠性

摘要:

数据存储技术的快速增长创造了现代数据驱动的世界。现代工作负载和应用影响了存储设备从简单的块设备到更智能的对象设备的演变。新兴的下一代 (KV)存储设备允许将可变长度的用户数据直接存储和检索到设备上,并且可以通过用户需要的可变长度键进行寻址。独立磁盘冗余阵列(RAID)等多个块存储设备的传统可靠性方案已经存在很长时间了,并且被大多数具有多个设备的系统所使用。

现在,问题出现了,这些新兴的目标设备的等价物会是什么样子,它与传统的机制相比会是什么样子。本文针对Key-Value设备提出了Key-Value Multi-Device(KVMD),这是一种混合数据可靠性管理器,它采用了各种不同的可靠性技术,具有不同的权衡。我们提出了三种适用于可变长度值的可靠性技术,并使用三星的KV固态硬盘对采用这些技术的混合数据可靠性机制进行了评估。我们的评估表明,与基于Linux mdadm的块设备RAID吞吐量降级相比,KV设备的数据可靠性可以在同等或更低的吞吐量降级的情况下实现。此外,KV API可以更快地重建和恢复故障设备,还允许根据值大小自动设置混合可靠性配置,以及针对用户数据进行自定义的按对象可靠性配置。

关键字:

前言:

总结:

1.简介

现代应用程序需要比传统关系数据库和文件系统提供的存储模型更简单、更快速、更灵活的存储模型,键值存储已成为许多可扩展存储系统的主流选择和主干[1-3]。为了满足这类应用的需要,并进一步简化存储这类用户数据的过程(而不增加软件膨胀),现代存储设备经历了新的键值翻新[4-8]。

三星Key-Value(KV)固态硬盘[4,5]将键值存储逻辑与NAND闪存固态硬盘固件相结合,并采用键值用户界面,而不是传统的块界面来存储和检索用户数据。这类设备的商业成功和广泛采用将是迈向更智能和智能存储设备的第一步。采用这些设备的一个实际问题是为存储在这些设备中的数据识别和评估合适的数据可靠性技术。

具有多个块存储设备的传统系统采用固定长度、基于块的数据可靠性技术来克服由于数据损坏和设备故障造成的数据丢失,独立磁盘冗余阵列(RAID)[9]已经成为这些设备的事实标准。另一方面,KV设备允许存储和检索与可变长度用户键相关联的可变长度对象。它们的存储语义和数据可靠性技术/恢复机制不同于传统的块设备。

在这项工作中,我们解决了为KV设备量身定做的数据可靠性解决方案的需求,并提出了KVMD,这是一种用于此类设备的混合数据可靠性管理器。KVMD对于KV设备,就像RAID用于块设备一样。我们提出了四种不同的可配置可靠性技术,它们都适用于通过可变长度键寻址的可变长度数据,用于KVMD:散列、复制、拆分和打包这些技术相当于传统的RAID0RAID1RAID6体系结构。我们还介绍了这些机制在吞吐量、存储和可靠性方面的不同权衡,使用户能够做出明智的决策。

此外,我们提出了三种不同的KVMD操作模式:

独立模式,其中工作负载大小和特征可能保持大致相同并且用户预先知道,并且用户可以为所有数据选择单一可靠性技术;

混合模式,其中用户可以使用不同预配置范围内的值大小为KV配置不同的可靠性技术;以及

自定义模式,其中用户可以指定每个KV对的可靠性技术,并且可以与独立模式或混合模式组合使用。

我们还使用三星的NVMe Key-Value固态硬盘(KV固态硬盘),在独立模式和混合模式(因为自定义模式只是功能扩展,性能特性不需要单独评估)下,针对不同的值大小评估上述各个技术。我们表明,与基于Linux mdadmRAID的块设备吞吐量降级相比,KV设备的数据可靠性可以在同等或更低的吞吐量降级的情况下实现。与基于Linux mdadm的RAID相比,通过灵活的KV接口实现的KVMD还可提供更快的重建和恢复速度。最后,我们得出的结论是,由于灵活的现代设备接口,KV设备的KVMD不仅为用户提供了自定义配置便利,而且在许多方面都等同于或优于块设备的方案。

2.KV SSD

自从几十年前引入第一个磁盘驱动器以来,存储设备技术经历了巨大的变化。然而,直到最近,传统的随机存取块接口仍被用于访问大多数现代存储设备,甚至是NAND闪存固态硬盘。这里,我们介绍来自三星的企业级NVMe Key-Value固态硬盘[4]。

多年来,NAND闪存密度大幅增长;设备的内部并行度和读/写带宽大幅提高。此外,NAND闪存单元只能以大小为8-32KB的页面为单位进行读取和编程,并且只有在擦除之后才能对页面进行编程,擦除是以大小为4-8MB的较大单位完成的。为了处理此类设备特征并管理主机可寻址的4 KB逻辑块到存储介质的放置和检索,传统的NAND闪存固态驱动器已经配备了功能非常强大的硬件和增强的固件。

本文中用于评估的KV固态硬盘与用于评估的块固态硬盘使用相同的硬件资源。KV固件基于块固件,并进行了修改以支持可变长度值和键的存储、检索和清理。KV  IO吞吐量是否与数据块IO吞吐量匹配,或者增加的硬件资源对KV IO吞吐量会有什么影响,这完全是另一篇文章的主题,为简洁起见,这里不再讨论。

 

图1说明了KV固态硬盘IO路径中的主要组件。三星KV-SSD使用Non-V olatile Memory Express(NVMe)接口协议,该接口协议是为通过PCIe连接的低延迟、高性能非易失性存储设备开发的。如图所示,可变长度KV对与NAND闪存页中的任何内部元数据一起以类似日志的方式存储,并且索引存储该可变长度BLOB的物理位置/偏移,而不是以类似日志的方式存储固定的4KB数据并索引4KB块位置。固件现在还具有基于散列的键查找逻辑,而不是传统的基于逻辑块号的查找。此外,垃圾收集逻辑还配备了处理可变长度KV对清理的功能。康等人[5]更详细地描述这些设备的设计和优势。

 

存储服务器中的用户应用程序可以使用KV库API,KV库依次与KV SSD设备驱动程序对话,以与KV SSD进行对话。开源KVSSD主机软件包提供KV API库以及对KV固态硬盘的用户空间和内核设备驱动程序的访问[10]。表1中列出了Samsung Key-Value SSD API,该API的详细说明可在主机软件包提供的KV API规范中找到。

从表中可以看到,API提供了打开/关闭设备的管理调用,并获取诸如设备容量/利用率、支持的最小/最大键和值长度以及最佳值长度等信息。API还包括对KV对进行分组的容器的概念。KV API包括用于存储、检索和删除KV对的异步和同步调用。此外,用户可以获得关于KV对的信息或检查设备中是否存在键。最后,用户可以打开谓词上的迭代器集,并且可以按字典键序遍历仅键或键和值。

3.KVMD设计

KVMD是多个KV设备的虚拟设备管理器。如图2所示,KVMD处理发送到虚拟设备的KV操作,并将用户数据块存储在其管理的底层KV设备中。KVMD的可靠性管理器依赖于多个可插拔可靠性机制(RM)实现,并且可以处理底层KV设备不支持的巨大值大小。它还可以有一个可选的数据/元数据缓存层,以提高性能。

 

虚拟设备层以无状态方式工作,也就是说,它不需要维护任何KV到设备的映射即可工作。KVMD可在三种模式下操作:

·独立模式,其中工作负载大小和特征可以保持大致相同和/或用户预先知道,并且用户为存储在设备组中的所有KV数据选择单个可靠性机制;

·混合模式,其中用户在不同的值大小范围内为KV预先配置不同的可靠性机制;以及

·自定义模式,其中用户可以默认地设置独立模式或混合模式,并且另外指定每个KV对的可靠性技术,在该技术上,无论默认设置如何,所指定的技术都将用于KV对。

使用配置文件指定混合模式的大小阈值和相应的可靠性机制。如果单个存储指定的RM不同于默认配置,则激活自定义模式。配置文件还用于指定要用于RM的任何RM特定参数和纠删码实现。

KVMD管理器负责创建和删除底层设备抽象层,该抽象层处理队列深度维护和对底层存储设备的调用。各个RM共享混合管理器拥有的底层设备抽象对象。在虚拟设备创建期间指定的底层设备顺序由KVMD管理器保留。此排序用于以循环方式确定相邻设备(前面和后面的设备)。虚拟设备的API设计为与表1中所示的KV SSD API非常相似,但增加了一个重建设备调用,以从整个设备故障中恢复并重建设备内容,并且能够选择性地为存储指定自定义RM。除了同步重建设备调用之外,KVMD还支持存储、检索和删除调用的同步和异步版本。

3.1 混合模式操作

我们将描述KVMD在混合模式中的操作,因为自定义模式类似,而独立模式是更简单、直接的版本。

RM确定。由于KVMD是无状态的,并且可以在没有可选缓存层的情况下操作,因此当用户发出KV调用时,KVMD不知道键是否已经存在。底层RM可以以不同方式处理插入和更新。因此,如果KV对已经存在(怎样知道KV对是否已经存在?对键进行哈希),则所有存储/检索/删除操作必须首先确定先前使用哪个RM写入KV对。此信息与其他元数据一起存储在所有值的开头,如图3所示,即内部值的结构。

 

“ RM ID”标识用于存储KV对的RM,“ EC ID”标识该RM使用的纠删码,“ Total splits”存储将一个大对象拆分为的拆分数(在“ Huge Object Handling”下讨论) ')和'校验和'字段存储校验和,并确保回读的数据没有被破坏并用于检测故障。各个RM确定如何计算和存储校验和。其他特定于RM的元数据也与该值一起存储,然后填充。

KVMD会为每个操作读取部分/整个KV对,从而通过将请求转发到相应的RM来确定用于写入KV对的RM,然后继续操作。为了帮助混合管理器进行此确定,所有RM都遵循以下规则:

1.将KV对的第一个副本/块放在主设备上,该设备是使用键上的相同哈希函数确定的,以设备数量为模;

2.使用与用户键相同的键至少存储第一个副本/块/信息。

3.在值的开头存储元数据,例如RM标识符,EC标识符。

KVMD先对键执行hash操作找到存储该对象的主设备,然后在主设备上通过键找到值,而值的前面存储的有RM标识符、EC标识符等元数据)

大对象处理。由于内部限制,底层KV SSD设备可能会限制所支持的最大值。例如,用于这项工作的Samsung KV SSD的大小上限为2 MB。基于底层设备的最大大小减去元数据大小及其自身的配置参数(例如,一个值被拆分并存储到的设备数量),单个RM可能还具有一个可以支持KV对的最大值。如果值大小超过RM支持的最大大小,则KVMD会将KV对拆分为多个KV对,其中每个拆分的大小由RM支持的最大大小确定,并且无论剩余大小如何,都使用同一RM存储它们的分裂。(对大对象分割处理是因为设备支持的大小有限,不得不分割)

如图3所示,内部键除了用户键字段外还具有其他元数据字节,例如“分隔数”和任何“ RM特定元数据”。对于较大值的第一个拆分和没有任何拆分的KV,拆分数均为零。因此,KVMD支持的最小和最大键大小比基础KV SSD支持的键大小小2个字节。在读取期间,如果值中的元数据表明它是巨大对象的一部分,则KVMD会根据需要发出其他IO请求以处理巨大对象。

存储。将巨大的对象拆分为多个对象后,将使用配置的大小阈值确定用于存储键的RM。然后从主设备读取KV对。如果KV已经存在,则从存储有该值的元数据中提取先前用于存储KV对的RMprev,以及存储的分割数。然后,调用RMprev的update(用于匹配拆分号)和delete(用于先前存储的多余拆分)方法,以让RMprev以RM特定的方式处理这些方法。最后,调用新的RM的存储方法来存储所有KV对拆分。

检索。从主设备读取KV对。如果存在,则确定RMprev以及用户值大小和KV对的拆分数。检索请求可能需要其他调用才能读取多个拆分,或者仅调用RMprev的complete_retrieve方法即可完成RM认为合适的初始读取。最后,将用户请求的数据组装到用户值缓冲区。

删除。首先从主设备读取KV对。如果存在,则从元数据中确定RMprev和分割数。然后,对所有拆分调用RMprev的delete方法。

重建设备。在设备发生故障时,KVMD可以通过遍历出现故障的设备附近的设备中存在的所有键并执行KV恢复,将发生故障的设备中存在的所有KV重建到新设备。一些RM可能需要遍历发生故障的设备之前的设备和发生故障的设备之后的设备,而某些RM可能只需要遍历设备中的一个设备。在开始重建过程之前,混合管理器首先从所有基础RM获取要迭代的驱动器列表。

3.2 可靠性机制

本节描述了我们实现的4种不同的可靠性机制,这些机制可以插入我们的框架中。表2示出了与不同RM一起存储的元数据信息,并且将在下面进一步讨论。

 

3.2.1哈希

散列不会添加任何冗余/数据保护。与RAID 0相似,其目的是负载平衡和将请求分配到所有基础设备。它仅对键进行哈希处理并将一个副本存储在主设备中,并将所有检索和删除调用定向到主设备。当设备发生故障时,任何恢复尝试都会失败,并且存储在设备中的用户数据将丢失。

3.2.2单个对象复制

复制是许多对象存储中针对每个对象(KV对)应用的一种简单,流行的冗余机制。由键哈希确定的主要设备存储对象的主要副本。如图4所示,除主副本(其中r是用户可配置的副本数)外,当发生任何写入操作时,对象的副本将被写入r-1个连续设备,并且以循环方式确定连续设备。由于三向复制是许多系统(包括分布式系统)中的常用配置,因此默认情况下r设置为3。

 

所有副本都是相同的,并以相同的键存储在不同的设备中。r(副本数)也与其他元数据一起存储,如表2所示。所有RM还具有num_user_key方法,用于从主设备返回存储用户键的设备数,而没有任何RM特定的键元数据。例如,复制的num_user_key返回r。所有RM的更新方法都获得uknew,这是新RM的num_user_key方法的返回值。如果uknew小于r,则Replication将删除最终的r-uknew个KV。最后,将存储传递给新的RM,并调用其存储方法。

检索方法从主设备读取整个值,验证校验和,从值中剥离元数据,如果校验无误,则将用户请求的数据复制到用户缓冲区中并返回。如果发生校验和错误,将从副本之一中检索值,将其重写到发生故障的设备,然后将正确的数据返回给用户。 delete方法在从主设备开始的所有r个连续设备上发出删除调用。

复制具有较高的存储成本和写入开销,但具有较低的读取和恢复成本。由于该机制按对象运行,并且对任何其他KV对均不存在任何依赖关系,因此不会增加更新开销。对于很小的值(在高存储开销对系统来说不是很大的负担)的情况下,复制是一个不错的选择,并且使对象完整无缺且独立于其他对象对于性能而言更好。

3.2.3单个对象纠删编码-分割

拆分是一种单对象纠删码机制,可将用户对象拆分为k个相等大小的对象,使用系统MDS代码添加r个奇偶校验对象,并使用相同的用户键将k + r个对象写入k + r个连续的设备。默认情况下,该代码是(4,2)Reed Solomon代码,类似于RAID 6,但代码和参数可由用户配置。

 

如图5所示,第一个数据分片放置在由哈希确定的主设备中,其他数据和奇偶分片以循环方式放置在连续的设备中。分片的大小必须由纠删码实现和基础设备支持,并且如果不能将分片平均分为支持大小的k个分片,则最终分片将填充零以进行奇偶校验计算。表2中的ec表示要与拆分一起使用的纠删码实现。出于空间方面的考虑,我们将仅介绍一个EC实施,这是我们在评估部分中用于所有评估的最佳性能相当于RAID 6的实施。拆分之前的原始用户值大小也存储为元数据的一部分,以供丢失最后一个分片或需要恢复时使用,以便在不使用零填充的情况下恢复正确的值内容。

与复制类似,更新方法从新的RM获取uknew,如果uknew小于k + r,则删除最终的k + r-uknew个设备中的块。(感觉这里的简单的删除有问题吧?)删除方法会删除所有k + r个KV。检索方法异步地从k个数据设备中读取所有拆分。如果所有校验和都经过验证,则从拆分中剥离元数据,然后将它们重新组合并发送给用户。如果f <= r校验和失败,则读取所需数量的奇偶校验分片,并恢复失败的分片,将其重新写入失败的设备,并将用户请求的值返回给用户。如果失败次数为f> r,则恢复将失败并且错误将返回给用户。

拆分可减少存储开销。读写开销和吞吐量的减少取决于纠删码机制,代码参数和值的大小。与复制类似,拆分不依赖于任何其他对象。因此,没有增加的更新开销。对于较大值的大小(如果多个请求的处理开销不会对整体吞吐量产生很大的影响),建议使用拆分。

3.2.4多个对象纠删编码-打包

打包是一种多对象纠删码机制,可将来自k个不同设备的多达k个独立对象打包到单个可靠性集中。纯粹出于奇偶计算的目的,打包是一种逻辑打包。用户对象存储在由其哈希值确定的彼此独立的主设备中,因此不会引起任何隐私问题。它将r个奇偶校验对象添加到每个可靠性集,并将它们存储在与原始k个设备不同的r个设备中。纠删码可以使用任何系统性MDS代码来实现。与以前一样,默认值为(4,2)Reed-Solomon码,类似于RAID6纠删码。

 

图6显示了基于不同哈希值放置在不同KV SSD中的不同键,例如KV SSD 1中的键i,KVSSD 2中的键j和KV-SSD 4中的键k,等等。打包将每个设备的最近写入请求排队,并从不同设备的队列中选择最多k个对象,以将其纠删码在一组中(例如,键x,y,b和c,蓝色标记的对象)在图中,可以形成一个可靠性集合)。对所选对象集进行纠删码会生成r个奇偶校验对象,并将其写入r个不同的设备。

 

纠删码要求数据大小相同,但是集合中对象的大小有所不同。通过虚拟零填充克服了这一挑战,即用零填充对象以进行纠删码[w1] ,但零填充实际上并未写入设备,如图7所示。对象值缓冲区和奇偶校验对象是与集合中最大对象的大小相同,四舍五入到纠删码实现和基础设备支持的大小。

检索很简单;从主设备读取对象,并校验和以确保值未损坏。在设备故障或校验和故障的情况下,对象恢复以及在对集合中的对象进行更新时,对奇偶校验的重新计算需要了解纠删码集。 RM需要知道哪些键被分组在一起以计算奇偶校验,因此它们在一个集合中。

设置信息与每个对象的实际大小(以不带零填充的实际大小重新创建对象)一起作为元数据对象存储在每个设备中。元数据对象存储用户对象,集合中的ck和奇偶校验对象r的数量以及集合中的所有键及其值的大小,如表2所示。这里ck代表当前的k。我们希望每次都打包k个对象,但我们不想在队列中等待太久。因此,在等待时间阈值之后,对象的可用数量ck <= k被选择打包。键中的RM特定标识符字节用于存储将键标识为用户对象或奇偶校验对象或元数据对象的指示符。复制每个用户键的元数据对象,并将副本数设置为r。

在可以将写入传递到将用于存储键的新RM之前,UPDATE方法首先对键所属的纠删码集进行重新分组,而不对键进行分组。首先,从设备读取元数据对象,然后再读取该集合中的其余KV对象,并将它们重写为新的可靠性集合。完成后,将删除键的元数据对象,然后将其转发给新的RM。删除以类似的方式发生,除了用户对象也与元数据对象的删除一起被删除。尽管KVMD支持同步和异步调用,但是在我们当前的实现中,进行更新和删除时的基础分组操作是同步的,从而影响性能。因此,建议对预期不会更新太多的对象使用打包。此类对象的读取速度很快,并且存储开销也很小。与拆分类似,写入吞吐量的下降取决于纠删码的实现方式,参数和对象的大小。

4. 评估

在本节中,我们评估块设备的软件RAID和KV SSD的KVMD可靠性机制,并给出结果。评估是在运行CentOS 7.4的Linux服务器上完成的。该计算机具有2.10GHz的Intel®Xeon®Gold 6152 CPU,具有两个NUMA节点和每个CPU 22个内核,以及64 GB内存。该计算机具有6个NVMe SSD,在RAID和KVMD评估中使用相同的SSD。对于使用块设备的RAID评估,使用企业级块固件,而使用KV固件通过KV-SSD进行KVMD评估。 KVMD虚拟设备由所有6个设备组成,用于所有评估中的所有测试。复制配置了总共3个副本,而打包和拆分配置为使用4个数据设备和2个奇偶校验设备。

KVMD是作为用户空间可靠性库实现的,该库可在Samsung的开源KV API库之上运行,以访问KV -SSD设备。与RAID不同,KVMD具有哈希计算和32位校验和计算以及每个操作的验证开销。在测试了几种不同的实现之后,我们使用英特尔的ISA-L库[11]选择了crc32 IEEE校验和计算功能,因为我们发现它的性能下降最少。对于纠删码,我们使用Intel ISA-L库[11]对任何k和r使用Reed Solomon编码实现。额外的KVMD开销包括从外部到内部键/值转换期间的内存分配/释放和内存副本,反之亦然。

本节中实验的目的是评估不同RM在不同设置下引起的性能下降,并将其与Linux软件RAID引起的性能下降进行比较。但是,RAID与KVMD的比较不是“苹果对苹果”的比较。设备功能和内部操作不同。因此,它们的绝对吞吐量数也不同。在更现实的KVS设置中,KV SSD在主机KV软件堆栈方面的性能优于块SSD。要了解更多信息,我们请读者参考Kang等人的著作[5]。

本节中的结果以2 y轴表示。左侧的y轴和条形图显示了绝对的吞吐率数字,右侧的第二个y轴代表了所达到的吞吐率,它是棒棒糖图的轴(红色棒在末端带有小球体) ,位于栏顶部)。每个栏顶部的棒棒糖显示了该栏所代表的RM或RAID方案相对于类别中的第一个栏所实现的吞吐量百分比,并提供了性能开销的感觉。由于这项工作与设备实现无关,并且数字来自原型固件,最终产品的绝对性能数字可能与此处显示的有所不同,因此,我们鼓励读者关注棒棒糖图而不是条形图,就像本节其余部分一样。

我们的评估使用RAID设备的Fio [12]异步引擎和KVM SSD设备的KV SSD主机软件包随附的kvbench的[13]异步基准。因此,我们在实验中使用固定的块和值大小。由于这是一个新兴的设备,因此我们也没有根据以前的研究对KV大小的流行程度做出任何假设,而是选择了1 KB4 KB16 KB64 KB的值和块大小。

 

4.1 块设备RAID性能

Mdadm软件RAID用于在条带化,镜像,raid4,raid5和raid6配置中的NVMe块设备之上创建RAID设备,并已通过4KB和256KB块大小进行了测试。镜像配置为2个虚拟设备,每个虚拟设备具有3个物理设备,用于三向镜像,类似于三向复制,具有默认设置。我们测量了总共6、12、24和36个线程的性能,发现24个线程是执行性能最好的最低线程数。图8中显示的结果全部具有24个fio线程。我们的工作负载顺序是顺序写入,然后是顺序读取,然后是随机写入,最后是随机读取。

 

条带化可聚合所有6个设备的总吞吐量。从图中可以看出,与条带化相比,大多数RAID写入会导致严重的吞吐量下降,并且执行速度要低得多。镜像写入的吞吐量下降符合预期,大约是聚合吞吐量的1/3。但是由于ready-modify-write操作,所有其他写入都出乎意料地更糟。

读取的性能要好得多,尽管即使没有执行任何其他功能(例如读取验证或解码),小块大小和小条带大小的性能也会明显下降。如果条带大小小于块大小,则即使对于较大的块大小,读取性能也会下降。

我们观察到镜像是性能的最佳选择,对于所有块大小的写入,在大多数情况下,性能不断下降是可以理解的,但是在大多数情况下,读取性能最佳,但是存储成本很高。尽管纠删码具有更好的存储成本,但是在某些配置中写入吞吐量的降低非常高,并且在某些配置中会导致读取吞吐量的下降,这使得mdadm RAID纠删码对于高性能NVMe SSD非常不受欢迎。

4.2 KV固态硬盘KVMD性能

在显示的结果中,“无”表示通过6个线程(每个设备一个)获得的纯KV SSD读/写吞吐量。在所有情况下,都使用相同数量的线程(6)向KVMD设备发出IO。

4.2.1固定块大小

由于自定义模式仅是功能扩展,因此仅在独立模式(仅通过测试的RM配置)和混合模式(配置了所有RM,但仅使用正在测试的RM)下评估KVMD。即使在混合模式下仅执行一个RM,在继续操作之前,可能会有多个RM触发每个操作的额外读取请求(以检查是否已存在)。因此,与独立模式相比,我们在混合模式下观察到吞吐量略有下降。

 

存储和检索。图9显示了RM的存储和检索性能。由于复制为用户写入的每个对象写入3个对象,因此复制可实现6个驱动器总吞吐量的大约1/3,这类似于RAID 3路镜像。如图所示,尽管进行了额外的散列,校验和计算和内存复制操作,但写入性能仍按预期下降。 Replication-Hybrid对每个写操作都会发出4个请求,因此会导致较高的性能下降,但预期性能会下降。读取吞吐量非常接近驱动器的吞吐量,没有任何可靠性,并且观察到的轻微性能下降是由于每次读取操作的校验和验证和内存复制操作所致。

打包在独立和混合模式下均发出附加读取请求。因此,两种模式下的写吞吐量相似。在经过测试的配置中,它将每4个用户写入分为14个设备总写入-4个用户写入+ 2个奇偶校验写入+ 8个元数据对象写入。元数据写的大小小于用户写的大小。因此,对于元数据写吞吐量类似于对象写吞吐量的小值大小,写吞吐量接近聚合设备吞吐量的4/14,但是对于元数据写不像对象写那么重要的较大值大小,写吞吐量接近聚合设备吞吐量的1/2。读取吞吐量类似于复制读取吞吐量,因为两者都以相似的方式读取用户对象,而没有任何其他依赖性和其他IO请求。因此,即使空间放大的幅度较小,性能特征在许多情况下也变得类似于复制。

拆分将对象拆分为4个相等的部分,大小相等于用户对象大小的1/4,并写入了2个与拆分大小相同的奇偶校验对象。因此,拆分发送6个写入大小是用户对象大小的1/4的请求,对于较小的值大小,其写入吞吐量只能是KV -SSD吞吐量的1/6。从图中可以看出,对于较小值的大小,其写入吞吐量是所有RM中最低的,但是随着值大小的增加而赶上,并且对于较大的值大小,其写入吞吐量要优于其他值。与复制的情况一样,在混合模式的情况下,额外的读取请求会导致吞吐量的下降。读取具有与写入相同的模式,但是较小的对象性能优于写入,因为每个用户只读向设备发出4个读取请求(以读取所有4个拆分),而每个用户向设备发出6个写入请求(写入4个分割+ 2个奇偶校验对象)。

 

更新和删除。对于更新和删除,我们仅在图10中显示4 KB值大小的结果,因为其他值大小遵循类似的模式。复制和拆分的标准化吞吐量下降与之前观察到的读取和写入模式相似。这是因为两者都没有其他特殊的更新和删除处理过程,并且它们都受到工作负载和IO请求数的基础设备吞吐量的限制。但是,正如预期的那样,打包在这两种情况下均表现不佳,因为我们的当前实现是同步运行的,并且必须先将组中的对象重写为新组,然后才能进行更新/删除。我们相信,通过更多的工程工作,可以进一步提高打包的更新和删除性能,但仍然存在固有的局限性。

4.2.2混合值大小

在本节中,我们以30:40:30的比率测量了混合值大小(4 KB,16 KB和64 KB)的存储和检索吞吐量,并在图11中显示了结果。KVMD在混合模式下配置了值大小阈值的配置方式是:复制处理4KB对象,打包处理16KB对象,拆分处理64KB对象。从图中可以看出,读和写吞吐量的下降是预期的,保留了工作负载所行使的基础RM的性能特征。

 

4.3 重建性能

在本节中,我们介绍了用很少的用户数据重建故障设备所花费的时间。在此测试中,我们使用用于RAID的单个RM /块(大约4 GB的用户数据)写入1百万个4 KB用户对象,然后格式化/使其中一个底层设备失败。我们在图12中显示了RAID设备修复和KVMD重建设备功能的运行时间。如图所示,与RAID相比,KVMD能够大大缩短修复时间,因为它能够并且被设计为仅重建写入失败的用户数据,RAID传统上会重建整个故障设备。减少的维修时间进一步提高了所存储数据的可靠性,如下一节所示。

 

对于KVMD,所花费的时间与RM读/写吞吐量,解码速度和设备中用户对象的数量成正比。复制具有更高的写入吞吐量,没有解码成本,并且设备中的用户对象更少,并且复制速度最快。打包具有较少的用户对象,但写入吞吐量略低于复制和解码成本,因此比复制慢。对于工作负载大小,解码大小和对象数量,拆分的写入吞吐量最低,因此,在RM中花费最多的时间。虽然这些KVMD测量是使用一次一次同步的关键恢复实现来完成的,但可以通过多线程和/或异步实现来进一步改进。

 

5.分析

在本节中,我们提供了KVMD的可靠性分析,并提供了RAID级别和KVMD可靠性机制之间的比较。

5.1 可靠性分析

5.2 RAID与KVMD比较

6.相关工作

存在大量的最大距离可分离(MDS)块擦除码来增加数据冗余和容错性,例如Reed-Solomon码[17]、Cauchy Reed-Solomon[18]、Blaum-Roth[19]等。我们的工作还提供了将它们全部用于可变长度键值数据的方法。秦等人[20]调查了基于对象的存储设备中的可靠性问题,但仅将其视为网络连接设备,并研究具有数千个节点的超大型系统的机制。虽然它们为复制和对象分组提供了可靠性分析,但它们没有讨论实际注意事项,例如分组时的可变长度处理,或者各种方案对读/写性能的影响。尽管许多现代分布式云级系统构建在基于对象的模型之上,但它们仍然在底层使用块存储设备,并依赖底层块设备采用的冗余机制(如RAID[21]),或者在更高级别(如文件级冗余,而不是可变长度对象级别[15,22,23])提供冗余,其中,写入被缓冲,直到固定长度的块(主要是仅附加大块)满,并且复制/纠删码被应用于这些块,结果块分布在不同的存储节点上。

近年来,研究人员提出了许多弹性的、内存中的、分布式的键值缓存解决方案。虽然它们需要维护KV设备不需要的物理位置映射的关键字,并且与我们的目标系统不具有相同的性能特征和工作负载,但它们具有可变长度值和寻址方案等共性。Ccytus[24]对元数据和关键字使用复制,对值使用纠删码,方法是将值拆分为k个部分,添加m个奇偶校验部分,并存储产生的k+m个部分。EC-Cache[25]擦除通过将k+m个结果部分拆分并存储在k+m个服务器中来对可变长度对象进行编码。KVMD还将复制和拆分作为选项之一进行探索。

7.局限和未来方向

虽然我们涵盖了各种可靠性技术和混合可靠性管理器来同时使用不同的技术,但对于不同的用户需求和值大小,这项工作绝不是完整的。在本节中,我们将讨论当前设计和实现的一些限制,以及未来工作增强的方向。

并发控制。目前,KVMD没有实现并发控制,并且假设应用程序将在其期望的级别实现并发控制。虽然该设备保证了同一键上并发异步操作的一致性,但它不保证任何排序。如果应用程序未实现并发控制,则KVMD可能处于不一致状态。尽管打包同步所有更新和删除以防止组中两个成员的并发更新,但它不能防止同一键的并发插入。复制可能会导致不同设备中的数据版本不同。拆分可能在混合状态下具有来自两个不同版本的碎片,从而导致状态不一致。这可以通过基于锁的实现或通过多版本实现来避免。

崩溃一致性。KVMD只有在所有副本/分片(包括奇偶校验分片)/整个可靠性集(包括奇偶校验对象)写入设备后才返回成功。再次假设,如果用户/应用程序接收到失败,则它可以重放写入。在它不能这样做的情况下,例如在崩溃期间,需要一致性检查模块和KV恢复机制。虽然实施类似于设备重建的一致性检查模块很简单,但高效的机制需要更改设计。一旦检测到,复制情况下的不一致性可以使用一致算法来解决。在打包的情况下,只要可以验证KV对(实际的或恢复的)校验和,就可以对不一致的组进行重新分组。在拆分的情况下,包含<=r个不同版本的碎片的部分写入也可以恢复,其他的则不能恢复。基于多版本的更新机制可以提供崩溃一致性,但会对性能产生一些额外影响。

可选的数据/元数据缓存层。图2所示的可选数据/元数据缓存层也尚未实现。读缓存的好处是众所周知的。KVMD的值元数据很小,缓存元数据可以避免混合模式下的初始读取,缩小混合模式和独立模式之间的性能差距。虽然在三星KV固态硬盘中读取不存在的键很快,但对于其他设备可能不是这样,元数据缓存在这些情况下可能非常有用。打包的元数据对象也可以缓存在元数据缓存层中,并且可以通过消除元数据对象读取来帮助提高更新/删除性能。利用存储器中的元数据对象,并且利用每个对象和组的仅附加的存储器内的元数据,可以执行跨多个集合的对象的更好的重新分组。

性能。由于同步重组效率低下,当前打包实现具有较高的更新和删除性能损失。基于多版本的设计可以延迟重组,并为更高效的重组操作腾出空间。与上述元数据缓存和内存中元数据相结合,可以极大地降低当前打包的低效,使其成为一种可行的竞争选择。由于设备的当前更新性能大约是插入/删除性能的一半,因此新版本插入和旧版本删除应该具有与当前更新类似的性能,并且可以解决当前的许多限制。

选择正确的RM选择正确的RM对用户来说可能是一项挑战,因为吞吐量是设备功能、RM参数和工作负载特征的函数。用户通常对其系统中对象的平均大小以及它们的更新和删除特征有一些直观的了解。通过对底层设备、工作负载信息和我们的评估进行一些性能测量,明智的用户可以选择合适的大小阈值。应用程序/用户还可以对大小阈值中的离群值使用自定义模式。然而,在现实中,由于工作负荷性质的变化和/或有限的用户知识,手动挑选是困难的。自动大小阈值确定、大小阈值孤立点检测和孤立点自定义模式利用,在保持性能水平的同时最小化空间开销,是我们未来工作的有希望的方向。

容量利用率。我们也没有考虑底层设备的值大小和容量利用率。在保持无状态设计的同时避免容量利用率不均匀的对象分配也是未来的重要工作。

8.总结

KVMD是我们针对多个键值存储设备的混合可靠性管理器,可根据用户需求和工作负载需求进行配置。KVMD可由具有固定对象大小/其他工作负载特征的分层存储系统在独立模式下使用,而混合模式可为更一般的设置启用基于对象大小的配置。自定义模式可用于切换具有某些特征的对象(例如热对象)的RMS,并且应用于每个对象,从而给予用户最大的控制。我们针对KVMD提出了四种RM:散列、复制、打包和拆分,它们都适用于可变长度的KV对象,具有不同的存储、吞吐量和可靠性权衡。我们还使用三星KV固态硬盘原型对RMS进行了理论分析和实际评估。最后,我们得出结论,KVMD在许多方面都优于块设备的方案。

 

 

 

1.摘要:

作者想解决什么问题?

       对象设备的数据可靠性解决方案

 

作者给出的答案是什么?

       本文针对Key-Value设备提出了Key-Value Multi-Device(KVMD),这是一种混合数据可靠性管理器,它采用了各种不同的可靠性技术,具有不同的权衡。

 

2.简介:

作者为什么研究这个问题?

      

目前这个课题的研究进行到哪一个阶段?

      

      

作者使用的理论是基于哪些假设?

 

3.总结:

这篇文章有哪些缺陷?

      

 

 

作者关于这个课题的构思有哪几点?

 

4.研究方法:

研究的数据从哪里来?

      

研究中用到的重要指标有哪些?

      

模型分哪几步?每一步分别得出了什么结论?

 

Conclude

这篇文章提出了针对多个键值存储设备的混合可靠性管理器KVMD,其中有4种可靠性机制(RM):散列、复制、打包和拆分,具有不同的吞吐量和可靠性权衡。但是,它是针对SSD,并且只是根据对象的大小选择不同的可靠性机制,没有考虑对象的流行度问题。还有就是这篇文章中的打包指的是将单个对象作为纠删码条带中的一个数据分块,将不多于k个数据分块打包成一个条带。

 

 

 

 


 [w1]单打包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值