适用于Linux的可靠高效键值数据库?
我需要一个快速、可靠且内存高效的键值数据库,适用于Linux系统。我的键大约是128字节,值的最大大小可以是128K或256K。这个数据库系统的内存使用量不应该超过1MB。整个数据库的大小是20G(!),但一次只会访问其中一小部分数据。如果需要,我可以把一些数据块移出数据库(存储到普通文件中),这样大小最多可以降到2GB。这个数据库必须能够在系统崩溃后,确保最近未修改的数据不会丢失。我将有大约100倍的读取操作比写入操作多。如果它能把块设备(没有文件系统)作为存储,那就更好了。我不需要客户端-服务器功能,只需要一个库。我需要Python的绑定(如果没有的话,我可以自己实现)。
我应该考虑哪些解决方案,您推荐哪个?
我知道的一些候选方案:
- Tokyo Cabinet(Python绑定是pytc,还有pytc示例代码,支持哈希和B+树,事务日志文件等,桶数组的大小在数据库创建时固定;写入者必须关闭文件以给其他人机会;每次小写入都重新打开文件会非常慢;Tyrant服务器可以帮助处理大量小写入;Tokyo Cabinet、Tokyo Tyrant和Berkeley DB的速度比较)
- VSDB(在NFS上也安全,无需锁定;关于障碍呢?;更新速度很慢,但没有cdb那么慢;最后一个版本是2003年)
- BerkeleyDB(提供崩溃恢复;支持事务;
bsddb
Python模块提供绑定) - Samba的TDB(支持事务和Python绑定,一些用户遇到过数据损坏,有时会
mmap()
整个文件,repack
操作有时会使文件大小翻倍,如果数据库大于2G(即使在64位系统上)会产生神秘的故障,集群实现(CTDB)也可用;经过大量修改后文件变得过大;经过大量哈希争用后文件变得太慢;没有内置的方式重建文件;通过锁定单个哈希桶实现非常快速的并行更新) - aodbm(仅追加,因此在系统崩溃时仍然安全,带有Python绑定)
- hamsterdb(带有Python绑定)
- C-tree(成熟、多功能的商业解决方案,性能高,有一个功能减少的免费版)
- 旧的TDB(来自2001年)
- bitcask(日志结构,使用Erlang编写)
- 各种其他DBM实现(如GDBM、NDBM、QDBM、Perl的SDBM或Ruby的;可能没有适当的崩溃恢复)
我不会使用这些:
- MemcacheDB(客户端-服务器,使用BerkeleyDB作为后端)
- cdb(每次写入都需要重新生成整个数据库)
- http://www.wildsparx.com/apbcdb/(同上)
- Redis(将整个数据库保存在内存中)
- SQLite(如果没有定期清理会变得非常慢,参见Firefox 3.0中的地址栏自动完成,尽管sqlite的3.1及以后的版本允许
auto_vacuum
;注意:小写入事务可能非常慢;注意:如果一个繁忙的进程进行许多事务,其他进程会饿死,永远无法获得锁) - MongoDB(太重了,把值当作具有内部结构的对象)
- Firebird(基于SQL的关系数据库管理系统,太重了)
顺便提一下,最近在Linux杂志上有一篇关于键值数据库的文章。
顺便提一下,有一个较旧的软件列表
顺便提一下,关于MemcacheDB、Redis和Tokyo Cabinet Tyrant的速度比较
相关问题在StackOverflow上:
10 个回答
cdb这个工具最多只能处理4GB大小的数据库,这就意味着它处理不了现在这个20GB的数据。
LMDB是目前最节省内存的数据库,http://symas.com/mdb/inmem/
而且它也被证明是最可靠的,完全不会崩溃。http://wisdom.cs.wisc.edu/workshops/spring-14/talks/Thanu.pdf
你提到的那些数据库中,Tokyo Cabinet有记录的损坏问题,https://www.google.com/search?q=cfengine+tokyo+cabinet+corruption
BerkeleyDB也有很多记录的损坏问题,Bitcask也是如此。(而且Bitcask本身就是一个只在内存中工作的数据库,所以对于你1MB内存的需求来说没什么用。)
LMDB在Python中也得到了很好的支持,有几个不同的绑定可以使用。https://github.com/dw/py-lmdb/ https://github.com/tspurway/pymdb-lightning
免责声明 - 我是LMDB的作者。但这些都是有据可查的事实:LMDB是世界上最小、最有效率、最可靠的键值存储,没有其他数据库能与之相提并论。
我在使用Tokyo Cabinet/pytc这个方案时运气不错。它的速度非常快(比我用anydbm的shelve模块还快一点),无论是读还是写都很快(不过我自己读得多一些)。对我来说,问题在于Python绑定的文档太简陋了,但网上有足够的示例代码,可以帮助你搞明白怎么做你需要的事情。此外,安装Tokyo Cabinet(还有Python绑定)也很简单,不需要像你提到的那样去搭建服务器 而且似乎也在积极维护中(虽然稳定,但不再活跃开发)。你可以以只读模式打开文件,这样可以让多个进程同时访问,或者以读写模式打开,这样就会阻止其他进程访问数据库。
我在夏天的时候看了很多不同的选项,当时得到的建议是:试试不同的选项,看看哪个最适合你。要是有一个“最佳”选项就好了,但每个人需要的功能都稍微不同,愿意做的取舍也不一样。你最清楚自己的需求。
(话说回来,如果你能分享一下最后哪个方案对你最好,以及为什么选择这个而不是其他方案,那对其他人会很有帮助!)