为持久内存优化的存储引擎什么样?火山引擎有话说

共 6646字,需浏览 14分钟

 ·

2021-10-02 13:10



引言


字节跳动旗下的火山引擎,深谙存储引擎在企业合作与解决方案市场,以及AI领域中的战略核心作用。为应对每秒数千万次且时延在毫秒级的客户查询需求,火山引擎导入性能接近DRAM,并能以更优成本提供更高容量,且具备数据持久性优势的英特尔® 傲腾™ 持久内存,打造了全新的数据库存储引擎TerarkKV, 更好地兼顾了成本控制及数据访问低时延的要求。


执行概要


随着大数据技术和应用的迅猛发展,数据背后的价值日益凸显,企业也纷纷制订或优化 其数字化转型战略,以期充分利用数据挖掘来获取深刻洞察并据此抢占市场先机。然而,呈爆发式增长和来源日趋多样的数据,也让企业从数据采集、存储到处理和业务 决策等各个层面均面临更多也更为艰巨的挑战。

作为字节跳动旗下的数字服务与智能科技品牌,火山引擎也早已认识到“数据”对于每个组织的无限价值,从品牌创建伊始,火山引擎就将“帮助每一个组织释放‘增长潜能’”列为自身的重要使命之一。作为企业级智能技术服务平台的火山引擎,正依托自身在大数据、人工智能等领域的深厚技术能力,以增长理念及方法论,为客户提供产品与技术解决方案。



郭宽宽 火山引擎单机存储引擎组


英特尔® 傲腾™ 持久内存可以说是二十年来对数据库而言最具革命性的硬件创新之一,我们并不想把它作为DRAM内存的简单替代, 而是根据它字节寻址、超低延迟和持久化的能力构建专用数据结构,重新设计了数据库的I/O模型,从业务架构层面缩减了工程成本和设备成本。


通过对行业及市场的充分调研与分析,火山引擎的洞察是:要帮助组织充分利用数据驱动业务发展与增长,要打造优秀的产品与平台,“数据平台”这个技术与产品基座将起到至关重要的底层支撑作用,这其中,存储引擎的角色又尤为重要。


例如,在DataLeap(大数据开发与数据治理套件)、DataRangers(一站式分析与增长平台)和DataWind(一站式数据洞察平台,智能推荐等组件及平台)中,高效稳定的数据索引以及追求更优性能表现的元数据查询能力是必不可少的,要针对如此大规模及高复杂度的系统提供高效稳定的支撑,数据库存储引擎的性能和成本控制能力就必须要经受住更加严苛的考验。


作为企业合作与解决方案市场的新秀和数据产品及人工智能领域的创新引领者,火山引擎深谙存储引擎的战略重心作用,并拥有专注存储引擎开发与推广的团队。为应对每秒 数千万次且延迟在毫秒级的客户查询需求,火山引擎与正在全力推进内存-存储架构 革新的英特尔公司展开了深入交流与合作,利用其性能接近 DRAM 内存、并能以更优 成本提供更高容量且具备数据持久性的英特尔® 傲腾™ 持久内存(以下或简称为“傲腾™ 持久内存”或“持久内存”),打造了全新的数据库存储引擎——TerarkKV。持久内存的导入,让TerarkKV能够更好的控制成本并满足业务场景对数据访问低延迟的需求。


现状分析与挑战


在构建TerarkKV之前,RocksDB及其各种优化版本是火山引擎采用的主要数据库存储引擎。


作为著名的LSM类存储引擎之一,RocksDB在火山引擎产品中占据了非常重要的地位,其大量的数据库、存储系统都是基于 RocksDB进行构建或改进。LSM在设计之初是为顺序写性能大幅度优于随机写性能的设备而设计的。近年来RocksDB虽然有了很多改进,但客观上并不适用于所有场景,尤其是其读写放大问题让那些对延迟比较敏感的业务,如Redis、机器学习参数服务、通用缓存、图计算等场景比较难以接受。


以图数据库为例,它的应用正变得越来越普及,也越来越重要。据Gartner预测:“到2022年,图分析处理和图数据库 (Graph Database) 的应用将以每年100%的速度增长【1】。”然而对图的单次遍历或者关联查询,往往需要进行很多次底层KV请求来获取边和点信息,且这些KV请求只能串行化,再考虑到KV内部的读放大,单次I/O延迟的重要性就凸显出来了。因此,进一步优化存储引擎性能来为这类场景提供更好的支持已是势在必行。


