【IT168 特别报道】随着云计算和大数据时代的来临,数据正在以前所未有的速度成为各个领域价值创造的核心驱动力。在此背景下,国内最受关注的数据库技术盛会——2017第八届中国数据库技术大会(DTCC2017)将于2017年5月11-13日如约而至。
本届大会以“数据驱动价值发现”为主题,汇集来自互联网、电子商务、金融、电信、政府、行业协会等20多个领域的120多位技术专家,共同探讨Oracle、MySQL、NoSQL、云端数据库、智能数据平台、区块链、数据可视化、深度学习等领域的前瞻性热点话题与技术。大会共设定2大主场和20个技术专场,将吸引5000多名IT人士参会,为数据库人群、大数据从业人员、广大互联网人士及行业相关人士提供最具价值的交流平台。
5月13日,Terark 联合创始人兼CTO雷鹏在《数据存储与加速技术专场》上,对数据存储引擎做了精彩的演讲。
1. MyRocks 简介
据雷鹏介绍,MyRocks是一款使用了 RocksDB 存储引擎的 MySQL 版本,由 Facebook 开发,目前在各大互联网公司内有不少用户。
对比 InnoDB 引擎,MyRocks 的写放大远低于 InnoDB(基于LSM-Tree,对 SSD 更友好),并且拥有更高的压缩率,同时也增加了一些针对 RocksDB 的特有功能。
MyRocks 底层是单一的 RocksDB 实例,在多租户环境下(如云数据库、大公司内多部门共享数据库)具有更高的资源利用率。
2. 块压缩的原理和 MyRocks 随机读问题
演讲中,雷鹏表示,MyRocks 本身是基于块压缩进行数据的存储,当在线场景中出现大量的随机读的时候,会因为频繁的块解压而触发频繁的 IO 和大量的解压(解压需要大量 CPU 计算),进而导致性能下降。
块压缩是目前被存储引擎最广泛使用的压缩技术,如 InnoDB, LevelDB, RocksDB, TukoDB, WiredTiger 等。为了理解我们如何优化 MyRocks,首先要先理解块压缩的原理。
顾名思义,块压缩按照某个设定的块尺寸,将多条记录打包成一个块,当用户需要访问的时候,通过索引定位到目标块,然后将块解压缩,从解压后的数据中再查找目标记录。
这样导致的直接问题是,当我们增大块的尺寸的时候,单个块中的数据条数将更多,会提高压缩率,但是会增加无效解压;减少块尺寸时,无效解压会随之减小,但压缩率会降低。
除此之外,当用户搜索数据时,块压缩解压后的数据和解压前的块,都会缓存在内存中,造成双缓存问题。对于此问题,部分产品使用 DIRECT IO 技术,内存中只存放解压后的数据,而这在一定程度降低了内存利用率。
综合来说,就是块压缩本身有很多无法克服的缺陷:内存使用过大、压缩率太低、随机读太慢。Terark 开发的可检索压缩技术,能够在压缩数据上直接进行检索,天然地避免了这些问题。
3. TerarkDB 天然地适用于随机读
据了解,Terark 是国内极少数做存储引擎的团队之一,作为创业公司专注于这个领域的原因就是对自己的技术足够自信,基于自己的可检索压缩技术,Terark 实现了一个存储引擎 TerarkDB。
在策略上,TerarkDB 把自己的可检索压缩技术集成到 RocksDB 中,从而通过 RocksDB 去兼容各种现有的数据库系统。
在技术上,TerarkDB 使用全局压缩,一方面极大地提高了压缩率,另一方面可以直接在压缩的数据上进行检索。最终,在最小的内存用量下,达到极高的随机读性能。
并且,根据 TerarkDB 对存储器的访问模式,随着硬件的进一步发展,特别是可以当作内存使用的 3D XPoint 存储器,应用到 TerarkDB 上,可以进一步降低 RAM(传统内存) 的用量,并提高性能。
雷鹏在现场分享了在 MyRocks 中的 RocksDB 直接替换为 TerarkDB,即可使现 MyRocks 获得 TerarkDB 的各项优势:
● 压缩率更高
○ 磁盘文件更小,SSD 寿命更长
○ 数据规模越大,压缩率越高
● 内存使用更小
○ 只需 mmap 压缩后的文件,无双缓存问题
● 随机访问更快
○ 直接访问压缩数据
○ 没有无效解压
○ 顺应硬件发展趋势,随机少量读 + 高IOPS
4. MySQL on TerarkDB
基于 TerarkDB 存储引擎和 MyRocks,Terark 将上述技术的结合作为 MySQL on TerarkDB 已经发布(可以通过其官网 terark.com 下载试用),也可以通过青云 AppCenter 直接购买云数据库版本。
性能表现
使用 Amazon movie data (~ 8 million reviews),数据量 9.1GB,除去元数据,实际数据量8.1GB。
左下图标为内存限制 4G 时的随机读性能,右边两张图表示不限制内存用量时,实际的内存用量和随机读性能。