精通LevelDB
上QQ阅读APP看书,第一时间看更新

1.5 LevelDB的衍生产品

尽管LevelDB本身已具备非常优异的读写性能,然而还有许多需要完善与提高的地方,比如前面介绍过的只支持单实例、单线程操作,不具备相应的客户端访问模式,支持的数据类型不够丰富等。正因如此,各知名公司与开发机构,基于LevelDB开发了一系列的衍生产品,如Facebook开发的RocksDB、我国开发者基于LevelDB开发的类Redis的NoSQL数据库SSDB。本节将针对LevelDB的这两种衍生产品进行简要介绍。

1.5.1 RocksDB

RocksDB(https://github.com/facebook/rocksdb)是基于LevelDB开发的,并保留、继承了LevelDB原有的基本功能,也是一个嵌入式的键-值数据存储库。RocksDB设计之初,正值SSD硬盘兴起。然而在当时,无论是传统的关系数据库如MySQL,还是分布式数据库如HDFS、HBase,均没有充分发挥SSD硬盘的数据读写性能。因而Facebook当时的目标就是开发一款针对SSD硬盘的数据存储产品,从而有了后面的RocksDB。RocksDB采用嵌入式的库模式,充分发挥了SSD的性能。

提示:为什么基于LevelDB实现RocksDB?

一般而言,数据库产品有两种访问模式可供选择。一种是直接访问本地挂载的硬盘,即嵌入式的库模式;另一种是客户端通过网络访问数据服务器,并获取数据。假设SSD硬盘的读写约100μs,机械硬盘的读写约10ms,两台PC间的网络传输延迟为50μs。可以分析得知,如果在机械硬盘时代,采用C/S的数据服务模式,客户端进行一次数据查询约为10.05ms,可见网络延迟对于数据查询速度的影响微乎其微;而在SSD硬盘时代,客户端进行一次数据查询约为150μs,但与直接访问SSD硬盘相比,整体速度慢了50%,因而直接影响了整体性能。正是在这样的背景下,Facebook的工程师们选择了LevelDB来实现RocksDB的原型。

RocksDB兼容LevelDB原有的API,但在开发设计过程中,针对性地对LevelDB进行了一系列的优化与完善。具体主要体现在以下几个方面。

  • 针对SSD硬盘进行优化,支持更多的IOPS(I/O Operation per Second),并改进数据压缩,减少数据写入,尽可能延长SSD的使用寿命。
  • 针对多CPU、多核环境进行优化,从而提升整体性能。一般而言,商用的服务器均采用多核的CPU,RocksDB不仅支持多线程合并、多线程内存表的插入,同时采用MVCC,并将数据库的只读与读写操作分开,减少了锁的使用,从而更适合、进行高并发操作。
  • 增加了一系列LevelDB不具备的功能,如数据合并、多种压缩算法、按范围查询,以及一些管理统计维护工具。

RocksDB适用于对数据存取速度要求高的应用场景,例如:

  • 垃圾邮件检测应用需要快速获取实时传递的每一封邮件。
  • 一个消息队列,需要支持海量的消息插入与删除。
  • 作为一个高速缓存,以实现海量数据的实时访问。

在Facebook内部,RocksDB已为其大量业务提供服务。Facebook还将RocksDB与MySQL进行结合,将RocksDB作为MySQL的数据引擎,目前这一项目也已开源,有兴趣的读者可访问https://github.com/facebook/mysql-5.6了解。

1.5.2 SSDB

SSDB是一个高性能、支持丰富数据结构的NoSQL数据库。作者在设计时目标就是替代Redis。Redis是一个键-值型内存数据库,其所有数据均在内存中进行操作,因而其数据容易受到内存容量的限制,并且数据不能持久化存储。而SSDB不但完全兼容了Redis的API,支持Redis客户端的访问,而且提供了与Redis一样的集合数据结构,如list、hash、zset等。SSDB底层的数据存储引擎也是基于LevelDB开发的,因而实现了数据的持久化存储,且支持的数据容量是Redis的100倍。不仅如此,SSDB还实现了主从同步与负载均衡。可以说,SSDB是LevelDB与Redis相结合的产物,其继承了LevelDB强大的数据读写性能,也吸取了Redis简单易用的操作接口与丰富的数据结构。

SSDB官网(http://ssdb.io/zh_cn/)公布了其与Redis的性能测试对比。在测试中,SSDB的读性能完全超越了Redis,而写性能只比Redis慢10%。SSDB可以将原有的Redis数据进行直接迁移。SSDB已被数十家公司在多种场景中使用,例如财经类应用用其来存储高速证券行情快照,直播平台用其来存储粉丝关注与在线人数数据、在线广告平台用其来存储实时会话数据、音乐类平台用其来存储专辑封面信息以及评论数据。在这些用户中,许多都是从原来的Redis平台迁移而来的,由此可见,SSDB在性能上的确相当优异,并且可用于许多Redis无法胜任的领域。而这一切均归功于底层的数据存储引擎LevelDB。