RocksDB本身的流行度很高,社区处于较活跃的状态。RocksDB社区内也针对持久内存与RocksDB的搭配进行了一些优化,如 优化傲腾™ 持久内存中存储Value的所在位置、大幅优化压缩效率、WAL(Write-Ahead Logging) 从写固态盘(SSD)改为写傲腾™ 持久内存。这些优化确实取得了一定程度的收益,但火山引擎的单机引擎团队认为它们依然远未发挥出傲腾™ 持久内存的巨大价值潜能。为了更加充分地释放这一全新硬件的能力和降低产品成本,火山引擎准备尝试更具突破意义的创新研究。


傲腾™持久内存

助力火山引擎突破延迟瓶颈


选择英特尔® 傲腾™ 持久内存的理由


基于英特尔® 3D XPoint™ 存储技术打造的英特尔® 傲腾™ 持久内存, 为上述问题的破解提供了全新思路,原因在于其具备以下优势:



 高性能、大容量、低成本: 在图1所示的存储层级架构的 “金字塔”中,越靠近塔顶的层级速度越快、容量越小、单位存储容量成本也越高。英特尔® 傲腾™ 持久内存在该“金字塔”中位于DRAM内存和固态盘之间。与DRAM内存相比,持久内存具有更经济的价格和更大的容量,和固态盘相比则拥有更优的数据响应速度和传输速度(接近 DRAM 内存),其高性能、大容量和高性价比的特性,有助于用户在几乎不影响系统性能的同时降低总体拥有成本(以下简称“TCO”)。


字节寻址能力简化底层I/O:传统的数据库主要依靠磁盘存储数据,但磁盘不能按字节寻址,所以数据库读取数据一般是按块,过程就是把整块数据读到内存,然后再根据偏移量、按 字节寻址的方式读取具体的数据。持久内存具备字节寻址能力,因此能够大大简化底层I/O,加快查询速度。此外,如果将数据保存在DRAM内存中,虽然也能实现字节寻址,但鉴于DRAM内存的数据易失性,为保证安全必须定期备份数据到磁盘,从而带来了数据同步等一系列复杂操作。


数据非易失性提高可靠性:持久内存具备数据持久性,因此在实例重启或断电等计划内或计划外的停机情况下都不会造成数据丢失,从而可以快速恢复服务。


基于持久内存探索更优方案


在启动针对RocksDB的创新研究之前,火山引擎基于英特尔® 傲腾™ 持久内存的上述优势,广泛调研了业界已有的各类相关方案,并总结了一些明显的问题。


其一,火山引擎发现部分社区工作主要集中在对RocksDB和WiredTiger等存储引擎的改造上面,并没有从本质上改变它们原有的数据结构和读写模式,仅是把傲腾™持久内存当作一种更加快速的存储介质来使用,甚至部分设计还保留了4K/16K的页尺寸,  无法发挥持久内存字节寻址的优势。


其二,部分设计仅仅把傲腾™ 持久内存当作更便宜的DRAM内存替代品,用来扩展本机的内存容量,并把缓存数据存放在傲腾™ 持久内存中。这种方案虽然利用了持久内存字节寻址的特性,但其查询仍不可避免地要进行从DRAM内存到持久内存,再到固态盘的三级跳,造成了不必要的浪费。


鉴于这些既有方案均不能充分利用持久内存的应用优势,火山引擎决定根据英特尔® 傲腾™ 持久内存的上述特性,并结合自身的 业务需求来打造全新的数据库存储引擎。


App Direct模式开辟提速新途径


为了在新存储引擎中充分释放英特尔® 傲腾™ 持久内存的潜能,火山引擎团队对其两种主要工作模式——内存模式和App Direct 模式(以下或简称“AD 模式”)进行了评估。


在内存模式下,CPU内存控制器会把持久内存视作易失性的系统内存,而将DRAM内存用作持久内存的高速缓存。虽然该模式能够提供更大的内存容量,但在这种模式下数据访问请求会首先先在DRAM内存上检查是否命中,如果命中,数据直接从内存中获取;如果没有命中,会再到持久内存上进行访问,这会带来 更多的I/O开销并增加延迟。


