问题描述
我需要一个快速,可靠且占内存少的 Linux K/V 数据库。Key 长大约为 128 bytes,value 最长 128K 或 256K 。理想中的数据库内存占用不应该大于1MB。数据库大约有 20G ,但是每次只有随机小部分读取。或者,我可以从数据库中移出部分二进制数据,从而将数据库尺寸降到 2G。数据库在系统挂掉时不能丢数据。可能是百倍读写比(读100,写1)。如果能够使用块存储而不是文件系统就更好了。不需要客户端服务端,仅仅只需要一个类库。最好有 Python 接口。
我考虑过哪些方案呢?
Tokyo CabinetPython 接口选择pytc,参见pytc 示例代码,支持哈希和 B+trees,事务,桶尺寸大小在创建时固定;独占写锁(写需要关闭,才能让其他用户操作);大量小数据写会多次重新打开文件导致很慢;Tyrant 服务可以帮助大量小数据写;Tokyo Cabinet, Tokyo Tyrant 和 BDB 性能评测VSDB即便在 NFS 也很安全,无锁;栅栏呢?;更新很慢,但不像 cdb 般的慢;最后一个版本为2003BerkeleyDB提供灾难恢复;事务;bsddb
Python 模块Samba’s TDB提供事务支持和Python接口,用户很有经验,有时mmap()
整个文件,repack
操作有时会使文件翻倍,有些操作会在数据库文件大于2G(甚至是在 64位操作系统)之后莫名其妙失败,有集群实现(CTDB)。大量修改后,文件增长很大;出现大量hash竞争时会导致速度下降严重;没有内建方法重建数据文件;每个单独的hash桶拥有一个锁,并行处理很快aodbm日志式追加数据处理,防止系统挂掉;提供Python类库hamsterdb提供Python类库C-tree成熟,功能丰富的高性能商业解决方案,提供一个免费的简化版本TDBbitcask日志式结构,Erlang实现其他 DBM 实现(诸如 GDBM,NDBM,QDBM,Perl‘s SDBM or Ruby’s;他们可能没有灾难恢复)
我不会使用这些:
MemcacheDB客户端、服务端,使用 BerkeleyDB 作为后端cdb每次写都需要重新生成整个数据库apbcdb同上Redis将整个数据库放到内存中SQLite如果没有周期性压缩将会变得非常慢,比如 Firefox 3.0 的自动完成功能。即便在 SQLite 3.1 版本之后拥有auto_vacumming
(同样需要周期性整理)。小数据写事务非常慢;一个繁忙的进程执行很多事务,其他进程将拿不到锁MongoDB过于重量级,用内部结构对待值Firebird基于SQL RDBMS,过于重量级
参考链接:
Linux 杂志关于 K/V 数据库的文章一些老软件列表MemcacheDB,Redis和Tokyo Cabinet Tyrant 速度比较Windows 平台上的 K/V 数据库 ?有商业应用的开源云K/V存储 ?Noah 回答
我幸运的采用 Tokyo Cabinet/pytc 方案。它的读和写都很快(在我的实现中,甚至比shelve
模块,anydbm
模块还快)。对于我来说,他的Python接口文档有些简陋,还好有充足的示例代码,让你知道如何解决问题。此外 Tokyo Cabinet 易于安装,不需要服务端,持续提供支持。你可以通过只读模式打开文件,以提供并发访问,或者读、写模式以阻止其他进程访问。
整个夏天我看到了很多观点,建议我尝试最适合自己的方法。如果你能在这里找到属于你的最好方法那就再好不过了,但是每个人都在寻找不同的特性,这会导致完全不一样的结局,选择你最熟悉的。
原文:http://stackoverflow.com/questions/1690605/reliable-and-efficient-key-value-database-for-linux
# 来源:HX
在微博上关注: 新浪, 腾讯 投稿
最新招聘
[上海] Python开发工程师 – 上海魅格计算机科技有限公司 [上海] Python web 工程师 – 资识署投资咨询(上海)有限公司 [深圳] 腾讯游戏(也许是深圳最大的Python团队) 诚邀Python攻城师 – 腾讯 [南京] django 开发工程师 – 南京购物党 [南京] django 开发工程师 – 南京购物党
更多>>
她是应该难过的往回走,还是蹲下来哭泣?