2 NoSQL潮流web
好比,列存儲Hypertable遵循Google的Bigtable方法,贊成本地搜索引擎Zvent儲存天天十億數據單元[Jud09]。再舉一個樣例,Google天天能夠處理20PB存儲在Bigtable的數據。經過它的MapReduce方法[Com09b]。數據庫
尤爲是對Web 2.0公司,可擴展性方面的考慮對他們的業務相當重要,就像Last.fm的Johan Oskarsson指出:「Web 2.0公司可以抓住機會,他們需要可擴展性。當你將這二者組合,會使NoSQL很引人注目。編程
」(Johan Oskarsson。Last.fm的meetup組織者和web開發。參見[Com09a])。後端
博主Nati Shalom容許:「成本壓力也迫使不少組織尋找更具成本效益的替代品,研究代表。基於商用硬件的分佈式存儲可以比不少現有的高端數據庫更可靠」(參見[ Sha09a ]和進一步閱讀[ Sha09c ])。數組
他總結道:「所有的這些致使了一個高效成本的'擴展第一數據庫’的需求」。緩存
這對具備低複雜度的數據結構的應用特別重要。因其很是難從關係數據庫的特性中受益。安全
Dare Obasanjo聲稱「所有你真的需要[做爲一個Web開發者]是支持某種程度的查詢功能並具備良好的持久性語義的鍵-值或元組存儲。」([Oba09a])。博主和數據庫分析師Curt Monash也在這方面表示:「SQL是過程式代碼的一個尷尬的選擇,差點兒所有的代碼是過程式的。網絡
對用戶但願作重的、反覆操做的數據而言,映射數據到SQL的成本是值得的。數據結構
但當你的數據庫結構是很很的簡單,SQL可能不是故意的。多線程
」SpringSourceproject師Jon Travis容許:「關係型數據庫給你太多。他們強迫你扭曲你的對象數據以適合RDBMS。」(在[Com09a]引用)。
」
僅僅要你的業務和表現層可以有力地處理不一致數據,這並不真的很是重要。
很是明顯這不是理想的,並且最好沒有不論什麼數據損失、不一致或服務中斷,但是接受數據丟失或不一致(甚至僅僅是臨時的)做爲一種可能性,打破了迄今爲止關係數據庫世界最大的’障礙’,可以產生巨大的靈活性。
Shalom報道了2009夏天eBay的一次架構峯會。與會者一致容許。儘管一般狀況下,抽象被引入以試圖隱藏應用程序(如經過代理層將請求路由到特定的server)中分散和分區問題,「這個抽象沒法將應用與分區和分散的現實隔離。故障幅度在一個網絡內全然不一樣於一臺機器內的故障。
應用程序需要注意到延遲、分佈式故障等,使得它有足夠的信息來作出詳細的上下文相關的決定。系統是分佈式的事實滲透到這樣的抽象中。」([ Sha09b ])。所以他建議設計數據模型以適應分區環境,即便最初僅僅有一個集中式數據庫server。這樣的方法提供的優點是避免極晚且昂貴的應用代碼更改。
然而,更專業的解決方式會實用武之地,因爲一個「一刀切」的思想之前是並且現在仍是對於數據庫的錯誤認識。
這種雲數據存儲的一個樣例是Amazon的SimpleDB。一個無模式,基於Erlang的終於一致性的數據存儲,其特色是做爲一個實體的屬性值(EAV)。
它可以存儲大量items的集合,當中items是裝載由鍵值對組成的屬性集的hashtable([ Nor09 ])。
此外,隨着NoSQL數據存儲的發展Hoff得出結論:「看遠一點,很是明顯MySQL + memcached的時代正在過去。它將堅持一段時間。
舊技術很是少全然消失。
」([ Hof10c ])。
做爲樣例。他列舉了大站點和玩家走向非關係數據存儲包含LinkedIn、Amazon、Digg和Twitter。Hoff提到下面使用NoSQL解決方式的緣由,已在本文前面解釋:
NoSQL數據庫所以不提供或避免複雜的讀操做。
這種規模的網絡應用於是「需要一個可以以更本身主動化的方式來發展並高度可用的系統」(在[ hof10c ]引用)。
Amazon的James Hamilton容許這一聲明。對不少大型站點的可擴展性,從零開始是相當重要的。甚至比與傳統RDBMS相比缺乏部分特性的劣勢更重要:
所有這些服務的共同主題是。擴展比特性更重要。他們沒有可能執行在一個單獨的RDBMS上。」(參見[ Ham09 ]引用[ Sha09a ])
在上世紀60和70年代的數據庫被設計爲單一的大型高端機器。
與此相反,今天。不少大型(網絡)公司使用可能會故障的商用硬件。所以應用程序被設計來處理這種故障,被以爲是「操做的標準模式」。就像Amazon指出的(參見[ DHJ+07。205頁])。此外。關係數據庫適合的數據是剛性結構的關係。並贊成用一個複雜語言表示的動態查詢。Lehnhardt和Lang指出,今天。特別是在網絡領域。數據既不是嚴格的結構,也不需要動態查詢,大多數應用程序已經使用準備語句或存儲過程。所以。數據庫內提早定義查詢和動態賦值給變量是足夠的([ PLL09 ])。
他們質疑這樣的保持應用程序感知不到不論什麼分佈式的後果的方法,如在著名的八個分佈式計算的謬誤中描寫敘述的([ Gos07 ] ):
數據庫管理系統供應商(和研究界)應該開始用一張白紙爲明天的要求設計系統。而不是繼續爲昨天的需求推進代碼行和架構設計」。但Stonebraker等人怎樣得出這個結論?他們在關係型數據庫管理系統中發現什麼固有的缺陷?他們爲「全然重寫」提供什麼建議?
他們指出,「流行的RDBMS全部能追朔到20世紀70年代的System R」:IBM的DB2是一個System R的直系後代,微軟的SQL Server從Sybase System 5進化而來(還有一個System R的直系後代)。Oracle在其第一個版本號中實現了System R的用戶界面。於是,System R的架構已經被70年代的硬件特性影響了。那之後。處理器速度、內存和磁盤的大小有顯著添加,這些因素今天已經不像過去那樣限制程序。然而。硬盤和內存間的帶寬並不像CPU速度、內存和磁盤大小那樣添加得快。
Stonebraker等批評,硬件領域的發展沒有影響RDBMS的架構。尤爲是下面的System R的架構特色仍然在今天的RDBMS中可以找到:
這些新興市場的樣例包含「數據倉庫、文本管理和流處理」。「它們的需求與商業數據處理有很是大的不一樣」。在先前的文章([ Sc05 ])他們已經說明了RDBMS「會在一些應用領域被專業的架構超過一個數量級或不少其它,包含:
特別是他們的考慮反映過去幾十年的硬件發展,以及它怎樣能或應該改變RDBMS的架構以便從更快和更大的硬件中得到優勢。也給他們堅持的「全然重寫」以註解。
Stonebraker等人所以以爲OLTP市場在今天或在不久的未來是內存數據庫市場。
他們所以批評,「眼下RDBMS供應商用面向磁盤的解決方式處理主內存問題。總之。摩爾定律的30年已使OLTP應用程序的面向磁盤的體系結構變得過期」。
儘管有些關係數據庫在內存中執行(好比TimesTen。SolidDB)。但這些系統也從System R繼承了「包袱」——Stonebraker等人對基於磁盤的恢復日誌或動態鎖定的稱呼,這對這些系統的性能有負面影響。
爲了不在這樣一個單線程系統中長期執行的事務,要求應用程序將此類事務分解爲較小的事務。或——在分析的目的下——在爲該任務優化過的數據倉庫中執行這類事務。
他們指出,這些要求顯著影響了DBMS的架構,如在不影響執行事務的條件下數據傳輸的能力,這可能不能很是easy地加入到現有的RDBMS中。但可以在新系統的設計中考慮(像比較新的數據庫如Vertica)。
從新,他們概述了這一問題的歷史發展,從線下保存當災難發生時再恢復的日誌磁帶,到將日誌磁帶掛在遠程硬件上並提供災備服務。到今天很是廣泛的熱備份或多網站解決方式。Stonebraker等人把高可用性和內置的災難恢復做爲一個重要的功能。像他們提到的其餘設計問題同樣,在這些系統的架構和設計層面考慮。他們特別需要OLTP領域的DBMS具備:
今天偏偏相反。人員成本是一個IT公司的主要支出。他們特別批評說「RDBMS有大量複雜的
爲代替提供這類僅僅是爲了調整而尋找更好配置的特性,Stonebraker等人需要一個數據庫。沒有這種調整僅僅有「自個人一切」(自我恢復,自我維護,自我調節等)。
在HA/故障恢復系統上面它們可以全然省略。
假設事務的執行時間很是短,一個單線程執行模型可以消除這種閉鎖與多線程數據結構的開銷,僅僅會「在性能上有小損失」。
所以,大綱是一個1-n關係的樹」。
有此屬性的大綱。特別easy在一個網格上的節點之間分佈。「這樣所有樹中的等值鏈接跨度僅僅有一個單一的網站」。這樣的模式的根表一般由它的主鍵分區並移動到網格的其它節點,使每一個節點上有根表的分區以及其它表中該根表分區的主鍵值所相應的數據。
如受約束樹應用知足這樣的屬性。
Stonebraker等人說,很是多OLTP事務具備這種屬性。所以利用它在他們的H-Store原型中替代撤消日誌。
所以,在一個單一的成對HA的網站上。ACID特性可以沒有不論什麼開銷地實現」。經過進一步應用技巧。他們實現「使用[模式分區和複製的]基本策略並用上面描寫敘述的技巧加強,所有事物類成爲一次性的和強兩階段的。僅僅要咱們加一個短延時,ACID特性可以在無不論什麼併發控制開銷的狀況下實現。
」
他們還分析了在商業DBMS的性能開銷,發現主要是由日誌和併發控制引發的。
一個SQL的泛化稱爲StreamSQL。贊成使用SQL的FROM語法混合流和關係型數據。引起了一些熱情,並被建議看成此領域的標準。Stonebraker等人還提到在流處理中經常需要流數據是扁平的(如一些新聞機構提供的數據流),但也有層次化結構數據的需要。所以。他們「期待流處理廠商更積極地進軍層次數據模型」,「他們必定會偏離Ted Codd原則」。
一些建議包含XML大綱(因爲其複雜性爭論激烈)和RDF
「[這]致使了高開銷的接口」。Stonebraker等人所以建議「在編程語言中嵌入數據庫的功能」。
這種語言嵌入樣例包含。上世紀70年代的Pascal R和Rigel,或今天微軟在.NET平臺的LINQ方法。關於語言整合這種能力。他們喜歡他們所謂的「小語種」如Python,Perl。Ruby和PHP,他們「開放源代碼。可以經過社區改進」,此外「比眼下通用的語言(被看做編程語言世界中的一刀切的方案)更easy改動」。他們的H-Store原型中的存儲過程計劃從C++遷移到Ruby。
特別執行大型和高頻站點的大網絡公司或企業已經從關係數據庫(一般有一個緩衝層典型地如memcached,參見[ Hof10c ],[ Hof10b ])切換到非關係數據存儲。樣例包含最初由Facebook開發的Cassandra([ Apa10d ])且今天還被Twitter和Digg使用([ Pop10a ]、[ Eur09 ])。LinkedIn開發和使用的Project Voldemort,存儲雲服務如NoSQL存儲Amazon SimpleDB([ Ama10b ]),以及Ubuntu One,一種基於CouchDB的雲存儲和同步服務([ Can10c ]、[ Hof10c ])。這些NoSQL數據存儲的用戶,自然地對他們使用的非關係型解決方式的進一步發展很感興趣。然而,最流行的NoSQL數據存儲所採用的思想是Google的Bigtable([ CDG+06 ])或Amazon的Dynamo([ DHJ+07 ])。Bigtable啓示的NoSQL存儲一般被稱爲列存儲(好比HyperTable,HBase),而Dynamo主要影響鍵/值存儲(如Cassandra[ Apa10d ]。Redis[ S+10 ],Project Voldemort[ K+10a ])。其它項目追求不一樣的嘗試,如圖形數據庫造成一類本身的數據存儲;和文件存儲。這可以被看做是具備附加功能的鍵/值存儲(至少贊成鍵/值對具備不一樣的、通常是分層的命名空間。提供了「文檔」的抽象);後者中至少一個(CouchDB)是現有文檔存儲如上世紀90年代的Lotus Notes的又一次實現,所以沒有結合當前的網絡技術進行設計(這被CouchDB開發人員們批評,他們又從零開始實現他們的文檔存儲,參見[ Apa10c ]、[ PLL09 ])。綜上所述,可以得出的結論是NoSQL潮流的先驅主要是大型網絡公司或執行大型站點的公司,如Facebook,Google和Amazon([ Oba09a ]),和在這一領域的其它人經過他們的想法和改動以知足本身的需求。
然而,特別是出問題後沒有人可責怪的狀況會嚇到商務人士。
即便在Adobe。開發人員使用Terracotta集羣替代關係數據庫,也僅僅有在讓他們的經理看到了系統啓動和執行時才幹說服他們(參見[ Com09a ])。
炒做是過分承諾的天然伴生,大多數技術高速構建以達到炒做的頂點。以後,差點兒老是對沒有獲得充分開發的想法的過激反應,這不可避免地致使崩潰。接下去是一個時期的冷嘲熱諷。不少新技術的發展到這一點,而後消失。倖存下來的那些是因爲有人發現了一個基本思想的好應用(=真實的用戶利益)。
」([ For10 ]引用[ Bez93 ])
博主Dennis Forbes說在非關係型數據存儲的發明者和開發人員之間看不見不論什麼過分熱情(「他們大部分是聰明的。務實的開發人員」),但使用這些技術開發人員卻但願「這個潮流解決他們的弱點」。
他——一個爲金融、保險、電信、電力等行業作傳統的關係數據庫開發——卻說「無疑是很是多奇異的工做發生的NoSQL陣營中,很是關注可伸縮性」。
還有一方面。在他博客的評論中批評說:「爭論的是。聚會的自己。被正在或但願創建很是大的網絡公司的人劫持了(都但願成爲下一個Facebook)。該領域的價值觀和推斷投射到整個數據庫產業——其包含一系列使社交媒體的邊緣樣例也相形見絀的解決方式——這真是諷刺」([ For10 ])。(注:不懂,好像是在罵人)
NoSQL的擁護者以爲CouchDB是「Notes的成功」。因爲Notes的分佈特徵並無利用當前的網絡技術,軟件自己也不是一個精幹的數據存儲而是因業務相關的特性而臃腫([ PLL09 ])。
博主Nati Shalom評論例如如下:「我以爲咱們所示是不少其它的一種現實,現有的SQL數據庫方案可能不會很是快消失,但同一時候他們不能解決世界上所有的問題。
有趣的是,NoSQL這個詞已經變爲Not Only SQL,以表明這一思路」([ Sha09a ])。一些博主強調這個詞語不精確。如Dare Obasanjo說,「尚未什麼產品是‘NoSQL’數據庫的確切技術定義,當其實它不是一個關係數據庫」([ Oba09a ])。其它人。如Michael Stonebraker聲稱。根本和SQL沒半毛錢關係,應該叫「NoACID」之類,這是由Dennis Forbes提出的並在他的建議裏引用了Stonebraker([ For10 ])。另外一些人如Adam Keys批評術語「NoSQL」僅僅定義了它不表明什麼趨勢([ Key09 ]):「這個名字的問題是,它僅僅定義了它不是什麼。這使得它是對抗性的,它所包括或排除的東西不使人吃驚。咱們看到的是,它終結了有價值的數據應該保存在某種關係數據庫的若是。終結了SQL和ACID是解決咱們問題的惟一工具的若是。終結了主/從模式的活力;終結了在咱們的應用程序代碼裏編織關係模式」。他建議把這樣的潮流和數據存儲納入「後關係型」而不是「NoSQL」:「咱們看到關於應怎樣存儲關鍵數據的思惟爆炸;咱們審視數據來看是否值得持久化;咱們嘗試新的語義結構、一致性和併發性。如同後現代主義是反思過去的藝術和建築的方式,後關係型是軟件開發商又一次考慮本身方式的一個機會。正如後現代主義並不是否能定整個藝術史,後關係型不會終結關係數據庫的有用性。」([ Key09 ])。然而。像他博客的讀者評論的,這個詞並不比「NoSQL」更好,因爲它仍僅僅是定義這個潮流和這種數據庫不反映(或更好的:他們所省略)的東西。而不是它們主張什麼。
這致使了下面選擇:要麼在應用程序中對多個網站上的數據碎片/分區致使「管理分佈式數據的嚴重問題」。或從MySQL走向商業RDBMS可引發大的許可費;或甚至全然放棄RDBMS。
爲了下降通訊開銷的還有一個選擇是使用一個嵌入式DBMS。指的是應用程序和DBMS在同一地址空間中執行;因爲強耦合。安全性和訪問控制問題對「安全是一個大問題的主流OLTP」沒有可行的替代。Stonebrakers以爲。
由於日誌文件被保存到磁盤以確保持久性,日誌是昂貴的且會減小事務性能。
這些數據結構都是由多個線程訪問短時間鎖(稱爲閂鎖)通常用於提供並行的但慎重的訪問。
「顯然,一個精心設計的多網站系統。無論是否基於SQL或其它,都比單網站系統更具可擴展性」,據Stonebraker說。
在他的觀點中,加速DBMS的實際任務集中於消除加鎖、閂鎖、日誌和緩衝區管理。以及支持存儲過程從高級語言(如SQL)編譯爲低級語言。這種系統的樣子在論文「架構時代的終結:是全然重寫的時候了」([SMA+07])中被闡述並已經在上文討論了。
Schmidt指出,對一些報表任務來講MapReduce方法([ DG04 ])是合適的,但不是對每一個即席查詢。此外,他看到的是文化而不是技術問題。客戶已經被培訓和「上癮」使用即席查詢。於是不喜歡這些手段的缺失。針對詳盡報表的需求。Schmidt建議使用鏡像了線上庫的關係型數據庫,而線上庫可能因爲性能和可擴展性要求而使用NoSQL存儲。
BJ Clark繼續說:「擴展不是:性能。在現實中,擴展和變快沒有什麼關係。它僅僅與大小有關。現在。擴展和性能典型地如此聯繫到一塊兒,假設什麼是高效的,它實際上可能不需要擴展。」([ Cla09 ])。
分片是最明顯的擴展方式,但分片多個能訪問隨意列的表會很是快令人崩潰。」博主Dennis Forbes容許他。「有一些老派的關係數據庫確實有擴展性問題」([ For10 ]),但使用如Adam Wiggins的技術仍是有可能讓它們擴展的([ Wig09 ])。
但Forbes也主張關係數據庫經過數據分區和將每臺機器增長失敗恢復集羣實現的水平縮放。以達到冗餘和可用性。考慮到約束很是少且錢一般不是問題的大公司的部署狀況。他以本身的經驗說,「這樣的擴展存在於差點兒所有的銀行、交易系統、能源平臺、零售系統等等。要聲稱SQL系統不能擴展,是對這樣明顯的證據的蔑視,無視所有的理由」([ For10 ])。Forbes主張使用本身的server。因爲他看到一些雲計算環境的人爲限制,如單一實例的Amazon EC2的IO限制和相對高費用;他以爲「這些金融和人爲限制解釋了對贊成你螺旋上升的技術的強烈興趣」([ For10 ])。
這一結論反映了Cassandra評價時的發展情況。
與Tokyo Tyant/Cabinet和Redis相比,Clark以爲「它可以作Tokyo Tyant和Redis可以作的一切。且真的是沒有那麼慢。其實,對於某些數據集。我見過MySQL比Tokyo Tyant運行地快得多」和「對MySQL分片與Tokyo Tyant和Redis同樣easy甚至更easy,很是難說他們可以在更多問題上贏得勝利。」
此外必須提到的是,評估發生在2009的夏天(博客是8月發表),所以,結果反映了被評價系統在那個時候的發展狀態。
所以。甚至可以以爲「擴展MySQL(經過MySQL Proxy來分片)和爲這些NoSQL數據庫作分片相同easy。」所以他沒有宣佈RDBMS早早死亡。提醒道MySQL仍然是在大站點如Facebook,Wikipedia和FriendFeed中使用。他建議新的應用程序使用最適合工做的工具,反映了非關係型數據庫——就像關係型的同樣——沒有「一刀切」的解決方式:
假設我需要ACID特性,我不會使用NoSQL。假設我需要一噸值對,我會使用Redis。假設我需要事務,我會使用Postgres。假設我有一噸單一類型的文件,我可能會使用Mongo。假設我需要天天寫10億個對象,我可能會使用Voldemort。假設我需要全文搜索。我可能會使用Solr。
假設我需要易變數據的全文搜索,我可能會使用Sphinx。」
此外,NoSQL數據庫有時被看做MySQL加memcached方案的繼任者(好比[ Hof10c ]),後者將負載從數據庫帶走以下降和延緩分佈式的需求。關於這些典型爭論博主Dennis Forbes提醒。不easy區分通常的RDBMS和MySQL,其餘數據庫可能更easy或更好地擴展:「MySQL不是RDBMS世界的先鋒。它在高負載站點下的問題和關注很是少與其餘數據庫系統相關」([ For10 ])。
他指出「對特定狀況下的每一個解決方式都可以提出好的討論,但上述那些僅僅是討論某一特定類型的存儲引擎。」Scofield所以批評,將討論範圍縮小到僅僅有一類NoSQL數據庫,會使得傳統主義者很是easy地否認整個潮流或全套不一樣的NoSQL方法。
」 考慮到Friendfeed使用MySQL的頻繁爭論([ Tay09 ])。Scofield指出,雖然微調一個關係型數據庫是可能的。但這對所有類型的數據沒有意義。「不一樣的應用適合不一樣的事情。關係數據庫對關係數據是偉大的,但對非關係數據爲何要使用他們?」他問道。
已經透露的是這些數據庫中的一些借鑑了Amazon的Dynamo([DHJ+07 ])或Google的Bigtable([ CDG+06 ])或二者的思想。
其它一些移植了針對現代網絡技術開發的現有數據庫的思想如CouchDB。另外一些人追求全然不一樣的方案如Neo4j或HypergraphDB。
詞彙 | 符合的數據庫 |
Key-Value-Cache
|
Memcached
Repcached
Coherence
Infinispan
EXtreme Scale
Jboss Cache
Velocity
Terracoqa
|
Key-Value-Store
|
keyspace
Flare
Schema Free
RAMCloud
|
Eventually-Consistent Key-Value-
Store
|
Dynamo
Voldemort
Dynomite
SubRecord
Mo8onDb
Dovetaildb
|
Ordered-Key-Value-Store
|
Tokyo Tyrant
Lightcloud
NMDB
Luxio
MemcacheDB
Actord
|
Data-Structures Server
|
Redis
|
Tuple Store
|
Gigaspaces
Coord
Apache River
|
Object Database
|
ZopeDB
DB4O
Shoal
|
Document Store
|
CouchDB
Mongo
Jackrabbit
XML Databases
ThruDB
CloudKit
Perservere
Riak Basho
Scalaris
|
Wide Columnar Store
|
Bigtable
Hbase
Cassandra
Hypertable
KAI
OpenNeptune
Qbase
KDI
|
表2.2總結了他的數據倉庫分類,另外包含一些僅僅在雲計算環境中可用的數據存儲。
歸類 |
符合的數據庫
|
Distributed Hash Table, Key-Value Data Stores
|
memcached
MemcacheDB
Project Voldemort
Scalaris
Tokyo Cabinet
|
Entity-Attribute-Value Datastores
|
Amazon SimpleDB
Google AppEngine datastore
Microsoft SQL Data Services
Google Bigtable
Hadoop
HyperTable
HBase
|
Amazon Platform
|
Amazon SimpleDB
|
Document Stores, Column Stores
|
Sybase IQ
Vertica Analytic Database
Apache CouchDB
|
歸類 | 符合的數據庫 |
Key-value Stores
|
Redis
Scalaris
Tokyo Tyrant
Voldemort
Riak
|
Document Stores
|
SimpleDB
CouchDB
MongoDB
Terrastore
|
Extensible Record Stores
|
Bigtable
HBase
HyperTable
Cassandra
|
這一分類法其實是一個簡短的NoSQL數據庫非功能類型(「稱爲ities」)的比較,外加功能覆蓋率的評分。
Popescu總結了Scofield的思想。如表2.4。
|
性能
|
擴展性
|
靈活性
|
複雜性
|
功能性
|
Key-Value Stores
|
high
|
high
|
high
|
none
|
variable (none)
|
Column stores
|
high
|
high
|
moderate
|
low
|
minimal
|
Document stores
|
high
|
variable (high)
|
high
|
low
|
variable (low)
|
Graph databases
|
variable
|
variable
|
high
|
high
|
graph theory
|
Relational databases
|
variable
|
variable
|
low
|
moderate
|
relational algebra
|
所以,他僅僅研究真正分佈式和提供本身主動數據分區的數據庫的寫操做擴展。
當數據大小超過單一機器的能力時,假設不肯意手動分區的話後者系統彷佛是他惟一的選擇(這不是一個好主意,依據[ Oba09b ])。對於相關的提供本身主動分片的分佈式系統,Ellis看到兩個重要特色:
數據存儲
|
在線加入機器
|
多數據中心支持
|
Cassandra
|
X
|
X
|
HBase
|
X
|
|
Riak
|
X
|
|
Scalaris
|
X
|
|
Voldemort
|
|
Some code required
|
表2.6顯示了他的調查結果,指出了各類數據模型和查詢APIs的巨大區別。
數據存儲
|
數據模型
|
查詢API
|
Cassandra
|
Columnfamily
|
Thrift
|
CouchDB
|
Document
|
map/reduce views
|
HBase
|
Columnfamily
|
Thrift, REST
|
MongoDB
|
Document
|
Cursor
|
Neo4j
|
Graph
|
Graph
|
Redis
|
Collection
|
Collection
|
Riak
|
Document
|
Nested hashes
|
Scalaris
|
Key/value
|
get/put
|
Tokyo Cabinet
|
Key/value
|
get/put
|
Voldemort
|
Key/value
|
get/put
|
數據存儲
|
持久化設計
|
Cassandra
|
Memtable / SSTable
|
CouchDB
|
Append-only B-tree
|
HBase
|
Memtable / SSTable on HDFS
|
MongoDB
|
B-tree
|
Neo4j
|
On-disk linked lists
|
Redis
|
In-memory with background snapshots
|
Riak
|
?
|
Scalaris
|
In-memory only
|
Tokyo Cabinet
|
Hash or B-tree
|
Voldemort
|
Pluggable (primarily BDB MySQL)
|
Scalaris經過複製解決問題——但它不支持多個數據中心——掉電的威脅依舊存在。
這一持久化策略具備與內存數據庫相媲美的性能特色(因爲——與基於磁盤的策略相比——因爲追加日誌和將整個內存表寫回磁盤減少了尋道時間),且避免了純內存數據庫的耐久性問題。
不足之處是,他們缺少特定的特性且把責任還給程序猿。樣例包含:Project Voldemort,Ringo。Amazon SimpleDB,Kai,Dynamite,Yahoo PNUTS,ThruDB。Hypertable,CouchDB。Cassandra,MemcacheDB。
樣例包括:文件系統,Cassandra,BerkelyDB。Amazon SimpleDB。
此外。重要的是要注意。一些數據庫可以在不一樣的類中找到(Cassandra。SimpleDB),所以這樣的分類不提供一個肯定的差異使每個數據庫僅僅納入一個類(這——在做者看來——在NoSQL數據庫領域即便不是不可能至少也很是困難)。
這些產品以他們的數據結構來分類。追隨上面所提到的Yen,North和Cattell的分類法(參見2.3.1),這也被本文的其它多數資料來源共享。在這篇文章中使用的分類是:鍵/值存儲、文檔數據庫和麪向列的數據庫。