切换到AD模式后,火山引擎发现,支持行业标准NVM持久化内存编程模式的软件和应用,都能直接与傲腾™ 持久内存通信,且能充分利用其字节寻址能力,从而显著降低延迟,满足高速 业务场景的需求。如果预设DRAM内存和持久内存在容量比例上存在一定的悬殊,比如DRAM内存设为512GB、持久内存设为3TB或6TB的容量配比,那么大部分数据就将存储在持久内存中,而索引全部保存在DRAM内存中,这样就可以保证所有关键字的查询都在速度更高的DRAM内存中进行,也就能更好地让DRAM内存和持久内存实现互补,充分发挥各自的优势。


经过评估,火山引擎最终确定:要在新存储引擎中采用英特尔® 傲腾™ 持久内存的App Direct模式。


持久内存+ 数据结构优化,助新引擎攻克读放大难题


经过一系列的研究、探索和对比评估工作,火山引擎基于英特尔® 傲腾™持久内存,针对偏缓存或内存的业务场景打造了全新的存储引擎——TerarkKV。如图2所示,该引擎分为两部分,一部分是数据索引层,由DRAM内存承载,用于存放索引数据结构;另一 部分是数据存储层,由持久内存和固态盘承载,用于存放大量数据,对内与持久内存进行交互,对外暴露offset到数据映射。



火山引擎团队还同步为该存储引擎自主开发了一种新的索引数据结构——CSGT(Concurrent SiGnature Tree)。这是一种有序索引数据结构,主要特性是增加了DRAM内存中的索引数量。


索引一条KV记录,悲观估计消耗16字节,一般消耗13.5字节,在这种情况下,1GB DRAM内存可索引的KV记录可高达8千万条【2】。对于大部分应用场景来说,CSGT几乎都可确保其索引存放在高速DRAM内存中。


这种做法有别于将持久内存作为缓存使用的常规做法,常规做法就是索引通常需要先到DRAM内存中查询数据是否存在,没有找到时再到持久内存中查询。在TerarkKV使用的全新索引数据结构的帮助下,查询可做到单次I/O即可定位到数据位置,因此不存在读放大的弊端。此外,其索引是记录级别而非传统的页级别,因此大大提升了Value访问速度。经测试,持久内存单次I/O延迟只有150ns左右,这使得TerarkKV能够适用于大多数内存密集型客户应用场景【3】


性能验证及成果体现


高并发、高吞吐、低延迟全面兼顾


为验证基于英特尔® 傲腾™ 持久内存(App Direct模式)打造的全新TerarkKV存储引擎的性能表现,火山引擎与英特尔一同对TerarkKV的吞吐量、每秒查询数(QPS)和延迟进行了测试。



由图3所示的测试结果可知,TerarkKV在吞吐性能上的表现非常出色,且最佳适用场景为Value长度在512B以内的简单查询。同时,其单机上千万的QPS(Query Per Second,每秒查询数)表现,也几乎可以覆盖到所有的应用场景。


从表1可以看出,采用傲腾™ 持久内存的TerarkKV的P99和P999延迟都是微秒级的【5】。据火山引擎介绍,这与采用纯DRAM内存配置的测试结果相比,差距仅为1-2微秒【6】


更重要的是,相对于DRAM内存昂贵的成本和难以突破的容量限制,持久内存 的引入不仅能保证查询性能达到与 DRAM 内存相近的程度,还能 更为高效和经济实惠地扩充内存容量,降低客户的TCO。而且,在该存储引擎中,DRAM内存和持久内存的容量配比为1:4,就可实现全部索引存放于DRAM内存中,同时待查询的Value 值存放于持久内存中这种较为理想的状态。


DRAM内存中的一次跳转延迟仅为40-60ns【7】,因而对索引的查询即便要经过多次跳转,也只会消耗较低的延迟。对于持久内存中的数据,通过索引获得地址后就可直接读取,无需再在持久内存中继续查找,这就可以保证一次 I/O就能完成KV查询。


TerarkKV——成功满足更广泛客户场景需求


