首页 > 其他分享 >WIP: SLM-DB:Single-Level Key-Value Store with Persistent Memory

WIP: SLM-DB:Single-Level Key-Value Store with Persistent Memory

时间:2024-02-03 21:44:34浏览次数:23  
标签:存储 Level DB SLM 键值 KV Memory 内存

论文原文:https://www.usenix.org/system/files/fast19-kaiyrakhmet.pdf

摘要:
本文调查了如何利用新出现的可按照字节寻址的持久化内存(Persistent Memory)来增强KV存储的性能。
我们充分利用PM,提出了一种新型的KV存储,SLM-DB,这种存储同时利用到了B+树索引和LSM-tree的优点。
我们提出的SLM-DB这种架构,具有更高的读性能和写性能,同时拥有很低的写放大和接近理想最优状态的读放大。
在SLM-DB中,我们利用持久化内存来保存B+树的索引,利用LSM树把新插入的KV对保存在持久化内存的缓冲区中。
SLM-DB仅有一层KV对组织在磁盘上,同时执行选择性的compaction来保证KV对是充分有序的,以便于范围查询更快。
我们经验丰富的研究证明,默认配置下,同LevelDB相比,SLM-DB同样情况下的范围查询性能,
拥有1.07-1.96倍的读带宽和1.56-2.22倍的写带宽。

  1. 简介
    KV存储已经成为高效支撑不同的数据密集型应用,例如网页索引,社交网络,电子商务和云照片等的关键组件。
    分别基于B树和LSM树的两款典型KV存储都已经被大范围的使用。例如基于B树的存储和数据库,KyotoCabinet支持快速读取和范围查询。
    然而,基于B树的KV存储展现了差的写性能,这主要是因为总是发生多次少量的随机写磁盘,
    以及由于总是需要动态保持数据结构的平衡性而产生较大的写放大。因此,他们更适合读密集负载。
    而基于LSM树的KV存储则被更好的优化以便于支持写密集负载,例如BigTable, LevelDB, RocksDb和Cassandra。
    基于LSM树构建的KV存储之所以能支持高写带宽,主要是由于将键值数据缓存在内存中,并批量顺序写入磁盘。
    然而,这样的存储拥有很大的缺陷,如很高的读写放大和很低的读性能,这是由于LSM树是一种拥有多层文件的数据结构,
    并且其中的键值对为了保证更快的查询,经常做合并和排序。
    最近,对数据密集型应用同时拥有高性能读写能力的需求日益增长。雅虎,已经报道了在他们典型负载中,读写比例越来越相近的潮流。
    因此,优化KV存储同时拥有高读写性能变得非常重要。
    支持字节寻址,非易失性的内存如PCM,自旋转移矩MRAM和3D XPoint等已经为提升内存和存储系统的性能,提供了新的机会。
    研究指出,持久化内存拥有和DRAM相似的读性能,更高的写时延(最高5倍)和更低的带宽。持久化内存相比DRAM,拥有更大的容量和密度。
    然而,持久化内存更被希望用来和HDD和SSD混布。比较典型的,对于大规模KV存储,数据仍然存储在磁盘上,同时持久化存储用来提升性能。
    需要重点指出的是,已经有早期的尝试,针对持久化内存,设计一个基于LSM树的KV存储。
    然而,研究如何在基于混合部署持久化内存和硬盘的新型KV存储系统中,
    持久化内存可以承担一个更重要的角色而不局限于大型的内存写buffer或读缓存,对实现更优越的性能来说,仍然是非常重要的。
    在本文中,我们研究如何利用持久化内存来提升KV存储的性能。我们提出了一种新型的KV存储,SLM-DB,通过利用持久化内存,
    同时吸纳了B+树索引和LSM树实现的优点。SLM-DB同时拥有非常高的读写性能,并拥有较低的写放大和接近理想状态的读放大。
    在SLM-DB中,我们利用B+树来存储索引键值对。利用持久化的B+树索引,我们可以加速查询key(而不需要布隆过滤器)。
    为了保持高的写带宽,我们利用LSM树组织新插入的键值对插入持久化内存的写buffer,完全消除前台写log的同时提供数据持久化。
    在SLM-DB中,键值对存储在单层组织的磁盘文件中。由于SLM-DB可以充分利用B+树来查询,就没有必要保证键值对是有序的,
    这大幅度的降低了写放大。然而,过时的键值对需要gc。同时SLM-DB也需要存储在磁盘上的键值对保证一定程度的顺序性,
    以便于提供更好的范围查询性能。因此,SLM-DB也设计了可选compaction计划,在单层上执行严格合并键值对。

    本文的主要贡献包括:
    我们设计了一款单层KV存储,保留了通过LSM树实现的高写带宽性能,同时集成了B+树来索引键值对。
    另外,我们通过持久化内存容纳新插入的键值对,避免了对磁盘的前台写log放大。
    对于可选compaction,我们设计了3种计划,基于1)活跃键占文件比例,2)B+树叶子节点被扫描次数,3)范围查询的顺序性程度。
    我们实现了基于LevelDB的SLM-DB并集成了B+树实现。SLM-DB被设计为即便系统发生故障,单层LSM树和B+树也可以保证数据一致性。
    我们使用db_bench中的microbenchmarks和YCSB对应现实工作负载。我们经验丰富的研究证明,默认配置下,同LevelDB相比,SLM-DB同样情况下的范围查询性能,
    拥有1.07-1.96倍的读带宽和1.56-2.22倍的写带宽,同时仅仅只有LevelDB的39%的磁盘写IO平均数量。

    这篇论文剩下的部分组织如下。第二章讨论了LSM树存在的读性能差和读写放大比例过高的问题以及持久化内存在KV存储中的应用。
    第3章提出了SLM-DB的设计和实现。第四章讨论了KV存储操作是如何基于SLM-DB实现的。第五章讨论了SLM-DB如何在系统故障的情况下恢复。
    第六章评估了SLM-DB的性能,展示了我们的性能测试结果。第7章讨论了持久化内存的成本和并行化。第八章讨论了相关的工作。最后第九章总结了本文。

  2. 背景和愿望

