适用于Linux的可靠高效的键值数据库?

时间:2009-11-06 21:32:08

标签: python database store embedded-database key-value

我需要一个快速,可靠且内存有效的Linux键值数据库。我的密钥大约是128个字节,最大值大小可以是128K或256K。数据库子系统不应使用超过大约1 MB的RAM。总数据库大小为20G(!),但一次只访问一小部分数据。如果有必要,我可以将一些数据blob从数据库中移出(到常规文件),因此大小最多可降至2 GB。数据库必须在系统崩溃后继续存在,而不会丢失最近未修改的数据。我的读取次数比写入次数多100倍。如果它可以使用块设备(没有文件系统)作为存储,那么这是一个加分。我不需要客户端 - 服务器功能,只需要一个库。我需要Python绑定(但如果它们不可用,我可以实现它们。)

我应该考虑哪些解决方案,你推荐哪一种?

我知道哪些候选人可以工作:

  • Tokyo Cabinet(Python绑定为pytc,另请参阅pytc example code,支持哈希和B +树,事务日志文件等,在数据库创建时修复了bucket数组的大小时间;作者必须关闭文件以给其他人一个机会;为每个文件重新打开文件的许多小写都非常慢; Tyrant服务器可以帮助处理大量的小写; speed comparison between Tokyo Cabinet, Tokyo Tyrant and Berkeley DB
  • VSDB(即使在NFS上安全,没有锁定;障碍怎么办?;更新速度非常慢,但不像cdb那么慢; 2003年最后一个版本)
  • BerkeleyDB(提供崩溃恢复;提供事务; bsddb Python模块提供绑定)
  • Samba's TDB(有事务和Python绑定,有些用户experienced corruption,有时mmap()是整个文件,repack操作有时会使文件大小翻倍,产生神秘的失败如果数据库大于2G(即使在64位系统上),集群实现(CTDB)也可用;文件在经过大量修改后变得太大;文件在大量散列争用后变得太慢;没有内置 - 以重建文件的方式;通过锁定单个散列桶进行非常快速的并行更新)
  • aodbm(仅限追加系统崩溃,使用Python绑定)
  • hamsterdb(使用Python绑定)
  • C-tree(具有高性能的成熟,多功能商业解决方案,具有功能减少的免费版本)
  • TDB(自2001年起)
  • bitcask(以日志结构,用Erlang编写)
  • 各种其他DBM实现(例如GDBM,NDBM,QDBM,Perl的SDBM或Ruby;可能他们没有适当的崩溃恢复)

我不会用这些:

  • MemcacheDB(客户端 - 服务器,使用BereleleyDB作为后端)
  • cdb(每次写入时需要重新生成整个数据库)
  • http://www.wildsparx.com/apbcdb/(同上)
  • Redis(将整个数据库保存在内存中)
  • SQLite(如果没有定期吸尘,它会变得非常慢,请参阅Firefox 3.0中位置栏中的自动完成,即使版本3.1及更高版本的sqlite允许auto_vacuum;请注意:小写入事务可能会非常慢;请注意:如果繁忙的流程正在进行许多交易,其他流程会挨饿,而且他们永远无法获得锁定。
  • MongoDB(太重了,将值视为具有内部结构的对象)
  • Firebird(基于SQL的RDBMS,太重了)

仅供参考,Linux杂志中的recent article about key--value databases

仅供参考,older software list

仅供参考,speed comparison of MemcacheDB, Redis and Tokyo Cabinet Tyrant

StackOverflow上的相关问题:

10 个答案:

答案 0 :(得分:9)

LMDB是最节省内存的数据库 http://symas.com/mdb/inmem/

并且也被证明是最可靠的 - 完全防撞。 http://wisdom.cs.wisc.edu/workshops/spring-14/talks/Thanu.pdf

在你提到的那些中,东京内阁记录了腐败问题 https://www.google.com/search?q=cfengine+tokyo+cabinet+corruption

BerkeleyDB也有充分记录的腐败问题,Bitcask也是如此。 (而bitcask无论如何都只是一个内存中的数据库,因此对你的1MB RAM要求毫无用处。)

在Python中也很好地支持LMDB,并提供了几种不同的绑定。 https://github.com/dw/py-lmdb/ https://github.com/tspurway/pymdb-lightning

免责声明 - 我是LMDB的作者。但这些都是记录在案的事实:LMDB是世界上最小,最有效,最可靠的键/值存储,没有其他任何东西可以接近。

答案 1 :(得分:2)

我对Tokyo Cabinet / pytc解决方案好运。它非常快(比在我的实现中使用任何dbm的搁置模块快一点),用于读写(尽管我也做了更多阅读)。对我来说问题是关于python绑定的spartan文档,但是有足够的示例代码可以找出如何做你需要做的事情。另外,东京机柜很容易安装(和python绑定一样),不需要服务器(如你所说)并且似乎得到积极支持(稳定但不再处于活动开发状态) 。您可以以只读模式打开文件,允许并发访问或读/写模式,以防止其他进程访问数据库。

我在夏天看了各种各样的选择,然后我得到的建议是:尝试不同的选项,看看什么最适合你。如果只有一个“最佳”选项会很好,但每个人都在寻找略有不同的功能,并愿意做出不同的权衡。你知道的最好。

(也就是说,如果你分享了最适合你的东西,以及为什么你选择那个解决方案而不是其他人,那么它对其他人有用。)

答案 2 :(得分:2)

cdb可以处理任何高达4 GB的数据库,使其对于20GB的问题来说太小了。

答案 3 :(得分:2)

Riak在Linux上运行,允许您动态添加节点

答案 4 :(得分:1)

Python 3.0的dbm.ndbm怎么样?

答案 5 :(得分:1)

另一个建议是TDB(Samba项目的一部分)。我已通过tdb模块使用它,但我不能说我已经测试了它在崩溃时的可靠性;我用它的项目没有这样的要求,我找不到相关的文档。

答案 6 :(得分:0)

SQLite怎么样?

答案 7 :(得分:0)

我在Python中使用过bsddb.hashlib(),效果非常好。

答案 8 :(得分:0)

您可能希望djbcdb具有您提及的属性。

答案 9 :(得分:0)

my query for a cross-platform ISAM-style database(类似)中,我还收到了FirebirdGLib的嵌入版本的建议。