非关系型数据库NoSQL的崛起
《连线》杂志网络版近日刊载文章,对NoSQL(非关系型数据库)的来源与历史进行了追溯。文章主要介绍了最古老的NoSQL数据库之一CouchDB,这种数据库的创造者达米安?卡茨受到了在线协作平台Lotus Notes的启发,他的故事有助于帮助解释NoSQL运动的兴起,及为何这种数据库与以往的数据库存在如此巨大的差异。
CouchDB的创造者达米安·卡茨
以下是这篇文章的全文: 在追溯NoSQL运动的源头时,大多数互联网人士都会想到谷歌和亚马逊。 随 着自身网络服务日益取得巨大而成功的增长,谷歌和亚马逊需要新的方法来存储不断增加的服务器所带来的数量庞大的数据,于是两家公司都为此而创造了一个新的 软件平台——谷歌构建了BigTable平台,而亚马逊则构建了Dynamo平台。在这两家互联网巨头发布研究论文来描述其各自的数据存储平台以后,其他 许多公司也都寻求进行复制。 其结果是,一支NoSQL(非关系型数据库)“大军”就此产生,这种数据库是专为在数千台服务器之间运作而设计的。这些新时代的软件平台——包括Cassandra、HBase和Riak等——对数据库市场进行了改造,不仅有助于Facebook和Twitter等诸多互联网巨头的运作,同时也涵盖了更多的传统业务。 “如 果你看看市场上所有的NoSQL解决方案,那么就会发现每一种解决方案都能追溯至亚马逊Dynamo论文或谷歌BigTable论文。”云计算公司 Joyent首席技术官贾森?霍夫曼(Jason Hoffman)说道。“如果谷歌或是亚马逊没人曾写过一份学术报告(来描述NoSQL平台)的话,那么今天的世界将会是个什么样子呢?” 好 吧,如果真是那样,那么世界还将拥有另一种最古老的NoSQL数据库之一,那就是CouchDB。CouchDB的创造者达米安?卡茨(Damian Katz)并未受到谷歌、亚马逊或是其他任何网络巨头的启发,而是受到了在线协作平台Lotus Notes的启发,这个平台最初是在二十世纪七十年代和八十年代开发的。 虽然 Lotus Notes以身为一个电子邮件系统而闻名于世,但事实上它并非只是个电邮系统,同时还是构建依赖于数据库的应用的基础——换句话说,是有组织的信息集合。 通过使用Lotus Notes这个平台,企业能构建从开支申报应用到IT帮助桌面工具等所有东西。卡茨就是构建这种应用的人之一,他从1995年开始就为Lotus开发 Notes应用。他表示,即使是在那时,这个平台也已经展示出一些特性,而正是这些特性让今天的NoSQL数据库取得了如此之大的成功。 正 如其他NoSQL后继者一样,Lotus Notes也同样来自于关系数据库的“领地”。关系数据库是建立在关系数据库模型基础上的传统数据库,借助于集合代数等概念和方法来处理数据库中的数据。 “那是一个复杂的系统,能通过关系数据库让原本难以做到的事情变得简单。”卡茨说道。 从 很多方面来说,卡茨的故事都有助于帮助解释NoSQL运动的兴起——以及为何这种数据库与以往的数据库存在如此巨大的差异。虽然这场运动毫无疑问是取得了 成功,但NoSQL数据库的概念仍旧很难确定下来——“NoSQL意味着如此之多且各有不同的事情,要看你正在讨论什么而定。”谷歌杰出工程师安德鲁?菲 克斯(Andrew Fikes)最近曾这样对我们说道——在整个科技行业中,还有很多人尚未把握到这些新数据库的重要性。 “NoSQL” 其实该算是用词不当,因为NoSQL数据库并不是为了摒弃SQL(Structured Query Language,结构化查询语言,这是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统,同时也是数据库脚本文件的扩展 名);更好的名称本来应该是“non-relational database”(非关系型数据库)。NoSQL数据库不使用为关系数据库提供支撑的整齐数据图表。 NoSQL数据库拥有两种基本特性:首先,这种数据库能在许多服务器之间延展——允许用户在必要时候扩大运算,甚至是在不同的地理位置之间也可以——其次,这种数据库能给用户带来按自己喜欢的方式架构数据的自由度,正是这第二个特性与Lotus Notes非常相似。 柏拉图式的理想 Notes 平台是受PLATO Notes的启发而创造出来的,后者是一个在伊利诺斯大学PLATO主机上运行的在线社区。PLATO Notes的创造者大卫?伍利(David R. Woolley)曾在1994年写道,这个项目始于1973年,当时还只是一个简单的报错系统。在最开始的时候,人们通过编辑一个文本文件的方式来报错, 但这种方式带来了一些问题。 “那样做根本没有安全性可言,想要确切地知道是谁写了一份报错文件是不可能做到的。”伍利说道。“大多数人都会报错时签上名字或至少是名字的首字母缩写,但没有什么东西能强制他们这样去做。有些时候,会有爱开玩笑的人觉得,删除整个文件是件很有意思的事情。” 因 此,当时年仅17岁的伍利就被分配到了一项任务,那就是创造一个更具结构性的系统来报错。他开发出来的工具允许用户将其报错报告输入到一个应用中去,该应 用会把报告保存为文本文件,并加上用户的姓名和提交日期。然后,支持部门的员工能分屏显示和查看这些文件,就像我们今天的电子邮件客户端一样:报错报告列 表在上面,报告文本在底下。 随后,所有这些信息会被保存为一个大的文本文件,而不是关系数据库。今天,我们将其称为“文件数据库”(document database)。 你可以把一个关系数据库看作一个庞大的电子表格,数据以图表、行和列的方式组织起来。如果你想要增加一个域,那么就新增一列,这一列会在表格的每一行中出现,从而让你的数据变得结构化和统一化,但管理许多无结构性的数据或是以多种方式构建结构的数据则要困难一些。 文件数据库更像是文件的集合,每一个“入口”都是一个文件,而且都能拥有自己的结构。如果你想要对一个“入口”添加一个域,那么这样做的同时不会对其他任何“入口”造成影响。 不久以后,PLATO开发者就添加了更多的Notes应用。到二十世纪七十年代末,他们拥有了一个电子邮件应用,一个一般用途留言板,以及网络游戏等,诸如此类。 在 1984年,雷?奥兹(Ray Ozzie)——一名Lotus开发者,在伊利诺斯大学上学时曾在PLATO工作过——离开了Louts,自己开创了一家名为Iris Associates的公司。随后,Lotus对这家公司进行了投资,双方签署了一项协议,内容是Lotus将拥有使用Iris旗舰产品的独家权利:一个 基于PLATO的企业用系统。 时至今日,许多人都认为Lotus Notes是一个过时的系统,应该像WordPerfect和Novell Netware那样被扔进同一个垃圾桶。但是,Notes为它之后的几乎所有类型的企业通信和协作应用铺平了道路,从微软Outlook电子邮件客户端到Jive Software等社交网络工具再到CouchDB数据库都是如此。 卡茨与CouchDB 1995年时,卡茨以夏季实习生的身份加入Lotus;大约就在同一时间,Lotus被IBM收购。卡茨在Lotus Notes顾问部门工作了一段时间,然后又回到这家公司,加入了Iris团队,当时Iris已被Lotus正式收购。 在 Iris,卡茨对Lotus Notes的精髓作出了改进。他重写了为Formula提供支持的引擎,这是用来开发Notes应用的脚本语言。卡茨表示,当时他远不能胜任这项工作,但 他同时认为自己天生就是要写代码的人。“每完成一个@function,我就跟打了一针毒 品似的;我就像是个瘾君子,在不停地寻找下一个需要修补的地 方。”他后来在自己的博客中这样写道。 卡茨在2005年离开Lotus,加盟了一家名 为Koobie的创业公司;但在不久以后,他就启动了一项事业,目标是将Lotus Notes的思潮带入现代社会,这最终演变成了CouchDB。卡茨曾在一篇早期的博客中谈到这个项目,当时他写道:“Couch就是为网络而从头开始构 建的Lotus Notes。” 最初版本的CouchDB使用一种类似于 Formula的编程语言,但不久以后卡茨就带领这个项目走向了新的方向,从平台转变成了一个专用的数据库。“MySQL是其人气度达到顶峰的产物。”卡 茨说道。“当时如果你告诉人们说,你在开发某种类似于Lotus Notes的东西,那么就会让他们发出惊叹的声音。” 在 这条发展的道路上也存在不少坎坷。在2007年初,卡茨到了Sun Microsystems的MySQL团队工作,放弃了构建CouchDB的工作。但是,这个开源项目吸引了其他的开发者坚持不懈地为之努力,其中著名的 有詹?雷纳德(Jan Lehnardt)和诺亚?斯莱特(Noah Slater)等。斯莱特推出了JSON,在当时以文本文件来对数据进行结构化的新格式。在Sun休陪产假时,卡茨最后替换了整个CouchDB存储引 擎,用XML取代了JSON。在那时,卡茨认识到与使用Formula式的引擎相比,使用网络应用标准语言JavaScript可能是一种更好的想法。 “一旦我们推出JavaScript以后,”他说道,“这个项目就真正腾飞了起来。” Couch的商业化 在 2007年,“复活”后的CouchDB受到了IBM的关注。不久以后,卡茨的名字回到了这家公司的工资单上,负责全职开发CouchDB。最为关键的 是,IBM同意将这个项目捐给非营利组织Apache基金会(Apache Foundation),这意味着IBM还不得不向开发者和CouchDB用户授权使用该公司的相关专利。这也就是说,IBM将无法起诉CouchDB侵 犯了与Lotus Notes相关的专利。 与此同时,NoSQL运动则全速展开。谷歌和亚马逊的论文令这种模式——此前已经有开源开发者倡导这种模式——变得流行起来,同时也为如何让其在现实世界中运作起来提供了某种深刻的理解。 一 家名为10gen的公司从2007年开始致力于开发一个名为MongoDB的NoSQL文件数据库,用BigTable作为参照模式。“那是完全独立 的,MongoDB、Couch和Lotus Notes两两之间没有太多的平行之处。”10gen创始人德怀特?梅里曼(Dwight Merriman)说道。一年以后,Facebook开放了Cassandra的源码,那是一个NoSQL数据库,整合了来自于Dynamo和 BigTable的概念。到2009年,随着CouchDB、Cassandra、MongoDB及其他NoSQL数据库加速发展,科技博客 ReadWriteWeb提出了一个问题,那就是关系型数据库是否已注定灭亡。 与此同时,当时供职于Last.fm的约翰?奥斯卡森(Johan Oskarsson)主持召开了首次NoSQL会议,无意中给这场原本定义松散的运动起了一个名字。 在 形势一片大好的大肆宣传浪潮中,卡茨、雷纳德和克里斯?安德森(J. Chris Anderson)创立了Couch.io,来对CouchDB进行商业化。到这个时候,一个由麻省理工学院物理学家组成的团队已经开创了一家名为 Cloudant的CouchDB公司,致力于开发自己版本的数据库,这个数据库名为BigCouch。虽然Couch.io(后来更名为 CouchOne)难以在现实世界中找到自己的位置,但很快就通过与另一家NoSQL公司Membase合并的方式找到了自己的立足点。 Membase 需要一名新的首席技术官,而CouchOne则需要一名首席执行官;Couch需要一种更好的方式来将规模扩大至大量的服务器,而这正是Membase所 能提供的;Membase需要一种更好的数据结构,而CouchDB能提供这种结构;很可能最重要的是,Membase拥有被卡茨认为是能够持续运营的商 业模式。在合并以后,新公司和新的数据库都被命名为Couchbase。 但是,此次合 并交易所带来的一个麻烦的结果是与Apache基金会的关系破裂。“我们真的曾付出过很多努力来让这种变化同步发生。”卡茨说道。“但到最后的结果是,与 Apache项目所能达到的前进速度相比,我们需要的速度要快得多。”最终的结局是,卡茨决定放弃他自己创立的项目,全心致力于Couchbase的发 展。在2012年1月份,也就是合并交易完成的一年以后,他在自己的博客上发表了一封措辞强硬的“告别信”,写道:“CouchDB的未来是什么?那就是 Couchbase。” 斯莱特此时已经成为Apache的CouchDB项目负责人,他用一条简短的Twitter消息对此作出了回应:“CouchDB的未来还是CouchDB。” 卡 茨承认,他原本可以处理得更加老练一些,但说到最后,这个故事证明了NoSQL已经变得多么活力四射。开发者仍在顽强地致力于开发CouchDB,哪怕没 有卡茨的参与也还是坚持不懈。Cloudant也仍旧致力于开发CouchDB,承诺将把BigCouch的代码还给这个项目。 Couchbase也正处在发布2.0版本数据库的边缘,此前该公司已经争取到了NTT DoCoMo和AOL等大客户。文件数据库的想法在开发者的脑海中已经生根,这不仅要感谢CouchDB及其诸多分支,同时也要感谢MongoDB所带来的人气。 与此同时,IBM则将放弃Lotus这个品牌名;Notes则将继续生存下去,至少现在是这样。在它的背后可能是最好的年华,但它为未来更多的美好时光搭好了舞台。 附:数据库大事年表
- 1961年:通用电气着手开发Integrated Data Store(IDS,集成数据存储)。通常来讲,IDS被认为是第一个“完全的”数据库。在今天的NoSQL数据库出现的数十年以前,IDS所做的就是如今NoSQL和大数据的工作。
- 1967:IBM 开发出Information Control System and Data Language/Interface(ICS/DL/I,信息控制系统与数据语言/界面),这是阿波罗(Apollo)项目的分级数据库。ICS随后变 成了Information Management System(IMS,信息管理系统),与IBM的System360主机整合到一起。
- 1970年:IBM研究员埃德加?科德(Edgar Codd)发表题为《大型共享数据库的关系模型》(A Relational Model of Data for Large Shared Data Banks)论文,建立了关系型数据库所使用的数学基础。
- 1973年:大卫?伍利(David R. Woolley)开发出了PLATO Notes,用一个文本文件作为报错系统的数据存储方式。PLATO Notes对随后Lotus Notes的出现形成了影响。
- 1974 年:IBM着手开发System R,将科德的关系型数据库模型变成了现实,首次使用了SQL(结构化查询语言),随后这个系统演变成了商业化产品IBM DB2。在科德研究的启发下,伯克利大学的学生迈克尔?斯通布雷克(Michael Stonebraker)和尤金?王(Eugene Wong)开始开发INGRES,它随后成为了PostGreSQL、Sybase及其他许多关系型数据库的基础。
- 1979年:第一个公开可用版本的Oracle数据库发布。
- 1984年:雷?奥兹(Ray Ozzie)成立Iris Associates,创造了一个受PLATO Notes启发的组合件系统。
- 1988年:由文件数据库提供支持的Lotus Agenda发布。
- 1989年:Lotus Notes发布。
- 1990年:Objectivity发布了期间对象数据库。
- 1991年:Key-value类型数据库Berkeley DB发布。
- 2003年:Live Journal开放最初版本Memcached的源码。
- 2005年:达米安?卡茨(Damien Katz)开放CouchDB源码。
- 2006年:Google发表BigTable论文。
- 2007年:亚马逊发表Dynamo论文。10gen开始编制MongoDB代码。Powerset开放BigTable clone克隆版Hbase的源码。
- 2008年:Facebook开放Cassandra源码。
- 2009年:科技博客ReadWriteWeb提出一个问题:“关系型数据库是否已注定灭亡?” Redis发布。首次NoSQL会议在旧金山召开。
- 2010年:Memcached项目的一些负责人与社交游戏公司Zynga开放Membase源码。