分析型嵌入式键值数据库:hamsterdb
近日, Christoph Rupp在highscalability.com上发表了一篇文章,介绍由他创建的分析型嵌入式键值数据库hamsterdb。它用C/C++编写,是一个速度非常快的轻量级NoSQL数据库引擎,支持事务、数据库游标、内存数据库和远程网络访问,类似谷歌的leveldb和甲骨文的BerkeleyDB。
据作者介绍,hamsterdb并不是细分市场上的一个新晋竞争者。事实上,它已经出现超过9年了。在这段时间里,它发展非常快,其重点已经从单纯的键值存储转向了分析型数据库,提供类似列式存储数据库的功能。
hamsterdb是单线程、非分布式的,用户通常直接将它链接到他们自己的应用程序中。它提供了独特的事务实现以及其它独特的功能,非常适合于分析型工作负载。它可以在本地C/C++中使用,也有面向Erlang、Python、Java、 .NET,甚至是 Ada的绑定。它被用在嵌入式设备和本地应用程序中,也可以为云实例提供缓存和索引服务,已经有数以百万计的部署。
hamsterdb有一个独特的功能,它能识别模式信息。大多数键值存储并不关心键的类型,而它支持两种类型的键:二进制键和数值键。 hamsterdb数据库是BTree索引,既可以存储在文件中,也可以存储在内存中。而BTree的实现是它成为分析型数据库的关键。其实现方式非常紧凑,减少了I/O,而且可以更好的利用CPU缓存。
另外,hamsterdb有与SQL命令COUNT、COUNT DISTINCT、SUM和AVERAGE等价的API,并支持可变长度的键,允许键重复,以及支持read-committed隔离级别的ACID事务。
按照Rupp的说法,hamsterdb最强力的特性是可测试性。数据库的根本——甚至比性能都重要——就是不应该丢失数据。在9年的开发过程中,他不断地重写部分代码或者尝试新的想法,但高测试覆盖率给了他自信,认为这些更改不会破坏任何东西。他有大约1800个单元测试和35000个验收测试,以及一组模拟崩溃的测试,用于测试hamsterdb的可恢复性。这些测试都是高度自动化的。
Rupp还介绍了hamsterdb的商业版本hamsterdb pro。该版本提供了针对键、记录、日志的重量级压缩,AES加密,及针对叶节点查找的SIMD优化。还有更多的压缩算法正在进行或规划中。
在文章的最后,Rupp用谷歌的基准测试将hamster 2.1.8与leveldb 1.15作了性能对比。他得出了下面的结论:
对于随机读,hamsterdb性能要好于leveldb。对于随机写的情况,只要数据量不是太大,hamsterdb就更快。而从1千万键及以上开始,hamsterdb就会遭受BTree数据库的传统问题:大量的非序列性I/O和高磁盘寻道延迟。
作者认为,这可以很好地说明hamsterdb的分析能力。尤其是,sum和count运算都可以很好地扩展。序列性插入和扫描也是其亮点,不管数据量多大,它都可以非常快。
有兴趣的读者可以下载查看全部的测试结果,以及从GitHub上下载hamsterdb的源代码。
来自:http://www.infoq.com/cn/news/2014/08/hamsterdb