【noqsl】beansdb的分布式实现~简单粗暴有效~

时间:2022-07-31 08:45:50

版本: beansdb 0.5.3

下载地点:
http://code.google.com/p/beansdb/

 

beansdb是豆瓣用来存储不变小object的支持中等数据规模的nosql的持久型数据库~跟memcache相比,主要特点如下

1. 数据是持久化的,value 完全在硬盘上操作,内存中只存放key的hash索引

2. 在持久化的基础上,为了提高可靠性,一份数据可以设置存放在多个地方

3. 把分布式坐在了客户端的api里,beansdb本身是单机的

4. 存储使用bitcast的方式~~ 跟b+树索引(tokyocabinet)和lsm(leveldb)又不一样的~挺巧妙~

5. beansdb没有实现expired功能~~~

6. 网络连接的管理直接搬了redis的实现~~~

 

 

下面主要介绍配置文件的工作方式,自带的example中的配置是这样的

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

翻译过来就是

localhost:7901:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

localhost:7902:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

localhost:7903:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

客户端拿到这个配置,会做一下“倒排”

0:localhost:7901;localhost:7902;localhost:7903

1:localhost:7901;localhost:7902;localhost:7903

2:localhost:7901;localhost:7902;localhost:7903

。。。

15:localhost:7901;localhost:7902;localhost:7903

 

当客户端对key进行操作【set,get,delete】时,会先对key进行hash/16 ,然后你懂的,这里读和写有个比较trick的地方

 

读的时候

读到了会对其他同一个桶内的server做一个set,利于数据恢复.

    def get(self, key):
ss
= self._get_servers(key)
for i,s in enumerate(ss):
r
= s.get(key)
if r is not None:
# self heal
for k in range(i):
ss[k].set(key, r)
return r

 

写的时候

会对统一个桶内的所有的server做写操作,由此达到冗余存储的目的~

 

 

总结:

1. 简单,够美

2. 基于磁盘,没有提供可选的expire功能,可能豆瓣的需求是用来存储不会删除,不经常改变的大量小object吧,按照作者的说法,是针对豆瓣海量音乐,图片的~~~

3. 配置文件的映射比较复杂~~

4. qps不会很高,因为依赖与单机的相应速度,几百qps的样子吧,不会太高

 

 

总之受益匪浅~~~ 好了就到这

谢谢