标签:存储,Level,DB,SLM,键值,KV,Memory,内存
From: https://www.cnblogs.com/kiman/p/18005264

相关文章

  • MondoDb安装教程
    MondoDb使用教程一、安装和下载1.下载下载地址:https://www.mongodb.com/try/download/community2.安装将下载的tar.gz包上传到虚拟机1.解压:tar-zxvfmongodb-linux-x86_64-rhel70-4.4.28.tgz3.启动和关闭1:前台启动mkdir-p/soft/mongo/mongodb/data/dbmkdir-p/s......
  • JDBC的简单封装
    1、dataSource.propertiesdriver=oracle.jdbc.driver.OracleDriverurl=jdbc:oracle:thin:@localhost:1521:orclusername=usernamepassword=password2、代码示例packagecom.example;importjava.io.IOException;importjava.io.InputStream;importjava.sql.Connection;imp......
  • Jmeter JDBC连接配置
    JDBC连接配置(JDBCConnectionConfiguration),用于创建数据库连接,后续可对数据库进行增删查等操作。和组件【JDBC请求(JDBCRequest)】搭配使用组件路径:线程组->右键添加->配置元件->JDBCConnectionConfiguration 1、前提:Jmeter连接数据库需要有JDBC驱动包,可去网上下载jar......
  • 在ubuntu16.04下,源码编译安装特定版本的MongoDB PHP扩展
    背景:我的php项目在连接其他mongo库时报:Serveratxxx:27017reportswireversion5,butthisversionoflibmongocrequiresatleast6(MongoDB3.6)原因:本地MongoDBPHP扩展的版本过高解决方法:降低本地PHP扩展MongoDB版本,现在要降到mongodb-1.12.0版本步骤:1:下载......
  • 学习unigui【19】unidbgrid的Group By This Field汉化
    上面已经将groupbythisfield汉化。由于版本的不断更新,不可避免有汉化遗漏。那么说到如何汉化问题。 根据ExtJSVersion查找你电脑响应目录文件D:\ProgramFiles(x86)\FMSoft\Framework\uniGUI\ext-7.5.1\build\classic\locale\locale-zh_CN.js(主要是该文件)D:\ProgramFi......
  • Modbus communication types
    AnIntroductiontotheModbusCommunicationProtocolhttps://www.solisplc.com/tutorials/modbusTheModbusOrganizationhttps://modbus.org/IntroductiontothemodbusprotocolOriginalequipmentmanufacturers(OEMs)allhaveproprietarycommunicationprot......
  • sql server执行dbcc修复,提示:(类型为 In-row data)的对象 "hr_bd_BusTables",计数 In-ro
    问题:数据库执行DBCCCHECKDBwithNO_INFOMSGS检查提示:计数In-rowdataUSEDpage不正确。请运行DBCCUPDATEUSAGE。DBCCCHECKDBwithNO_INFOMSGS;消息2508,级别16,状态1,第1行对于索引ID为1、分区ID为311221045166080、分配单元ID为311221045166080(类型......
  • docker安装TIDB
    1、添加docker-compose.ymlversion:'2'networks:tidb_net:driver:bridgeipam:driver:defaultconfig:-subnet:192.168.88.0/24gateway:192.168.88.1services:pd0:image:pingcap/pd:latestpor......
  • 学习unigui unidbgrid的GridsGroupingSorting【18】
    折腾一天,你不按照demo里的代码来,就是没有效果。procedureTUniGridsGroupingSorting.UniDBGrid1MultiColumnSort(Columns:TUniDBGridColumnArr;Directions:TUniSortDirections);varOrderStr:string;I:Integer;beginUniMainModule.ADOQuery5.Close;//必须在......
  • WordPress 技巧:解决 3.6 版本的 "wpdb::escape is deprecated" 错误提示
    来源:http://www.shanhubei.com/archives/13621.html升级到WordPress3.6之后,发现在debuglog中有很多以下的错误信息:Notice:wpdb::escapeisdeprecatedsinceversion3.6!Usewpdb::prepare()oresc_sql()instead.这个错误信息的意思是WordPress3.6将$wpdp类......