最近在写一个作业,需要了解一下BeansDB,研究许久很多问题还是没弄明白,相关的文档资料不多也不详细,对于像我这样的一些新手来说比较难入门,从代码来分析整个体系结构更是比登天还难。所以在这里请教一些简单低级的问题,希望大家不吝赐教,同时尽量不要取笑 :)
按照我目前大概的理解,从逻辑角度来讲系统是分成三层吧?客户层进行相关操作,代理层进行事件处理,数据路由,负载均衡等等,网络协议,线程池都是在这一层,服务器层由bitcask负责底层存储?这样理解是否正确?
网上没找到完整的架构图,都是非常简化抽象的,例如官方文档里的三层模型,关键问题是它是个ppt,没有解释。
从实际出发,整个系统是去中心化的,那么网络层的任务是需要在服务器端实现的吧?毕竟服务是一直在提供,客户端是时有时无的。但是主页上又写了在客户端实现数据路由,我就有点儿没弄明白。
底层存储是用的bitcask,我大致看了一下bitcask的描述,对数据的索引是用哈希表,保存数据的起始位置及长度。但是BeansDB里的实现和它不一样,不是一条一条的表结构,而是改造成了树状,叶子节点包含若干个item,每个item代表什么呢?一个bucket?
bitcask和bucket的对应关系是什么?一个bucket由一个bitcask来管理?要是其中的记录索引全用哈希树,那不是得一个bitcask一颗哈希树,然后一个叶子节点表示一条记录?
那么给一个key,只有负责它的bitcask的哈希树知道它的对应数据,如何找到这个bitcask?用主干树叶子节点的一个item指向一个bitcask?这一块儿最不明白,要是有个例子就好理解了。
数据的分区该如何实现?ppt上面写着手动指定,按照bucket分配,proxy自动路由,没了。有点儿糊涂,是说手工写在配置文件里,哪个bucket对应在哪个节点的意思么?
另外BeansDB在磁盘上的存储是目录结构的,那么每一对data和hint文件就是一个bitcask,一个bucket了吧?和主干哈希树的结构一一对应?
写的时候,每一条记录都会被按照预设值写到N个节点上,W个节点写入成功则操作成功。那么读取呢?是读R个然后比较版本号么?还是随便读一个?只读一个有可能读不到最新数据吧?
暂时想到的问题就这么些,我是学人工智能的,对分布式系统和数据库的基础不怎么样,很多地方认识不足,所以问了一些在老鸟眼里显而易见的常识性问题,希望大家能不厌其烦地回答我的问题,麻烦大家了,在此先行谢过!