目前,TerarkKV已完成了在图数据库、IPS(用户特征服务)等组件中的PoC 验证,并获得了令人满意的结果。这类业务的主要特征有二:一是上层的单次查询需要下层有多次数据跳转;二是业务的请求串行化严重,需要以相当快的速度获得响应结果。


例如在智能推荐应用场景中,用户之间的关系、内容之间的关系以及用户与内容之间的关系,往往都会用图数据结构来描述。随着移动互联网技术的持续发展,更多元化的媒体对象,如短文本、视频等正被补充进客户的数据池中,从而进一步加大了图结构的复杂性,意味着图数据结构中的沿路径查询需要跳转多次。在这种情况下,如果使用RocksDB存储引擎来对图数据进行查询,一次跳转可能存在十倍读放大,十次跳转就可能达到百倍读放大。由LSM树的形态与具体业务场景决定了性能的优劣,读放大达到 40倍的情况也不罕见,这种延迟上的消耗显然是延迟敏感型 系统所无法承担的。而且,图数据库天然需要持久化,在这种情况下,基于英特尔® 傲腾™ 持久内存构建的TerarkKV存储引擎无疑将成为承载图计算场景的更优选择,并能很好地解决读放大的 问题。


除图数据库外,TerarkKV还适用于对延迟要求严苛的Flink流处理场景,以及机器学习中向量查询等典型业务,这些模块在火山 引擎的产品矩阵中也有非常广泛的使用,由此不难预见:该存储引擎未来将有很多用武之地。


总结与展望


火山引擎与英特尔基于英特尔® 傲腾™ 持久内存(AD模式)打造的全新数据库存储引擎TerarkKV,在IOPS、QPS及延迟方面都能更好地满足偏缓存的应用场景的需求,同时还能实现明显的成本节约。它的问世不但见证了双方在持久内存应用探索方面的又一次成功协作,也进一步验证了英特尔® 傲腾™ 持久内存在数据处理和存储加速方面的出色潜能。


以此为基础,火山引擎还将与英特尔一道,计划围绕持久内存及相关产品与技术,开展更多、更广泛、也更为深入的技术交流与协作,让持久内存能在更多的业务场景中发挥作用,进而向用户提供更优质的产品与服务体验。



▼ ▼ ▼


【1】 数据引自:

https://www.gartner.com/en/newsroom/press-releases/2019-02-18-gartner-identifies-top-10-data-and-analytics-technolo。


【2】, 【3】, 【4】, 【5】, 【6】, 【7】, 【8数据援引自火山引擎内部测试与评估,更多详情请咨询火山引擎。测试平台配置:处理器:双路英特尔® 至强® 铂金 8260处理器(24 内核,48 线程);内存:256 GB DRAM (DDR4-2933, 32 GB x 8) + 1024 GB 英特尔® 傲腾™ 持久内存 (128 GB x 8);内核版本:Linux 4.19;TerarkKV hash tag: a52d4783580a9c0cdce8330dcc7f916e6bb613a6;GCC 版本:9.2.1 20190909 (Debian 9.2.1-8)。

英特尔并不控制或审计第三方数据。请您审查该内容,咨询其他来源,并确认提及数据是否准确。


英特尔技术特性和优势取决于系统配置,并可能需要支持的硬件、软件或服务得以激活。产品性能会基于系统配置有所变化。没有任何产品或组件是绝对安全的。更多信息请从原始设备制造商或 零售商处获得,或请见intel.cn。


性能测试中使用的软件和工作负荷可能仅在英特尔微处理器上进行了性能优化。诸如 SYSmark 和 MobileMark 等测试均系基于特定计算机系统、硬件、软件、操作系统及功能。上述任何要素的变动 都有可能导致测试结果的变化。请参考其他信息及性能测试(包括结合其他产品使用时的运行性能)以对目标产品进行全面评估。更多信息,详见www.intel.cn/benchmarks。


描述的成本降低情景均旨在特定情况和配置中举例说明特定英特尔产品如何影响未来成本并提供成本节约。情况均不同。英特尔不保证任何成本或成本降低。


英特尔、英特尔标识以及其他英特尔商标是英特尔公司或其子公司在美国和/或其他国家的商标。


©英特尔公司版权所有


浏览 40
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报