可靠,高效的Linux键值数据库?
我需要一个快速,可靠和高效的Linux内核键值数据库。 我的密钥大约是128个字节,最大值可以是128K或256K。 数据库子系统不应该使用大于1 MB的RAM。 总数据库大小为20G(!),但是一次只访问一小部分数据。 如果有必要的话,我可以将一些数据blob移出数据库(到普通文件),所以大小最多可以降低到2GB。 数据库必须在最近未经修改的数据中没有任何损失的情况下经受系统崩溃。 我将有大约100倍以上的读取比写入。 如果它可以使用块设备(没有文件系统)作为存储,则是一个优点。 我不需要客户端 – 服务器function,只需要一个库。 我需要Python绑定(但是如果它们不可用,我可以实现它们)。
我应该考虑哪些解决scheme,你推荐哪一个?
我知道哪些人可以工作的候选人:
- 东京内阁 (Python绑定是pytc ,另请参见pytc示例代码 ,支持散列和B +树,事务日志文件等等,存储区数组的大小在数据库创build时固定;作者必须closures文件以给其他人很多机会,重新开放这些文件的速度很慢; Tyrant服务器可以帮助大量的小写入; 东京内阁,东京暴君和伯克利DB之间的速度比较 )
- VSDB (即使在NFS上也是安全的,没有locking;那么障碍是什么?;更新非常慢,但不像在cdb中那么慢; 2003年的最后一个版本)
- BerkeleyDB (提供崩溃恢复;提供事务;
bsddb
Python模块提供绑定) - Samba的TDB (包含事务和Python绑定,一些用户经历了损坏 ,有时候
mmap()
是整个文件,repack
操作有时会使文件大小加倍,如果数据库大于2G(即使在64位系统上) ,集群实现( CTDB )也可用;经过大量修改后文件变得太大;在大量哈希争用之后文件变得太慢;没有内置方式来重build文件;通过locking单个哈希桶实现非常快速的并行更新) - aodbm (追加 – 只有这样才能在系统崩溃中幸存下来,用Python绑定)
- hamsterdb (使用Python绑定)
- C-tree (具有高性能的成熟的多function商业解决scheme,具有减lessfunction的免费版本)
- 旧的TDB (从2001年起)
- bitcask (日志结构化,用Erlang编写)
- 各种其他DBM实现(如GDBM,NDBM,QDBM,Perl的SDBM或Ruby的;可能他们没有适当的崩溃恢复)
我不会使用这些:
- MemcacheDB (客户端服务器,使用BereleleyDB作为后端)
- cdb (每次写入时需要重新生成整个数据库)
- http://www.wildsparx.com/apbcdb/ (同上)
- Redis (将整个数据库保存在内存中)
- SQLite (没有周期性抽真空就变得很慢,尽pipe3.1版本和更高版本的sqlite允许
auto_vacuum
,在Firefox 3.0的位置栏中看到了自动完成;小心写入事务可能非常慢;注意:如果一个繁忙的进程正在做很多交易,其他进程饿死,他们永远不能得到锁) - MongoDB (过重,将值视为具有内部结构的对象)
- Firebird (基于SQL的RDBMS,太重)
仅供参考, 最近一篇关于 Linux杂志关键值数据库的文章。
仅供参考,一个较旧的软件列表
仅供参考, MemcacheDB,Redis和东京内阁暴君的速度比较
有关StackOverflow的相关问题:
- Windows的关键价值数据库?
- 是否有经过业务validation的云存储/ Key => Value Database? (开源)
我已经与东京Cabinet / pytc解决scheme好运了。 它的速度非常快(比在我的实现中使用anydbm的shelve模块要快一些),无论是阅读还是书写(尽pipe我也做了更多的阅读)。 对我来说,问题是python绑定的简单文档,但是有足够的示例代码来弄清楚如何做你需要做的事情。 此外,东京内阁是很容易安装(如同python绑定),不需要服务器(如你所说) ,似乎积极支持 (稳定,但不再积极发展)。 您可以以只读模式打开文件,允许并发访问或读/写模式,防止其他进程访问数据库。
我在夏天正在寻找各种各样的select,我得到的build议是这样的:尝试不同的select,看看什么最适合你。 如果只有一个“最好的”选项,那会很好,但是每个人都在寻找稍微不同的特征,并且愿意做出不同的折衷。 你最了解。
(也就是说,如果你分享了最适合你的东西,为什么你select了这个解决scheme而不是别人呢!
LMDB是http://symas.com/mdb/inmem/中内存效率最高的数据库;
也被certificate是最可靠的 – 完全防撞的。 workshops/spring-14/talks/Thanu.pdf
你提到的那些东京内阁已经logging了腐败问题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的作者。 但是,这些都是有logging的事实:LMDB是世界上最小,最有效,最可靠的关键/价值商店,没有其他任何东西可以接近。
cdb可以处理高达4 GB的任何数据库,对于20GB的事情来说,它太小了。
Riak在Linux上运行,并允许您dynamic添加节点
那么Python 3.0的dbm.ndbm呢?
另一个build议是TDB (Samba项目的一部分)。 我已经通过tdb模块使用它,但是我不能说我已经testing了它在崩溃时的可靠性。 我使用的项目没有这样的要求,我找不到相关的文档。
怎么样一个SQLite?
我已经用Python的bsddb.hashlib(),它工作得很好。
你可能会喜欢djb的cdb ,它有你提到的属性。
在我查询跨平台的ISAM风格的数据库 (类似),我也收到了embedded式版本的Firebird和GLib的build议 。