CouchDB的創造者達米安·卡茨(騰訊科技配圖)
騰訊科技訊(童雲)北京時間12月6日消息,《連線》雜誌網絡版近日刊載文章,對NoSQL(非關係型資料庫)的來源與歷史進行了追溯。文章主要介紹了最古老的NoSQL資料庫之一CouchDB,這種資料庫的創造者達米安·卡茨受到了在線協作平臺Lotus Notes的啟發,他的故事有助於幫助解釋NoSQL運動的興起,及為何這種資料庫與以往的資料庫存在如此巨大的差異。
以下是這篇文章的全文:
在追溯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源碼。