豆瓣刘洪清谈开源存储系统BeansDB

个人简介 刘洪清,系统程序员,2007年毕业于清华大学电机系,现就职于豆瓣网,从事架构和平台相关工作,BeansDB的作者,为改善豆瓣三千多万用户的使用体验而努力。热爱技术,尤其关注实现服务器端大容量、分布式、高性能、高可用等相关技术。

QCon全球企业开发大会(QCon Enterprise Software Development Conference)是由C4Media媒体集团InfoQ网站主办的全球顶级技术盛会,每年在伦敦、旧金山、东京、北京召开。自2007年3月份在伦敦召开首次举办以来,已经有包括金融、电信、互联网、航空航天等领域的近万名架构师、项目经理、团队领导者和高级开发人员参加过QCon大会。

   

1. 我是InfoQ的编辑,欢迎你参加这次QCon大会,也欢迎接受我们的采访,你好。

谢谢。

   

2. 你这次演讲主题是BeansDB的设计与实现,可以请先介绍一下你目前主要负责的工作吗?

BeansDB是一个Key/Value(键/值)的存储系统,主要针对图片或者大文本数据,我是BeansDB的设计与实现者,基本上这个项目是我一个人在断断续续维护的,目前在豆瓣应该是主要的存储系统之一。

   

3. 目前在豆瓣有哪些应用使用了BeansDB这个系统呢?

现在豆瓣的所有图片,包括各种相册、图像,还有MP3,这些是用BeansDB来存储的,同时还有豆瓣的日记、小组话题、豆邮这些文本类数据也是由BeansDB来存储的。

   

4. 也就是说,豆瓣上的一些小文本还有图片类都是用这个系统来做存储的对吧。BeansDB如何对存储引擎进行选型的呢?据了解之前采用的叫ToykoCabinet,现在改成了Bitcast引擎。

因为Bitcast相对于ToykoCabinet来说,它更简单,而且更简单容易实现,在大数据量的情况下,性能更可控,还有可靠性,比如说如果服务器宕机不会造成数据丢失,这些特点我觉得特别适合用在BeansDB里面,后来就选择用这个方式自己重新实现了一遍。

   

5. 在你选择的Bitcast引擎中有一个存储算法,可以给我们分享一下Bitcast这个存储算法一些使用的心得吗?

Bitcast主要特点是它把数据以追加的形式写到数据文件中,对原有数据不会发生修改,内存中会存放这些所有数据的索引,比如说某一个Key(键)它对应着在哪个文件的哪个偏移,这样做的好处是,如果服务器Crush(宕机),原有的数据不会损坏,服务器启动以后迅速扫描一下所有的数据都可以恢复,同时它也能够做容错,比如说如果误操作把某一份数据误删掉了,它可以用这些原始完整数据来做恢复。

   

6. 也就是说它的主要特点是数据完整可靠快速恢复,对吧。可以给我们介绍一下BeansDB在数据同步操作上怎么做的吗?

BeansDB实现的是最终一致性,就是在BeansDB里实现了一个Hash Tree(哈希树)的算法,这个算法可以用来快速比较不同的结点之间数据的差异,找到差异以后,就可以通过版本化或者修改时间来总裁进行同步操作,达到最终一致性。

   

7. 也就是通过数值就的比较来达到同步效果?据我之前了解的资料,BeansDB的网络协议是基于Memcached做了一些修改,BeansDB的网络协议跟Memcached的网络协议相比,做了哪些扩展呢?

基本上是完全兼容的,只是说对某些Key进行了重新定义,比如以@符号开头的Key它可以表示从Hash Tree中去读取一部分信息,以问号开头的表示要查询某个Key的Meta(元)信息,比如版本、哈希或是修改时间,其他基本都是一样的。

   

8. 主要是在某些细节字段上做了更多扩展来适应应用?

那些扩展客户端都可以直接使用。

   

9. 据我了解的资料,最新的版本是2010年12月份发布的,在这个版本上增加了Proxy(代理)层,为什么会增加Proxy层?这个层的主要作用是什么呢?

Proxy的好处是可以方便的管理配置,例如实际部署系统中,有大量系统各种应用使用BeansDB,那么配置文件管理会是一个问题,如果配置文件更新了,你需要重启应用端进程,这样会多很多事情。有了Proxy以后,你只需要把配置文件交给Proxy,如果配置发生变更,重写Proxy就可以了,这样在部署和管理上会极大的简化,另外在Proxy还实现一些额外的路由算法和自动发现机制,这样会进一步提高整个系统的可用性和稳定性。

   

10. 也就是说这个Proxy层主要是方便管理,能够增加一些可用性?BeansDB是由豆瓣,也就是由您自己去开发的一个系统。我看到目前的版本应该是?

0.5.3最新的。

   

11. 在BeansDB未来有没有规划,例如功能变更,还有其他一些相关计划呢?

未来随着豆瓣数据增长,或者说其他需求的出现,可能会考虑几个方向,一个是做自动的扩容操作,因为现在扩容必须是手动进行的,手动添加结点、修改配置、重启、拷贝数据这些过程,以后如果整个集群的规模发展到上百台的时候,可能会考虑把这些过程自动化,这是一方面。另外一方面是可能对数据模型会做一些增强,现在是一个简单的Key/Value(键/值),Value(值)是没有结构的,以后可能会根据需要,会把这个Key/Value发展成为一个Key/List(键/列表),比如说Value是一个数组之类的,然后提供一些操作数组的简单原则性的方法。

你可能感兴趣的:(豆瓣刘洪清谈开源存储系统BeansDB)