云計算推波助瀾 非關(guān)系數(shù)據(jù)庫蓄勢待發(fā)
前面為大家介紹了淺談云計算的發(fā)展之路,下面為大家介紹“云計算推波助瀾 非關(guān)系數(shù)據(jù)庫蓄勢待發(fā)”的態(tài)勢。
在過去的日子,當(dāng)你有數(shù)據(jù)需要存儲管理的時候,辦法很簡單:安裝一個正式的數(shù)據(jù)庫,將需要存儲的數(shù)據(jù)錄入進去,讓系統(tǒng)幫你進行分類管理,而你只需要花時間去選擇哪家數(shù)據(jù)庫提供商?,F(xiàn)在事情并非如此,一些新興數(shù)據(jù)庫工具開始泛濫,賦予了“數(shù)據(jù)庫”這幾個字眼更多的含義,打破了傳統(tǒng)數(shù)據(jù)庫關(guān)系模型。有經(jīng)驗的數(shù)據(jù)庫管理員稱之為“玩具”,認為它們有很嚴重的威脅,而這些威脅就是來自這些新興的數(shù)據(jù)庫。一些傲慢的家伙為新興數(shù)據(jù)庫很好用,速度很快,滿足他們手頭的需求,置威脅于不顧。
非關(guān)系型數(shù)據(jù)庫正在吸引人們的注意,因為它們可以忽略許多的規(guī)則,而這些規(guī)則正是經(jīng)驗豐富的數(shù)據(jù)庫管理員積累的深刻教訓(xùn)。問題是現(xiàn)在這些規(guī)則的條條款款已成為一種束縛,使得很難創(chuàng)建一個真正強大的、讓多臺計算機一起運行的數(shù)據(jù)庫系統(tǒng)。因為所有的Web應(yīng)用程序設(shè)計者都夢想構(gòu)建一個多機運行的應(yīng)用程序,保存所有用戶的所有數(shù)據(jù),要想做到這些,有些老的規(guī)則需要避開,甚至是打破。
首當(dāng)其沖的事情就是摒棄舊的JOIN操作。大學(xué)生曾經(jīng)嚴格的按照課后作業(yè)的要求,如何標準化數(shù)據(jù),將一個表格劃分為許多的部分。那個時候磁盤非常貴,數(shù)據(jù)標準化工作顯得額外重要。問題當(dāng)數(shù)據(jù)分散在不同機器上的時候,JOIN操作真的使得速度變得很慢?,F(xiàn)在磁盤空間非常便宜,許多數(shù)據(jù)模型并沒有從數(shù)據(jù)標準化中受益,因此JOIN操作很容易就被摒棄。
立即一致性和最終一致性的差別依賴數(shù)據(jù)的重要性來定。那些聽到這些新興數(shù)據(jù)庫就要拿心臟病藥的保守者通常是銀行的程序員,它們希望確保每天結(jié)束后收支相等。畢竟銀行的領(lǐng)導(dǎo)不能忍受由于失敗的數(shù)據(jù)庫事務(wù)而導(dǎo)致帳目出錯。
但是許多現(xiàn)代的Web站點不會因為某個事務(wù)失效而不能運行的。我看見Facebook經(jīng)常有小故障。不會因為某些評論數(shù)據(jù)丟失了就不能運行了。這些網(wǎng)站不會像銀行那樣苛刻關(guān)注帳目清算,它們不需要關(guān)系數(shù)據(jù)庫所有的功能。(一些人開玩笑說銀行應(yīng)該把購買Oracle許可證的錢拿出來成立一個基金,賠償那些因為失敗的事務(wù)操作導(dǎo)致錢丟失的人們。)
為了更好地理解這些非關(guān)系型數(shù)據(jù)庫的擴展層,我撿了幾個進行測試,構(gòu)建了幾個測試應(yīng)用程序。發(fā)現(xiàn)它們主要的命令操作不會超過這三個:插入、更新、刪除。有一些提供群集,有一些只能提供某種服務(wù),有一些夸大其詞說接管整個服務(wù)器棧,有一些比其它的數(shù)據(jù)庫提供更好的AJAX工具。但是,他們中沒有一個合適,它們都不能供銀行來使用。
文中我沒有介紹其它幾個有趣的數(shù)據(jù)庫,一是由于本文篇幅限制,二是因為它們和我以下提到的幾個沒有多大的區(qū)別。舉個例子,Sun公司正在構(gòu)建一個關(guān)系型數(shù)據(jù)庫,稱之為Derby,用Java虛擬機一起使用。Oracle也有它自己的嵌入式數(shù)據(jù)庫,叫做Berkeley DB,但是現(xiàn)在稱之為Oracle Embedded Database。有些程序員甚至創(chuàng)建了低費用的程序庫,將對象直接寫入到磁盤中。這些產(chǎn)品也延伸了“數(shù)據(jù)庫”這幾個字眼的含義,但是我不準備在這里陳述它們。
Amazon SimpleDB數(shù)據(jù)庫
SimpleDB是Amazon推進云計算服務(wù)計劃中最為高級和最似云技術(shù)的組件之一。一旦你簽約雇傭Amazon的服務(wù),獲得通行密碼,你就能將包含鍵值的Web Service XML文件裝載到SimpleDB中去,只要你持續(xù)支付費用,它將一直為你存儲這些數(shù)據(jù)。你不需要考慮安裝任何應(yīng)用程序或者備份什么。Amazon在它的Web service墻后已經(jīng)為你隱藏了所有這些工作。
SimpleDB是兩級分層結(jié)構(gòu)。最上面的一級是"domain",第二級是"item"。在你選擇domain 和item 名之后,你就寫入了鍵值。SimpleDB相對來說有豐富的API,擁有對數(shù)據(jù)排序能力,甚至具備計算出匹配查詢結(jié)果的item數(shù)目的能力。你甚至能寫查詢語句,可以查詢那些不從某個特定字符串開始的值。這或許和我們使用的SQL和Oracle數(shù)據(jù)有很大的區(qū)別,但是這些低租金的數(shù)據(jù)庫也有自身的缺點,甚至不能對結(jié)果集進行排序。
SimpleDB設(shè)計初衷是和Amazon的Simple Storage Service (S3)一起使用的,但是每對鍵值的大小限制在1024字節(jié)。這對于很多的字符串來說,已經(jīng)足夠了,但是對于許多的內(nèi)容引擎是不夠的。因此你在S3中存儲的是數(shù)據(jù)的指針。
現(xiàn)在使用類似JOIN這樣的操作還有一些限制,需要多種調(diào)用。每個查詢只能運行5秒鐘。結(jié)果僅能保持250個item。每個item僅有250對。還有許多的常見操作有限制,有人開始思考SimpleDB是給我們的生活帶來了便捷或是麻煩。
Amazon開始重寫API,企圖得到更多更好的認證。到2009年9月,整個SSL都會運行call,提供安全和認證。Amazon也增加了安全機制,使用更多的復(fù)雜的哈希算法來將更多的請求打包。這些僅僅是Amazon取得的小的改進。
該公司也創(chuàng)建了更多的程序庫,讓服務(wù)的使用更加簡單。這里有許多的軟件包和主流以及一些少見的語言結(jié)合使用。文檔相當(dāng)廣泛,很容易找到。通常你可以很快啟動你的工作,開始存儲數(shù)據(jù)所用的時間也縮短了。
現(xiàn)在價格也很合適。Amazon最近將存儲的價格從1.5美元降到25美分每G字節(jié)。公司將收費透明化,目的是激勵用戶來計劃他們的消費預(yù)算。
Amazon有一套先進的條款來處理使用期限問題。有許多的條款來處理你可能遇到的問題,有一些吸引了我的注意力。舉個例子,Amazon申明,“我們可能刪除最近6個月存在SimpleDB中卻沒有訪問的內(nèi)容,但是不用負任何責(zé)任。”這對于只是為了給系統(tǒng)做測試的人來說很容易接受。從措辭來看,Amazon此舉的目地就是為了保持它的數(shù)據(jù)中心良好運行。
還有其他的一些問題。舉個例子,使用期限條款包括一長列禁止數(shù)據(jù),如“助長非法活動”,帶有“種族、性別、宗教、國籍、殘疾、性取向、年齡”歧視的數(shù)據(jù)都是禁止的。這存在一個問題。想像一下如果為某個教堂開展反男同性戀婚姻運行了一個網(wǎng)站。這聽起來你確實有性取向歧視。但是,如果你是開展男同性戀婚姻的宣傳活動,反對這些教堂的呢,這個時候還能說你是在歧視這些基本的宗教信仰嗎?
我對那些正在分析處理這些抱怨的律師感到遺憾,但是至少他們可以高枕無憂了,因為他們知道這些數(shù)據(jù)可以以任何理由或者是沒有理由的刪除掉。如果你僅使用免費的服務(wù),Amazon不會給你任何通知,就會刪除你的數(shù)據(jù),但是你如果是付費用戶,就承諾有60天的提醒通知,在期限內(nèi)你就能將你的數(shù)據(jù)處理好。
Google App Engine
Google App Engine本質(zhì)上不是一個數(shù)據(jù)庫。他是一種云技術(shù),用于分布式Python應(yīng)用程序,它是和自己隱藏在內(nèi)部某個地方的數(shù)據(jù)庫一起工作的。不首先通過應(yīng)用程序?qū)觼碓L問數(shù)據(jù)庫是不可能的。但是封裝一個數(shù)據(jù)庫命令和格式化請求數(shù)據(jù)并不困難,因此我們可以認為App Engine是一個數(shù)據(jù)庫,只不過這個數(shù)據(jù)庫附加了一個以Python語言寫的嵌入程序。
這種額外定制的層非常有用。許多關(guān)于其它“玩具”數(shù)據(jù)庫的抱怨圍繞在某個缺少的操作導(dǎo)致不能找到正確的結(jié)果。如果你想給這里的數(shù)據(jù)庫增加一些功能,你能夠用Python語言自己開發(fā)出來。如果你想要有JOIN操作,你能自己用Python語言寫,也能同時定制內(nèi)存緩存器。這對于那些讓用戶存儲他們自己數(shù)據(jù)的Web應(yīng)用程序特別有用。如果你需要增加安全控制權(quán)限,限制每個用戶看到自己應(yīng)該看到的內(nèi)容,你也可以用Python語言實現(xiàn)。
App Engine數(shù)據(jù)存儲比Amazon的SimpleDB更具結(jié)構(gòu)結(jié)構(gòu)性,它的結(jié)構(gòu)性很大一部分來自Python的對象模型。你存儲的不是成對的鍵值,而是Python對象,這些對象被定義成非常類似于SQL模式。你能為每列設(shè)置數(shù)據(jù)類型,在你需要的列之間進行索引。事務(wù)機制也深深的和Python聯(lián)系在一起,因為每個事務(wù)實際上就是一個Python函數(shù)。這么說有一些過分簡單化,因為對這個Python函數(shù)還是有一系列的限制的(如每個數(shù)據(jù)項只能更新一次)。好的消息是Google數(shù)據(jù)項正在創(chuàng)建特殊的事務(wù)方法,對一些普通行為(如“創(chuàng)建”或者“更新”一行)進行抽象。
檢索有意做成類似于SQL查詢,實際上,Google提供它自己的類SQL語言,GQL。使用的時候,GQL被解析成查詢語句。App Engine還有一套基于Python的方法集,方法集合拴在一起處理數(shù)據(jù)集合和查詢。你不需要浪費分析查詢周期。
值得一提的是Python棧包括了一些最好的數(shù)據(jù)庫也不具備的功能特性。有一個程序庫來操作圖像文件,通過剪切和Goolge特有的“I feel lucky”功能對圖片進行修補。你也可以將數(shù)據(jù)存儲為Goolge文檔,電子表格和日程數(shù)據(jù)項。起初App Engine看起來僅僅像是一個數(shù)據(jù)庫,但是你也能容易的在Google棧里進行數(shù)據(jù)抽取。
直到幾周前,App Engine還在測試階段,使用它是免費的。只要你的使用空間大小在基本的限額之內(nèi),它仍舊是免費的。另外,Google的收費機制和Amazon極為相似。存儲的價格比Amazon的更便宜(每月每G字節(jié)12美分),帶寬的收費是相同的(10美分沒G字節(jié))。
Google的使用期限責(zé)任制與Amazon的不同。你需要制定一個個人隱私策略,保護你用戶的數(shù)據(jù)。如果你的用戶違反了版權(quán)規(guī)定,你必須反應(yīng)給DMCA(千禧年數(shù)字版權(quán)法),你不這么做的話,Google將會為你這么做。Google保留在任何時間以任何理由刪除內(nèi)容的權(quán)利。“你同意Google刪除、丟失任何存儲內(nèi)容和服務(wù)試用期傳送內(nèi)容、保持的通信而不負任何責(zé)任。”
這些條款越來越受到關(guān)注?,F(xiàn)在Google承諾在決定注銷賬戶前預(yù)留90天的時間讓你將數(shù)據(jù)從服務(wù)器取走。其它受關(guān)注的條款在DMCA的問題上,這使得許多人都不解。
存在這么一個問題,如果你決定離開Google或者說Google讓你離開時該怎么辦。Google發(fā)布了一個不錯的開發(fā)工具,讓你輕松在本地機器上測試你的應(yīng)用程序。使用這些工具在你機器上測試是沒有技術(shù)問題的,除非你沒有支持類云技術(shù)的功能。包括測試在內(nèi)的數(shù)據(jù)存儲自身是不會自動復(fù)制自己的,但是在自己本地機器上卻能實現(xiàn)其它的功能。像以前一樣,有一些法律問題,因為“許可證的唯一目的就是讓你使用和享受提供服務(wù)的好處。”
Apache CouchDB數(shù)據(jù)庫
毫無疑問我們需要使用云技術(shù)來享受這些新的服務(wù)。CouchDB是眾多開源項目中的一個,該項目構(gòu)建了一個用于存儲key-value pairs的數(shù)據(jù)庫。這個項目使用Erlang語言編寫的,受Apache 軟件基金支持。你可以下載源文件在任何機器上安裝,然后編譯運行它們。使用它是沒有費用的,除了你需要花錢購置服務(wù)器。
CouchDB與Amazon的工具是相似的,但是它有一些特別之處。你仍舊以行的形式來存儲key-value pairs,但是這些key-value pairs可以是任何標準的JSON(JavaScript Object Notation)數(shù)據(jù)類型,如布爾和數(shù)字類型。值的范圍不局限于1024字節(jié)長度的字符串,有辦法可以讓其存儲長數(shù)值,甚至是圖形。所有的請求和響應(yīng)格式化為JavaScript。沒有基于XML的Web Services,只有JSON.
最大的不同在于寫查詢語句。CouchDB可以通過JavaScript單獨寫map functions和reduce functions。一個簡單的查詢或許僅僅就是一個map function,帶有一個“If”子句來測試數(shù)據(jù)比某個數(shù)值大還是小。只有在你試圖計算統(tǒng)計由map functions查詢的數(shù)據(jù)時才會用到reduce functions。發(fā)現(xiàn)計算行的個數(shù)很容易辦到,但是也有可能丟失了一些其它很酷的特性,因為map function只能由JavaScript來寫。我除了發(fā)現(xiàn)計算出匹配的數(shù)目,至于其他的非學(xué)術(shù)的用途我還沒有弄清楚。文檔包括了一個給人印象很深刻的reduction function,用來歸并統(tǒng)計的,但是我不知道CouchDB真的是否是處理這類事情的正確工具,如果你需要更復(fù)雜的統(tǒng)計,妥當(dāng)?shù)木褪菆猿质褂脗鹘y(tǒng)的數(shù)據(jù)庫,獲得統(tǒng)計報表。
這個項目還有一些限制的。項目的首頁稱之為“一種分布式,容錯,自由面向文檔模式的數(shù)據(jù)庫,”沒有一些人工干預(yù)你是不會獲得分布式和容錯功能的。CouchDB有一個好看的AJAX用戶界面,包含了一個form表單,能讓你復(fù)制數(shù)據(jù)庫。但是還不是自動的。
CouchDB計劃會增加存取控制和安全模式,但是沒有以文檔的形式展示出來,在API中也沒顯示。他們設(shè)計的初衷就是使用純JavaScript,取代SQL,或者其他的語言,這是一個好的主意,你不會獲得或者失去權(quán)限閱讀文檔,你能寫JavaScript函數(shù)來返回true或者false結(jié)果。
使用純JavaScript也并非壞事。當(dāng)我使用這些數(shù)據(jù)庫的時候,我很快發(fā)現(xiàn)有人能夠在客戶端開發(fā)一個安全模型層,使用一些不錯的加密技術(shù)。在客戶端加強安全控制,就能減少服務(wù)器端的工作,我在《半透明數(shù)據(jù)庫》一文中有一些介紹。
這個特點正在驅(qū)使一些極端用戶使用CouchDB作為整個服務(wù)器棧。J. Chris Anderson,項目的委托人之一,寫了一篇文章,證明CouchDB是一個應(yīng)用程序服務(wù)器的全部所需。用于顯示和與數(shù)據(jù)交互的業(yè)務(wù)邏輯是用JavaScript編寫的,從CouchDB下載后是一個JSON數(shù)據(jù)包。
在Anderson的眼里,當(dāng)所有的功能都能用JavaScript實現(xiàn),在服務(wù)器上使用Ruby、Python、Java、 PHP沒有什么大的意義。這種看法或許有些極端,因為總會遇到一些情況,客戶機器不能保證能正確的實現(xiàn)一些功能,客戶端的客戶比我們知道的東西少。像CouchDB這種輕量級的工具使得人們開始考慮完成一項工作真正需要多少代碼。
Persevere數(shù)據(jù)庫
初一看,Persevere數(shù)據(jù)庫像其它大多數(shù)數(shù)據(jù)庫一樣。將鍵值對錄入進去,它就將其存儲起來。但是,這只是一個開頭。Persevere提供了完善的對象分級結(jié)構(gòu),使得用戶可以給數(shù)據(jù)庫增加更多的結(jié)構(gòu),提供比上一代傳統(tǒng)數(shù)據(jù)庫更多的form。Persevere更多的表現(xiàn)出是一種JavaScript對象的后端存儲設(shè)備,JavaScript對象由像Dojo這樣的AJAX工具包創(chuàng)建。
Persevere引以為自豪的是它的“schema-free”,這一特點使得它與其它數(shù)據(jù)庫有很大的區(qū)別。Persevere可以讓你隨心所欲的增加schema。Persevere并非把分級結(jié)構(gòu)的頂層稱為一個domain(SimpleDB這么稱呼),也不稱之為文檔(CouchDB這么稱呼),Persevere稱之為對象,它甚至可以讓你創(chuàng)建對象的子類。如果你想違背規(guī)則,你也能堅持某些字段使用某一類型,但是這是不推薦的。Schema規(guī)則是可選的。
由于Persevere與Dojo連接緊密,Persevere提供了大量的連通性。你可以創(chuàng)建網(wǎng)格,樹形窗口小部件,接著將其直接鏈接到JsonRestStore,窗口小部件讓你編輯數(shù)據(jù)。 你可以通過20行的JavaScript代碼就能遠程訪問一個數(shù)據(jù)庫。
我遇到過許多的小的誤操作,這些誤操作可能是由于我缺乏經(jīng)驗導(dǎo)致,而不是潛在的Bug。當(dāng)我準確的弄清楚如何做的時候,一些操作就會正確啟動。Persevere本身并不是特別需要掌握,但是AJAX框架是你直接面對的。來自Dojo的文檔比大多數(shù)AJAX框架要好,但是你得花一些時間來學(xué)習(xí)Dojo,才能掌握隱藏在Persevere表面后的潛在復(fù)雜性問題。
云技術(shù)和群集
嘗試了這些數(shù)據(jù)庫之后,我能明白為什么有人會一直稱它們?yōu)?ldquo;玩具”。它們功能有限,即便有新的功能,但是這些新的功能會約束你的選擇。許多次我意識到SQL世界的標準功能讓生活更加簡單。許多基于標準SQL的工具,如報表引擎,不能連接這些新興的數(shù)據(jù)庫。使用MySQL或者Oracle這些數(shù)據(jù)庫能夠完成許多重大的功能。
但是,這不代表將來在我的項目中我不去使用這些新興的數(shù)據(jù)庫。它們是固態(tài)數(shù)據(jù)存儲,與AJAX集成得如此緊密,使得開發(fā)更加容易。另外,多數(shù)Web站點不需要MySQL或者Oracle的所有功能,JOIN-free模式對許多普通數(shù)據(jù)結(jié)構(gòu)仍舊非常有用,包括一對多關(guān),一對一關(guān)系型數(shù)據(jù),甚至多對一關(guān)系。
另一個問題是是否使用云技術(shù)或者構(gòu)建你自己的群集。Google和Amzon都提供多機服務(wù)承諾,CouchDB和Persevere是不能匹敵的。Persevere團隊聲稱在將來將會擴展。但是很難預(yù)料Amazon和Google的承諾有多好。如果Amazon和Google丟失了一個硬盤怎么辦?如果它們丟失了一個機架怎么辦?他們還沒有做出很清晰的承諾和使用期限所負的責(zé)任。
舉個例子,Amazon的條款重復(fù)聲明了很多次:“我們對于為授權(quán)的訪問、改變、刪除、損害、丟失任何你的內(nèi)容、應(yīng)用程序,或者你提交的數(shù)據(jù)、服務(wù)帳號都不負責(zé)任。”
我不是說在責(zé)備Amazon或者是Google,因為誰都不知道誰應(yīng)該對丟失的事務(wù)負最終的責(zé)任。有可能是任何一個程序員,實際上也很難判斷誰破壞的。但是,我們知道更多信息會更好。SimpleDB中的數(shù)據(jù)是存儲在RAID磁盤中嗎?當(dāng)同一地區(qū)發(fā)生地震,颶風(fēng)或者火災(zāi)時別的地區(qū)另外的備份嗎?在線備份社區(qū)正準備開始提供這類服務(wù)的細節(jié)了,但是云技術(shù)還沒有計劃這樣做。
所有這些顧慮讓我們清楚的認識到他們?nèi)耘f是玩具數(shù)據(jù)庫,打破了傳統(tǒng)數(shù)據(jù)庫的規(guī)則,對那些可以忍受數(shù)據(jù)丟失的應(yīng)用程序是合適的。它們很有趣,有快,在價格方面也很合適,你的注意力可以不用放在選擇數(shù)據(jù)庫提供商,而是放在如何解決沒有JOIN操作怎么辦的問題上。
這就是我要為大家介紹的全部內(nèi)容,希望大家從中有所收獲。
【編輯推薦】