BeansDB学习

最近学习了一下豆瓣的分布式 Key/Value 存储系统 BeansDB(v0.5.3)。

BeansDB 的作者 Davies 写的关于 BeansDB 的介绍:《beansdb卷土重来》。
BeansDB 的项目主页:http://code.google.com/p/beansdb/
用户手册:http://code.google.com/p/beansdb/wiki/UserGuide
下载地址:http://code.google.com/p/beansdb/downloads/list

下载之后参照用户手册上的说明编译安装即可,非常简单。

启动 BeansDB 也很简单,如:

beansdb -d -p 7900 -H testdb

其中 -p 指定端口,-H 指定数据文件存放的目录。

BeansDB 发布版中带有 Python 接口,用法如下(来自官网手册):

#python
from dbclient import Beansdb

cfg = {
  "localhost:7901": range(16),
  "localhost:7902": range(16),
  "localhost:7903": range(16),
}

db = Beansdb(cfg, 16)
db.set('key', 'value')
v = db.get('key')
db.delete('key')

BeansDB 非常简单,基本上它只有三个操作:set、get以及delete。它甚至没有直接提供遍历所有 key 的方法,遍历所有 key 的话,需要 get(‘@’),然后继续遍历,不过,在数据量很大的情况下,这个遍历可能会花比较长的时间。

BeansDB 采用了 Bitcask 设计,将所有 key 的信息都保存在内存中。这样的好处是查找会特别快,但一个直接的缺点就是机器的内存限制了能存放的 key 的数目的上限。根据《beansdb卷土重来》中的介绍,一个 key 大约占用 20 字节,这样一台 8G 内存的服务器将可以存储约 4 亿个 key。当然,key 所对应的 value 是存储在硬盘上的。

BeansDB 比较适合存储中等大小的写入后就很少变化的内容,比如图片;不适合存储大量小碎片内容或会频繁更改的内容,比如日志;也不适合存储太大的文件,根据作者 Davies 的说法,BeansDB 默认设置单文件不超过 50M,实际上用它存储超过 10M 的文件感觉都不太合适。

另外,随着硬盘越来越便宜,目前各大 NoSQL 存储系统似乎都不太关心硬盘的占用量,为了追求写入速度,普遍使用追加的方式写新数据,当一个 key 的值发生变化时,系统只是在硬盘上追加一条记录,并不会把原来的值从硬盘上删除。这样一来,如果你存储的内容经常变化,一段时间后,你会发现硬盘占用量只增不减。

请教了作者 Davies 之后,关于这个问题得到以下解决方案:

目前没有提供相关工具,可以用telnet 来控制:

telnet localhost 7900
flush_all 0

这样对应的节点就会执行优化操作,tail -f /var/log/beansdb.log 能看到优化的信息,如果运行的时候设置的Log文件的话。

总的来说,BeansDB 安装和使用都非常简单,性能也不错,而且是国人开发的。如果有类似于大量图片存储这样的需求,可以尝试一下。

2 Replies to “BeansDB学习”

  1. 看上去功能太简单了而且也大半年没更新了只有set,get,delete的话redis就可以完全取代之比较一下两者的Performance,如果redis完胜或者不相上下我觉得这个项目就可以关闭了

    1. 的确太简单了,不过这样的好处是部署和使用也非常简单。我知道国内有一些小团队创建的小SNS网站用它来做图片存储,从这个方面来看它还是有意义的。:-)

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s