SACC2016 雷鹏:TerarkDB架构和技术分享
【IT168 现场报道】2016年10月27日-29日,2016中国系统架构师大会(SACC 2016)在北京万达索菲特大饭店举行。作为中国规模最大的架构师豪门盛会,本届大会以“架构创新之路”为主题,站在创新的风口上,与大家共同打造一场通过架构创新及各种IT新技术来带动企业转型增效,助力架构师们腾飞的技术盛会。10月29日,在大会的分会场上,来自Terark的雷鹏为大家带来TerarkDB架构和技术分享。
TerarkDB简介
据雷鹏介绍,TerarkDB 首先是一个具有超高读性能的数据库,也可以作为存储引擎嵌入到其他的存储系统中(如MySQL、MongoDB等)。
它采用的底层技术与目前已知的数据库完全不同,是在学术和工程领域都进行了大量创新的方案,并非在现有的数据库算法上做的时间空间折衷(tradeoff)。
使用 C++ 实现,表结构根据 Schema 定义,提供丰富的数据类型。
关于TerarkDB的功能特性,雷鹏说,目前还在不断的迭代,功能也在不断地丰富,他们的核心目标是保持TerarkDB本身的简洁与高效。
和其他系统进行集成是目前的重点,比如和MongoDB集成,替换其WiredTiger引擎,与SSDB集成,替换其LevelDB引擎等。通过这样的集成,TerarkDB能够支持越来越多的丰富特性。
另外,TerarkDB 并没有限定在某些特定的领域内,而是作为一个具有独特功能的数据库(或存储引擎)为开发者和公司提供更多的选择。
TerarkDB架构设计
雷鹏指出,TerarkDB最上层逻辑是“表”(Table),没有传统意义的”数据库”(DB)概念,每个表可以通过Schema定义其字段及相应的索引、特性等。
TerarkDB从架构上可以嵌入其他上层数据库,如MongoDB、MySQL、SSDB等,只需要将其引擎替换掉即可。
据了解,一个“表”由多个“段”(Segment)组成,表中的所有记录id,在逻辑上是连续且不变的(可配置不变性的生命周期)。Segment 中每一行有逻辑删除和物理删除的标记,物理删除的记录一定也是逻辑删除的,逻辑删除的可能没有物理删除。逻辑ID(record id)和物理ID(physical id) 之间通过 Rank Select 算法进行双向映射。Rank0 和 Select0 均实时计算,使用 Terark 自研的高效算法。
关于TerarkDB创建索引,雷鹏说,其使用了自主发明的Nested Succinct Trie,这种算法能够达到比RocksDB/LevelDB等存储引擎高3到5倍的压缩率,通常能够把索引全部加载到内存,同时具有更快的访问速度。通过Schema可以定义各类索引,如唯一索引/非唯一索引,单表多个索引、联合索引等。每个“段”单独建立索引,所以“段”的数量应该尽可能保持在较小的数量。
此外,TerarkDB对数据的压缩摒弃了传统的块压缩(Block Compression),而是采用了自己研发的”可精确定位的压缩算法”(Seekable Data Compression)。
块压缩算法在大量的随机读的场景下,会频繁的进行块的解压,造成内存浪费的同时(压缩数据和解压数据都有一份,产生双缓存问题),读性能也不能达到最优。
TerarkDB用到的部分核心技术
关于TerarkDB采用的技术,在学术和工程领域都非常前沿,例如对于Succinct,有 AMPLab的《Succinct : Queries on Compressed RDDs》,Berkeley去年发布的论文:《Enabling Queries on Compressed Data》。同时,TerarkDB 还采用了自动机理论构建核心的数据结构,将 Trie 进行嵌套、并使用 Succinct 来表达嵌套 Trie。TerarkDB 舍弃了 Succinct 中功能丰富但性能很差的 FM-Index 算法,使用自研的压缩算法,满足现有数据库的需求,性能比 FM-Index 高 100 倍以上……
Succinct数据结构(Succinct Data Structures)是一种能够在空间上以接近于信息论理论下限的方式来表达对象的技术,通常会大量使用位图来进行操作(如Rank-Select算法)。虽然能够极大的降低内存占用量,但是实现起来较为复杂,目前开源的有SDSL-Lite。注意,Succinct数据结构的性能比相应的传统(基于指针)数据结构更低。Terark 使用自己实现的 Rank-Select,性能远高于开源实现。
据了解,自动机理论是现代计算机程序和计算的基础,它在自然语言处理、多模匹配、静态分析、DNA序列分析,当然还有正则表达式等领域十分重要。
例如我们常用的Trie树就是一种特殊的自动机。TerarkDB 通过对自动机的使用,结合 Succinct,在提升压缩率的同时,原生支持正则表达式查询。