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


    版本: 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的样子吧,不会太高

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

    谢谢

    喜欢一起简单,实用的东西,拒绝复杂花哨,我不是GEEK.
  • 相关阅读:
    APP兼容性测试
    APP本地服务安全测试
    接口安全测试
    Python之日志操作(logging)
    Python之json编码
    Python之配置文件读写
    windows10 修改远程连接本地端口
    ctf学习
    telnet常见的错误
    连接ssh中常见的错误代码
  • 原文地址:https://www.cnblogs.com/igloo1986/p/3064170.html
Copyright © 2020-2023  润新知