论坛里的各种高端深层次讨论让我压力山大啊,新手菜鸟小心翼翼地请教一些弱问吧,望各位高手不吝赐教

121 views
Skip to first unread message

Yuanzhe Yang

unread,
May 11, 2013, 6:07:15 PM5/11/13
to bea...@googlegroups.com
最近在写一个作业,需要了解一下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个然后比较版本号么?还是随便读一个?只读一个有可能读不到最新数据吧?


暂时想到的问题就这么些,我是学人工智能的,对分布式系统和数据库的基础不怎么样,很多地方认识不足,所以问了一些在老鸟眼里显而易见的常识性问题,希望大家能不厌其烦地回答我的问题,麻烦大家了,在此先行谢过!

Davies Liu

unread,
May 14, 2013, 8:37:09 AM5/14/13
to beandb
前两天休假了,所有回复得有点晚。

2013/5/12 Yuanzhe Yang <yyz...@hotmail.com>
最近在写一个作业,需要了解一下BeansDB,研究许久很多问题还是没弄明白,相关的文档资料不多也不详细,对于像我这样的一些新手来说比较难入门,从代码来分析整个体系结构更是比登天还难。所以在这里请教一些简单低级的问题,希望大家不吝赐教,同时尽量不要取笑 :)

按照我目前大概的理解,从逻辑角度来讲系统是分成三层吧?客户层进行相关操作,代理层进行事件处理,数据路由,负载均衡等等,网络协议,线程池都是在这一层,服务器层由bitcask负责底层存储?这样理解是否正确?
 
大致是这样的。网络协议在三个层次都需要涉及,线程池是在服务器层。

网上没找到完整的架构图,都是非常简化抽象的,例如官方文档里的三层模型,关键问题是它是个ppt,没有解释。

如果有了一些相关的网络服务器的概念,应该不难理解的,所以没有文章来详细阐述。
 
从实际出发,整个系统是去中心化的,那么网络层的任务是需要在服务器端实现的吧?毕竟服务是一直在提供,客户端是时有时无的。但是主页上又写了在客户端实现数据路由,我就有点儿没弄明白。

数据路由是可以在客户端实现(就不需要代理了),也可以在中间代理层实现,根据需要来调整部署。代理层的好处是可以简化配置管理。

底层存储是用的bitcask,我大致看了一下bitcask的描述,对数据的索引是用哈希表,保存数据的起始位置及长度。但是BeansDB里的实现和它不一样,不是一条一条的表结构,而是改造成了树状,叶子节点包含若干个item,每个item代表什么呢?一个bucket?

HTree 就是类似一个多级哈希表,每个Item表示一个Key-Value对的索引信息,包括版本号,值的哈希,以及在文件中的偏移。
 

bitcask和bucket的对应关系是什么?一个bucket由一个bitcask来管理?要是其中的记录索引全用哈希树,那不是得一个bitcask一颗哈希树,然后一个叶子节点表示一条记录?

一个 bucket 是 beansdb 中的一个哈希区间,在服务器端存储时会是一个目录,里面是一个bitcask,内存中会有一颗哈希树。
 

那么给一个key,只有负责它的bitcask的哈希树知道它的对应数据,如何找到这个bitcask?用主干树叶子节点的一个item指向一个bitcask?这一块儿最不明白,要是有个例子就好理解了。

Key 跟 bucket 的关系是通过Key的Hash值确定的。
 

数据的分区该如何实现?ppt上面写着手动指定,按照bucket分配,proxy自动路由,没了。有点儿糊涂,是说手工写在配置文件里,哪个bucket对应在哪个节点的意思么?

自动路由是根据各个节点反馈的数据量分布,proxy 就可以得到bucket分配跟节点的对应关系,进行路由。
 

另外BeansDB在磁盘上的存储是目录结构的,那么每一对data和hint文件就是一个bitcask,一个bucket了吧?和主干哈希树的结构一一对应?

是对应的。
 

写的时候,每一条记录都会被按照预设值写到N个节点上,W个节点写入成功则操作成功。那么读取呢?是读R个然后比较版本号么?还是随便读一个?只读一个有可能读不到最新数据吧?

读取的行为默认是随机选一个节点读到一个有效的版本就返回。读不到的话会重试其它节点。 


暂时想到的问题就这么些,我是学人工智能的,对分布式系统和数据库的基础不怎么样,很多地方认识不足,所以问了一些在老鸟眼里显而易见的常识性问题,希望大家能不厌其烦地回答我的问题,麻烦大家了,在此先行谢过!

--
You received this message because you are subscribed to the Google Groups "BeanDB" group.
To unsubscribe from this group and stop receiving emails from it, send an email to beandb+un...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
 
 



--
 - Davies

Yuanzhe Yang

unread,
May 17, 2013, 12:59:58 PM5/17/13
to bea...@googlegroups.com
非常感谢刘先生的回复,大致明白了,还有几个地方我不太确定,再麻烦您帮我看看这个理解对不对:

存取的时候,给一个key,算哈希值,先找到对应的bucket和bitcask,从负责它的这棵树开始,从根节点开始一层一层对16取模直到叶子节点,是这样么?

这棵哈希树中,当一个叶子节点的记录满了128条,需要展开一层子节点的时候,是直接生成16个叶子节点,有的有内容有的可以为空,不能先生成一部分再随着存储量慢慢长到16个对吧?

每个节点负责一个哈希区间,那么它的16个子节点负责的区间是把父节点的区间16等分还是有其它策略?

每插入一条新记录,对应的叶子节点的哈希值更新么?叶子节点的父节点呢?一直往上直到根节点都更新么?
  1. 如果更新,那么树有几层高就得更新几个节点,每一条记录都这么做的话,开销大不大?
  2. 如果不更新,根节点哈希值不变,就不知道发生了改动,那岂不是不是随时同步?是每隔一段时间才重新计算一次,同步一次?隔多久啊?

再次感谢,祝好!

Davies Liu

unread,
May 17, 2013, 11:13:38 PM5/17/13
to beandb
这些HTree 方面的细节问题,建议直接看代码吧,会更清楚。

2013/5/18 Yuanzhe Yang <yyz...@hotmail.com>

--
You received this message because you are subscribed to the Google Groups "BeanDB" group.
To unsubscribe from this group and stop receiving emails from it, send an email to beandb+un...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
 
 



--
 - Davies

Yuanzhe Yang

unread,
May 19, 2013, 7:03:22 AM5/19/13
to bea...@googlegroups.com
感谢您的回复。您说的没错,所有东西都在代码里面,那我就没法在这里继续提问了。要知道光靠看代码来理解那是需要有相当的知识经验做支撑的,不是是个学计算机的就都能弄明白啊。在这里提问之前,我已经看过代码了,无奈C语言不是我的强项,简单直白的地方能明白,复杂的地方都是似懂非懂。我在互联网开发、数据库、分布式系统这几项完全属于门外汉,能把大体结构理清楚就不错了,细节的问题实在是能力有限。所以还是给您添麻烦了,实在抱歉,谢谢。



在 2013年5月18日星期六UTC+2上午5时13分38秒,Davies写道:
Reply all
Reply to author
Forward
0 new messages