说实话,在我进入Oracle之前一个月,也是拿到Oracle的Offer 5个月之后,我才得到我未来经理的电话通知(我不是怪他通知的晚,事实上我非常感谢他给我机会进入这个产品组---这纯属机缘巧合,让我来到一个崭新的世界),说我在Berkeley DB产品组,这之前我从来没听说过它,我的第一印象,Berkeley的DB不是postgresl吗?仔细一查,才知道它是Oracle的嵌入式数据库,而嵌入式数据库是什么样的呢?是不是用在嵌入式系统当中的数据库?或者那种移动设备上的,诸如智能手机、PDA之类?带着诸多疑问,我仔细看了 Berkeley DB(注1)的产品介绍。
1. Oracle Berkeley DB 是什么?
在Berkeley DB的官方站点 http://www.oracle.com/database/berkeley-db/db/index.html 可以看到这个问题的最精辟的答案:
Oracle Berkeley DB is the industry-leading open source, embeddable database engine that provides developers with fast, reliable, local persistence with zero administration. Oracle Berkeley DB is a library that links directly into your application. Your application makes simple function calls, rather than sending messages to a remote server, eliminating the performance penalty of client-server architectures. Oracle Berkeley DB eliminates the overhead of SQL query processing, enabling applications with predictable access patterns to run faster
这段话太精炼了,以至于需要把它展开来说才容易弄明白。首先,说它industry-leading,绝不是吹牛,我不能说销售数据,但是诸如 Google, Amazon, EMC的大公司以及SVN, Firefox、OpenLDAP、OpenOffice等开源产品,都在使用Berkeley DB;它也是很多*nix系统的标准配置;而就在官方主页上可以看到,Berkeley DB有超过2亿的部署量;
说Berkeley DB是一个Embeddable database即嵌入式数据库,是说它是作为一个库来链接到你的应用程序的可执行文件的,你的程序中调用它的API来与它进行交流,没有SQL语言,没有数据库连接;并不是说它只能用在嵌入式系统上面。事实上,有很大一部分Berkeley DB的用户是在 *nix 服务器上使用它,虽然它也支持很多种嵌入式系统,比如VxWorks, QNX, BREW, S60, WinCE等,并且在将来会支持更多。由于它链接到程序中成为其中的一部分,访问数据库功能就省去了网络连接和数据传输开销(HA例外), 因而速度快了很多;
那么Berkeley DB到底有多fast呢,我们用数据说话,这个白皮书写的很详细,大家可以看看:http://www.oracle.com/technology/products/berkeley-db/pdf/berkeley-db-perf.pdf 。你通过BDB 的API来与它交流,对它做参数配置、数据读写等等。参数配置要么通过调用API完成,要么写在配置文件上,但是一旦完成配置,程序运行起来后,基本上就不需要后续的管理(administration)了,所以使用这样的数据库不需要DBA,可以节省额外的费用;当然了,BDB 也有一组工具方便用户监控BDB的运行状况.
最后,Berkeley DB不支持SQL,为什么呢?首先,为了实现SQL支持,需要额外的代码,因而可能引入额外的bug,并且会增加它占用的资源(磁盘、内存空间、 CPU);其次,SQL优化是一个非常复杂的问题,大型数据库服务器需要非常复杂的处理也只能较好的解决这个问题,根本原因在于,试图用一种通用的方式解决各种各样不同的问题的难度太大了;BDB使用相反的理念:程序员对于自己的软件访问数据库的模式最熟悉,为什么不让他们完全控制数据库的查询、更新方式呢?这样的代价是程序员不得不多写一些代码,这对很多人来说不算太难,而好处也很明显:他可以完全控制查询的执行方式,因而可以写出最优化的查询优化,这是任何SQL 数据库系统都比不上的。当我刚接触BDB时,我觉得使用API来访问数据库很麻烦,要多写不少代码,不像使用SQL,一个命令搞定,于是斗胆问经理:我们什么时候会加入SQL支持,经理的回答很简练:Never! 大而全不一定就是最好的,最重要的是有自己的特色!这句话蕴含了如此深刻的道理:有了SQL功能,用户就要在多个选项之间权衡和选择,而BDB虽然有了 SQL的优点,同时也染上了它的缺点。这个道理我发现在其他很多方面也适用。BDB当今的用户量已经有力的回应了对它没有SQL功能的质疑---对很大一部分用户来说,SQL只是装饰品,不是最本质的他们想要的东西,他们想要时空性能、可靠性、可扩展性、完全的可控性,等等,他们宁愿多写一些代码!
Berkeley DB产品家族有三个产品,及核心版,Java版以及XML版,其中核心板用C语言开发,支持几乎所有的常用操作系统平台和很多嵌入式操作系统,拥有最悠久的历史和最高的使用量、知名度,如果不显式说明,人们提到Berkeley DB都是指核心版;Java版和XML版是后起之秀,Java版完全使用Java语言实现,它不基于核心版,是完全独立的纯Java嵌入式数据库,而 XML版基于核心版,它的功能是让用户方便的存储和读取XML数据到数据库中。从下图可以看出三个产品的结构和相互关系。
Berkeley DB支持事务语义(ACID),同时为了为另外一些常见用例提供更高的性能,比如不需要事务保障的单写多读,以及单独的线程/进程访问等,可以 Berkeley DB不使用它的事务支持从而省去日志、锁定等开销,通过特殊的锁定方式它可以为单写多读提供很大的性能提升。
BDB资源:
官方主页:http://www.oracle.com/database/berkeley-db/db/index.html
产品下载:http://www.oracle.com/technology/software/products/berkeley-db/index.html
官方开发者文档中心:http://www.oracle.com/technology/documentation/berkeley-db/db/index.html
产品技术信息: http://www.oracle.com/technology/products/berkeley-db/pdf/berkeley-db-family-datasheet.pdf
http://www.oracle.com/database/docs/berkeley-db-datasheet.pdf
http://www.oracle.com/database/docs/Berkeley-DB-v-Relational.pdf
官方主页上有很多有趣的成功案例的白皮书和技术文档,值得大家学习
注1 :Oracle Berkeley DB产品家族包括三个产品---Berkeley DB核心版,Berkeley DB Java版以及Berkeley DB XML. 我在核心版工作,所以我所讨论的Berkeley DB都是指核心版。