日期:2014-05-16  浏览次数:20504 次

Berkeley DB设计经验

很久没有做翻译这种苦力活了,这是断断续续折腾了好久周的结果 - http://www.ituring.com.cn/article/details/8111

原文链接:http://www.aosabook.org/en/bdb.html

作者:Margo Seltzer 和 Keith Bostic

康威法则(Conway’s law)说明了设计反映了产生它的组织的结构。展开来说,我们也许会预见一款由两个人设计和完成最初制作的软件不仅会在一定程度上反映组织的结构,还会反映每一位带来的内在偏见和哲学理念。我们中的一位(Seltzer)在文件系统和数据库管理系统的世界中度过她的职业生涯。如果被问及于此,她会辩解说此二者基本上是等同物,进一步地,操作系统和数据库管理系统实质上都既是资源管理器又是便利抽象层的提供者。它们的区别“仅仅”在于实现的细节。另一位(Bostic)则信仰软件工程中基于工具的方法和基于简单构造块的组件构建方法,因为这样的系统在各种重要“能力”方面总是优于单体式体系结构:可理解性、可扩展性、可维护性、可测试性和灵活性。

当把这两种理念结合起来,你就不会奇怪我们花了过去二十年间的大部分时光共事于Berkeley DB(一个提供高速、灵活、可靠和可扩展的数据管理的软件库)了。Berkeley DB提供了人们所期待的传统系统(例如关系型数据库)中的大多数的同样功能,但是打包方式不同。例如,Berkeley DB提供了按键值的和按顺序的两种快速数据访问,同时还有事务支持和故障恢复。但是,它以库的形式提供这些特性,与需要这些服务的应用程序链接到一起,而不是作为一个独立的服务器应用提供服务。

在本章中,我们将要更深入地观察Berkeley DB,看到它由一组模块组成,每个模块都体现了Unix的“把一件事做好”的哲学。嵌入了Berkeley DB的应用程序能够直接使用这些模块或者通过更加熟悉的操作获取、存放和删除数据项来间接使用它们。我们将集中关注体系结构——我们是如何开始的,我们设计了什么,我们在哪结束了以及为什么。设计能够(而且一定将要)被强迫去适应和改变——重要的是随时间的推移而维护原则和一致的愿景。我们也将简要的谈及长期软件项目的代码演进。Berkeley DB有超过20年的持续开发,这难免会给好的设计造成负面影响。

4.1 开端

Berkeley DB起源于Unix操作系统还专属于AT&T的时代。那时有几百种实用工具和函数库的血统还带有严格的许可限制。Margo Seltzer那时是加州大学伯克利分校的研究生,Keith Bostic是伯克利计算机系统研究组的一员。当时Keith正在从伯克利软件发行版(BSD)中删除AT&T的专属软件。

Berkeley DB项目开始于一个适度的目标——用一个新的、改进的、可同时支持内存和磁盘操作的哈希实现来替代内存哈希软件包hsearch和磁盘哈希软件包dbm/ndbm,以及允许不带专有许可的自由分发。Margo Seltzer写的哈希库 SY91 基于Litwin的可扩展线性哈希研究成果。它宣称采用了一种聪明的方法来达到哈希值和页面地址之间的常量时间映射,以及处理较大数据的能力——大于底层的哈希桶或文件系统页大小的项,通常是4到8KB。

如果哈希表很好,那么B树加上哈希表将会更好。Mike Olson,也是加州大学伯克利分校的研究生,曾写过一些B树的实现,同意再写一个。我们三个人把Margo的哈希软件和Mike的B树软件转换成了一套和存取方法无关的API,应用程序通过数据库句柄来引用哈希表或B树,句柄带有读取或修改数据的处理方法。

基于这两种存取方法,Mike Olson和Marge Seltzer写了一篇关于LIBTP(一个运行于应用程序地址空间的可编程事务函数库)的研究论文 SO92 。

这套哈希和B树函数库以Berkeley DB 1.85的名称被集成到了最终的4BSD发行版中。从技术上看,该B树存取方法实现的是B+ link树,不过在本章的后续部分我们将采用B树一词,因为它是存取方法的名称。Berkeley DB 1.85的结构和API对用过Linux或BSD衍生系统的人而言很可能比较熟悉。

Berkeley DB 1.85沉寂了一些年,直到1996年Netscape与Margo Seltzer和Keith Bostic签约来实现LIBTP论文中描述的全部事务设计并且实现一个生产质量级的版本。这项工作产生了Berkeley DB的第一个事务性版本,版本2.0。

Berkeley DB的后续历史就是一个更简单、传统的大事年表了:Berkeley DB 2.0(1997)引入了事务;Berkeley DB 3.0 (1999)是一个重新设计的版本,增加了更多级别的抽象和间接性以支持不断增长的功能;Berkeley DB 4.0 (2001)引入了复制和高可用;Oracle Berkeley DB 5.0 (2010)增加了SQL支持。