40

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

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

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

  • Tokyo Cabinet(Python绑定为pytc,另见pytc示例代码,支持hash和B+trees,事务日志文件等,bucket数组的大小在数据库创建时固定;作者必须关闭文件给别人一个机会;大量的小写入,每个文件都重新打开非常慢;Tyrant 服务器可以帮助处理大量的小写入;Tokyo Cabinet、Tokyo Tyrant 和 Berkeley DB 之间的速度比较
  • VSDB(即使在 NFS 上也是安全的,没有锁定;障碍呢?;更新非常慢,但没有 cdb 慢;最后一个版本在 2003 年)
  • BerkeleyDB(提供崩溃恢复;提供事务;bsddbPython 模块提供绑定)
  • 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(客户端-服务器,使用 BereleleyDB 作为后端)
  • cdb(需要在每次写入时重新生成整个数据库)
  • http://www.wildsparx.com/apbcdb/(同上)
  • Redis(将整个数据库保存在内存中)
  • SQLite(如果没有定期清理它会变得非常慢,请参阅 Firefox 3.0 中位置栏中的自动完成,即使 sqlite 3.1 及更高版本允许auto_vacuuming;当心:小型写入事务可能非常慢;当心:如果一个繁忙的进程是做许多事务,其他进程饿死,他们永远无法获得锁)
  • MongoDB(过于重量级,将值视为具有内部结构的对象)
  • Firebird(基于 SQL 的 RDBMS,太重了)

仅供参考,最近一篇关于Linux 杂志中键值数据库的文章。

仅供参考,较旧的软件列表

仅供参考,MemcacheDB、Redis 和 Tokyo Cabinet Tyrant 的速度比较

StackOverflow 上的相关问题:

4

10 回答 10

10

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 要求来说毫无用处。)

LMDB 在 Python 中也得到了很好的支持,有几个不同的绑定可用。 https://github.com/dw/py-lmdb/ https://github.com/tspurway/pymdb-lightning

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

于 2014-08-04T17:02:36.010 回答
2

我对 Tokyo Cabinet/pytc 解决方案很满意。它非常快(比在我的实现中使用 anydbm 的 shelve 模块快一点),用于读取和写入(尽管我也做了更多的阅读)。对我来说,问题是关于 python 绑定的斯巴达文档,但是周围有足够的示例代码来弄清楚如何做你需要做的事情。此外,tokyo cabinet 很容易安装(就像 python 绑定一样),不需要服务器(正如你提到的)并且似乎得到了积极的支持(稳定但不再处于积极开发中)。您可以在只读模式下打开文件,允许并发访问,或读/写模式,防止其他进程访问数据库。

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

(也就是说,如果您分享最终对您最有效的方法,以及您选择该解决方案而不是其他解决方案的原因,这将对其他人有用!)

于 2009-11-18T18:51:30.843 回答
2

cdb 可以处理高达 4 GB 的任何数据库,这对于手头的 20 GB 来说太小了。

于 2009-12-01T01:03:03.860 回答
2

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

于 2010-02-16T14:19:05.473 回答
1

Python 3.0 的 dbm.ndbm 怎么样?

于 2009-11-07T15:17:39.617 回答
1

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

于 2009-11-18T23:56:55.867 回答
0

SQLite 怎么样?

于 2009-11-06T21:34:39.597 回答
0

我在 Python 中使用了 bsddb.hashlib(),效果很好。

于 2009-11-06T21:35:51.900 回答
0

您可能喜欢djbcdb,它具有您提到的属性。

于 2009-11-06T21:37:01.277 回答
0

我对跨平台 ISAM 样式数据库(类似)的查询中,我还收到了有关FirebirdGLib嵌入式版本的建议。

于 2009-12-01T00:42:06.210 回答