论坛5 | We. Developers. 郭宽 「TerarkDB: 高压缩&高性能存储引擎」



  • 时间: 2016年7月28日
    发言人: 郭宽|Terark VP
    主题: TerarkDB: 高压缩&高性能存储引擎


    大家好!

    时间不是很充分,我就稍微介绍一下我们的存储引擎。我们的存储引擎叫做Terark DB,我们主要是做数据高性能的压缩和高性能的检索。我们的核心产品是一款叫做Terark DB的存储引擎,目前国内只有我们一家公司在做存储引擎,完全是自己研发的,自己发明了新的算法来做这个事情。

    0_1470727117196_upload-607ad2ac-dda8-4072-8908-edb86465443d

    这是我大概要讲的目录,Terark DB首先它是超高随机读性能的存储引擎,你想把它单独作为数据库也可以用,非常轻量,你直接用它就可以了。另外,我们实现的底层技术和(英文)其他的存储引擎完全不一样,我们是用全新的算法去做的,在学术和功能上都比较领先,底层是用C++编写的,而且适配了LevelDB/RocksDB 的接口,如果你用这个可以直接切换过来。

    0_1470727141886_upload-586ac588-4ba8-41c2-9597-08e77dfc3f08

    这是大概的性能报告,这是我们的压缩率,第一个是rocksdb,越往下性能越好,基本上数据在我们压缩算法后大概是我们的1/3左右。这边是随机读性能,这里面的测试我们是用了3G内存大概10G电影来做的测试,这个可以看到我们是测试的结果,大概是他们的100倍的效果。
    下面是写性能,基本上差不多,因为我们没有对写性能做优化。其实Latency很重要,最差的情况可能会让你的用户体验瞬间变的非常差。

    0_1470727155480_upload-ae4e309e-82ae-47c2-94a5-54e1675888dc

    这款存储引擎比轻量级的后端引擎功能更丰富,但是又比现在的数据库稍微少一些功能,让它能够适配在各种数据库里面更方便一点。基本的功能包括高压缩和索引,联合索引、唯一索引,包括原生的正则表达式。一般现在大部分的存储引擎,包括数据库中正则表达式的实现都是应用层,而我们是从底层的数据结构原生做的正则表达式,性能非常高,后面可以稍微介绍一下这个是怎么实现的。

    0_1470727165168_upload-426beb21-3412-41ec-9f2f-97bd8ff32ca5

    如果说你的数据量非常大,小的话就无所谓了,同时你的内存很敏感,可能你需要更多的数据放在内存里面。同时读性能需求特别大,基本上日志系统和广告的展示,搜索引擎这些,包括大用户量的新闻资讯都很合适。尤其是一些运维,你可以做日志分析的时候也比较合适。

    0_1470727176637_upload-e8ee540a-b5c1-4682-9aa6-4f9435ff7017

    整体的架构我稍微过一下,现在大家都流行开源,所以我们也开源了,直接搜Terark DB可以找到我们的官方网站。

    0_1470727195295_upload-b3704854-dc83-42ff-a711-cccf0717daef

    最上面是表层结构,跟大家理解的数据库差不多。它是针对Schema定义的引擎,我稍微提一下,这个表结构我们是分段的表结构,数据量非常多的时候分一段一段,当段达到一定程度就分开变成两个段,然后继续往里面塞。当后面我们分为只读段和可写段,我们用了一些功能上的优化,比如说RAM Select算法。我的物理ID在底层是需要连续在一起,不希望每一条数据删了以后,中间空一个。所以说物理上一直是紧凑的,逻辑上是很松散的,通过这种RAM Select算法的影射可以让存储空间非常小。

    0_1470727206186_upload-47a0d114-f665-45d3-804c-afe21d15eda9

    分段基本上大概是这三种,正在写的新数据进入到这里,写满了就冻结了,冻结了之后后台有限制。所以这块是是最核心的,大家可能用的是B+树或者LSM这种算法做的,我们自己发明了一种算法叫做Nested Succinct Trie,你在网上是搜不到这个的,但是在我们的官方网站有详细的介绍。

    0_1470727217843_upload-6b634e2d-dedf-45eb-8f0a-3a4072c2af0e

    这是段的结构,前面我们把索引放在前面,后面是一列一列的。然后是数据,索引和数据的算法不太一样,我们后面会稍微提一下索引的体积非常小,可能是大部分事件的十几分之一那么小,数据是通过另外一种我们称之为一种叫可检索压缩算法做的,可以直接获得里面的数据。

    后面稍微提一下关键技术,一个是可检索压缩,上面是Succinct是高压缩的数据结构,这两个都是有论文的,但是它们的实现跟我们还是有些差距的,有兴趣可以搜一下这两个论文,这项技术已经很多年了。

    0_1470727231938_upload-efdffe0d-ab3b-496c-9c44-778cb7f96f53

    稍微提一下Succinct,它是能够用大量的Bitmap实现各种各样的数据结构,比如说我们用指针实现的话可能需要占用比较多的数据。比如说用传统指针的算法,一共需要6兆的内存,用Succinct算法的话,大概就只需要250k就能存下来。

    0_1470727243657_upload-2982d3ef-b1dc-4941-8463-a07830d95236

    比如说这个节点它用左节点,没有右节点,比如说中间这个节点,左右这个节点都有,它就是这样一个意思,这里有两种表现方式。

    0_1470727252157_upload-dd4ba37b-2468-424a-ab39-f89f448a7153

    举一个实际的例子,把它变换成一种结构,把每一个节点可以很快的访问到。同时我们也提供了自动机的技术,这跟传统的数据结构是不太一样的地方。但是自动机有一个问题,它的内存占有非常大,我们恰好把它结合在Succinct,它可能是传统数据结构1/30的内存占量,我们用Succinct结合自动机让整个自动机快速高效的访问,占用的内存同时也比较小,是这样一种情况。相当于说自动机它的优点访问非常快,非常高效,缺点是内存占用太大,Succinct正好相反,它是内存占的非常小,性能稍稍有一点差,他们结合起来是高度压缩的,性能也是非常快的。

    0_1470727274861_upload-51878ab6-5032-4ae6-8cf0-2490ef20658e

    怎么使用Terark DB,也可以试用一下,因为我们使用这一行命令Terark DB上面也可以有,可以把案例包下载到计算机,Windows需要手动安装,配置在相应的类库就可以了。我们依赖于Boost的两个库,我们的写这部分用的是数据结构。

    0_1470727286283_upload-4c6aedbf-d003-40dc-8388-45cbcfe8ea05

    这是简单的代码事例,上面是字段配置,中间是索引的配置,最后是多个存在一起。右边基本上是简单的代码逻辑,这个不用介绍了,一般工程师都可以看的懂,现在我在招人,人特别少,谢谢大家。


登录后回复
 

与 青云QingCloud 社区 的连接断开,我们正在尝试重连,请耐心等待