四大分類
鍵值(Key-Value這一類資料庫主要會使用到一個哈希表,這個表中有一個特定的鍵和一個指針指向特定的數據。Key/value模型對於IT系統來說的優勢在於簡單、易部署。但是如果DBA只對部分值進行查詢或更新的時候,Key/value就顯得效率低下了。
舉例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB.
列存儲資料庫。
這部分資料庫通常是用來應對分散式存儲的海量數據。鍵仍然存在,但是它們的特點是指向了多個列。這些列是由列家族來安排的。如:Cassandra, HBase, Riak.
文檔型資料庫
文檔型資料庫的靈感是來自於Lotus Notes辦公軟體的,而且它同第一種鍵值存儲相類似。該類型的數據模型是版本化的文檔,半結構化的文檔以特定的格式存儲,比如JSON。文檔型資料庫可 以看作是鍵值資料庫的升級版,允許之間嵌套鍵值。而且文檔型資料庫比鍵值資料庫的查詢效率更高。如:CouchDB, MongoDb. 國內也有文檔型資料庫SequoiaDB,已經開源。
圖形(Graph)資料庫
圖形結構的資料庫同其他行列以及剛性結構的SQL資料庫不同,它是使用靈活的圖形模型,並且能夠擴展到多個伺服器上。NoSQL資料庫沒有標準的查詢語言(SQL),因此進行資料庫查詢需要制定數據模型。許多NoSQL資料庫都有REST式的數據接口或者查詢API。
如:Neo4J, InfoGrid, Infinite Graph.
因此,我們總結NoSQL資料庫在以下的這幾種情況下比較適用:1、數據模型比較簡單;2、需要靈活性更強的IT系統;3、對資料庫性能要求較高;4、不需要高度的數據一致性;5、對於給定key,比較容易映射複雜值的環境。
表格分析
分類 | Examples舉例 | 典型套用場景 | 數據模型 | 優點 | 缺點 |
---|---|---|---|---|---|
鍵值(key-value) | Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB | 內容快取,主要用於處理大量數據的高訪問負載,也用於一些日誌系統等等。 | Key 指向 Value 的鍵值對,通常用hash table來實現 | 查找速度快 | 數據無結構化,通常只被當作字元串或者二進制數據 |
列存儲資料庫 | Cassandra, HBase, Riak | 分散式的檔案系統 | 以列簇式存儲,將同一列數據存在一起 | 查找速度快,可擴展性強,更容易進行分散式擴展 | 功能相對局限 |
文檔型資料庫 | CouchDB, MongoDb | Web套用(與Key-Value類似,Value是結構化的,不同的是資料庫能夠了解Value的內容) | Key-Value對應的鍵值對,Value為結構化數據 | 數據結構要求不嚴格,表結構可變,不需要像關係型資料庫一樣需要預先定義表結構 | 查詢性能不高,而且缺乏統一的查詢語法。 |
圖形(Graph)資料庫 | Neo4J, InfoGrid, Infinite Graph | 社交網路,推薦系統等。專注於構建關係圖譜 | 圖結構 | 利用圖結構相關算法。比如最短路徑定址,N度關係查找等 | 很多時候需要對整個圖做計算才能得出需要的信息,而且這種結構不太好做分散式的集群方案。 |
共同特徵
對於NoSQL並沒有一個明確的範圍和定義,但是他們都普遍存在下面一些共同特徵:
不需要預定義模式:不需要事先定義數據模式,預定義表結構。數據中的每條記錄都可能有不同的屬性和格式。當插入數據時,並不需要預先定義它們的模式。
無共享架構:相對於將所有數據存儲的存儲區域網路中的全共享架構。NoSQL往往將數據劃分後存儲在各個本地伺服器上。因為從本地磁碟讀取數據的性能往往好於通過網路傳輸讀取數據的性能,從而提高了系統的性能。
彈性可擴展:可以在系統運行的時候,動態增加或者刪除結點。不需要停機維護,數據可以自動遷移。
分區:相對於將數據存放於同一個節點,NoSQL資料庫需要將數據進行分區,將記錄分散在多個節點上面。並且通常分區的同時還要做複製。這樣既提高了並行性能,又能保證沒有單點失效的問題。
異步複製:和RAID存儲系統不同的是,NoSQL中的複製,往往是基於日誌的異步複製。這樣,數據就可以儘快地寫入一個節點,而不會被網路傳輸引起遲延。缺點是並不總是能保證一致性,這樣的方式在出現故障的時候,可能會丟失少量的數據。
BASE:相對於事務嚴格的ACID特性,NoSQL資料庫保證的是BASE特性。BASE是最終一致性和軟事務。
NoSQL資料庫並沒有一個統一的架構,兩種NoSQL資料庫之間的不同,甚至遠遠超過兩種關係型資料庫的不同。可以說,NoSQL各有所長,成功的NoSQL必然特別適用於某些場合或者某些套用,在這些場合中會遠遠勝過關係型資料庫和其他的NoSQL。
適用場景
NoSQL資料庫在以下的這幾種情況下比較適用:1、數據模型比較簡單;2、需要靈活性更強的IT系統;3、對資料庫性能要求較高;4、不需要高度的數據一致性;5、對於給定key,比較容易映射複雜值的環境。
發展現狀
計算機體系結構在數據存儲方面要求具備龐大的水平擴展性,而NoSQL致力於改變這一現狀。Google的 BigTable 和Amazon 的Dynamo使用的就是NoSQL型資料庫。
NoSQL項目的名字上看不出什麼相同之處,但是,它們通常在某些方面相同:它們可以處理超大量的數據。
這場革命仍然需要等待。的確,NoSQL對大型企業來說還不是主流,但是,一兩年之後很可能就會變個樣子。在NoSQL運動的最新一次聚會中,來自世界各地的150人擠滿了CBS Interactive的一間會議室。分享他們如何推翻緩慢而昂貴的關係資料庫的暴政的經驗,怎樣使用更有效和更便宜的方法來管理數據。
“關係型資料庫給你強加了太多東西。它們要你強行修改對象數據,以滿足RDBMS (relational database management system,關係型資料庫管理系統)的需要,”在NoSQL擁護者們看來,基於NoSQL的替代方案“只是給你所需要的”。
水平擴展性(horizontal scalability)指能夠連線多個軟硬體的特性,這樣可以將多個伺服器從邏輯上看成一個實體。
挑戰
儘管大多數NoSQL數據存儲系統都已被部署於實際套用中,但歸納其研究現狀,還有許多挑戰性問題。
已有key-value資料庫產品大多是面向特定套用自治構建的,缺乏通用性;
已有產品支持的功能有限(不支持事務特性),導致其套用具有一定的局限性;
已有一些研究成果和改進的NoSQL數據存儲系統,但它們都是針對不同套用需求而提出的相應解決方案,如支持組內事務特性、彈性事務等,很少從全局考慮系統的通用性,也沒有形成系列化的研究成果;
缺乏類似關係資料庫所具有的強有力的理論(如armstrong公理系統)、技術(如成熟的基於啟發式的最佳化策略、兩段封鎖協定等)、標準規範(如SQL語言)的支持。
目前,HBase資料庫時安全特性最完善的NoSQL資料庫產品之一,而其他的NoSQL資料庫多數沒有提供內建的安全機制,但隨著NoSQL的發展,越來越多的人開始意識到安全的重要,部分NoSQL產品逐漸開始提供一些安全方面的支持。
隨著雲計算、網際網路等技術的發展,大數據廣泛存在,同時也呈現出了許多雲環境下的新型套用,如社交網路網、移動服務、協作編輯等。這些新型套用對海量數據管理或稱雲數據管理系統也提出了新的需求,如事務的支持、系統的彈性等。同時雲計算時代海量數據管理系統的設計目標為可擴展性、彈性、容錯性、自管理性和“強一致性”。目前,已有系統通過支持可隨意增減節點來滿足可擴展性;通過副本策略保證系統的容錯性;基於監測的狀態訊息協調實現系統的自管理性。“彈性”的目標是滿足Pay-per-use 模型,以提高系統資源的利用率。該特性是已有典型NoSQL資料庫系統所不完善的,但卻是雲系統應具有的典型特點;“強一致性”主要是新套用的需求。
缺點
但是一些人承認,沒有正式的官方支持,萬一出了差錯會是可怕的,至少很多管理人員是這樣看。
“我們確實需要做一些說服工作,但基本在他們看到我們的第一個原型運行良好之後,我們就能夠說服他們,這是條正確的道路。”
此外,nosql並未形成一定標準,各種產品層出不窮,內部混亂,各種項目還需時間來檢驗
開源軟體
Membase
Membase 是 NoSQL 家族的一個新的重量級的成員。Membase是開源項目,原始碼採用了Apache2.0的使用許可。該項目託管在GitHub.Source tarballs上,可以下載beta版本的Linux二進制包。該產品主要是由North Scale的memcached核心團隊成員開發完成,其中還包括Zynga和NHN這兩個主要貢獻者的工程師,這兩個組織都是很大的線上遊戲和社區網路空間的供應商。
Membase容易安裝、操作,可以從單節點方便的擴展到集群,而且為memcached(有線協定的兼容性)實現了即插即用功能,在套用方面為開 發者和經營者提供了一個比較低的門檻。做為快取解決方案,Memcached已經在不同類型的領域(特別是大容量的Web套用)有了廣泛的使用,其中 Memcached的部分基礎代碼被直接套用到了Membase伺服器的前端。
通過兼容多種程式語言和框架,Membase具備了很好的復用性。在安裝和配置方面,Membase提供了有效的圖形化界面和編程接口,包括可配置 的告警信息。
Membase的目標是提供對外的線性擴展能力,包括為了增加集群容量,可以針對統一的節點進行複製。 另外,對存儲的數據進行再分配仍然是必要的。
這方面的一個有趣的特性是NoSQL解決方案所承諾的可預測的性能,類準確性的延遲和吞吐量。通過如下方式可以獲得上面提到的特性:
自動將線上數據遷移到低延遲的存儲介質的技術(記憶體,固態硬碟,磁碟)
可選的寫操作一一異步,同步(基於複製,持久化)
反向通道再平衡[未來考慮支持]
多執行緒低鎖爭用
儘可能使用異步處理
自動實現重複數據刪除
動態再平衡現有集群
通過把數據複製到多個集群單元和支持快速失敗轉移來提供系統的高可用性。
MongoDB
MongoDB是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。他支持的數據結構非常鬆散,是類似json的bjson格式,因此可以存儲比較複雜的數據類型。Mongo最大的特點是他支持的查詢語言非常強大,其語法有點類似於面向對象的查詢語言,幾乎可以實現類似關係資料庫單表查詢的絕大部分功能,而且還支持對數據建立索引。它的特點是高性能、易部署、易使用,存儲數據非常方便。
MongoDB的主要目標是在鍵/值存儲方式(提供了高性能和高度伸縮性)以及傳統的RDBMS系統(豐富的功能)架起一座橋樑,集兩者的優勢於一身。MongoDB最大的特點是他支持的查詢語言非常強大,其語法有點類似於面向對象的查詢語言,幾乎可以實現類似關係資料庫單表查詢的絕大部分功能,而且還支持對數據建立索引。
主要功能特性:
面向集合存儲,易存儲對象類型的數據
“面向集合”(Collenction-Oriented),意思是數據被分組存儲在數據集中,被稱為一個集合(Collenction)。每個 集合在資料庫中都有一個唯一的標識名,並且可以包含無限數目的文檔。集合的概念類似關係型資料庫(RDBMS)里的表(table),不同的是它不需要定 義任何模式(schema)。
模式自由
模式自由(schema-free),意味著對於存儲在mongodb資料庫中的檔案,我們不需要知道它的任何結構定義。如果需要的話,你完全可以把不同結構的檔案存儲在同一個資料庫里。
支持動態查詢
支持完全索引,包含內部對象
支持查詢
支持複製和故障恢復
使用高效的二進制數據存儲,包括大型對象(如視頻等)
自動處理碎片,以支持雲計算層次的擴展性
支持RUBY,PYTHON,JAVA,C++,PHP等多種語言
檔案存儲格式為BSON(一種JSON的擴展)
BSON(Binary Serialized document Format)存儲形式是指:存儲在集合中的文檔,被存儲為鍵-值對的形式。鍵用於唯一標識一個文檔,為字元串類型,而值則可以是各中複雜的檔案類型。
可通過網路訪問
MongoDB服務端可運行在Linux、Windows或OS X平台,支持32位和64位套用,默認連線埠為27017。推薦運行在64位平台,因為MongoDB在32位模式運行時支持的最大檔案尺寸為2GB。
MongoDB把數據存儲在檔案中(默認路徑為:/data/db),為提高效率使用記憶體映射檔案進行管理。
Hypertable
Hypertable是一個開源、高性能、可伸縮的資料庫,它採用與Google的Bigtable相似的模型。在過去數年中,Google為在PC集群 上運行的可伸縮計算基礎設施設計建造了三個關鍵部分。第一個關鍵的基礎設施是Google File System(GFS),這是一個高可用的檔案系統,提供了一個全局的命名空間。它通過跨機器(和跨機架)的檔案數據複製來達到高可用性,並因此免受傳統 檔案存儲系統無法避免的許多失敗的影響,比如電源、記憶體和網路連線埠等失敗。第二個基礎設施是名為Map-Reduce的計算框架,它與GFS緊密協作,幫 助處理收集到的海量數據。第三個基礎設施是Bigtable,它是傳統資料庫的替代。Bigtable讓你可以通過一些主鍵來組織海量數據,並實現高效的 查詢。Hypertable是Bigtable的一個開源實現,並且根據我們的想法進行了一些改進。
ApacheCassandra
Apache Cassandra是一套開源分散式Key-Value存儲系統。它最初由Facebook開發,用於儲存特別大的數據。Facebook在使用此系統。Cassandra是一個混合型的非關係的資料庫,類似於Google的BigTable。其主要功能比Dynomite(分散式的Key-Value存儲系統)更豐富,但支持度卻不如文檔存儲MongoDB。
主要特性:
分散式
基於column的結構化
高伸展性
Cassandra的主要特點就是它不是一個資料庫,而是由一堆資料庫節點共同構成的一個分散式網路服務,對Cassandra 的一個寫操作,會被複製到其他節點上去,對Cassandra的讀操作,也會被路由到某個節點上面去讀取。對於一個Cassandra群集來說,擴展性能 是比較簡單的事情,只管在群集裡面添加節點就可以了。
Cassandra是一個混合型的非關係的資料庫,類似於Google的BigTable。其主要功能比 Dynomite(分散式的Key-Value存 儲系統)更豐富,但支持度卻不如文檔存儲MongoDB(介於關係資料庫和非關係資料庫之間的開源產品,是非關係資料庫當中功能最豐富,最像關係資料庫 的。支持的數據結構非常鬆散,是類似json的bjson格式,因此可以存儲比較複雜的數據類型。)Cassandra最初由Facebook開發,後轉變成了開源項目。它是一個網路社交雲計算方面理想的資料庫。以Amazon專有的完全分散式的Dynamo為基礎,結合了Google BigTable基於列族(Column Family)的數據模型。P2P去中心化的存儲。很多方面都可以稱之為Dynamo 2.0。
CouchDB
CouchDB會為存儲到資料庫中的每一個文檔分配一個文檔級別的唯一標識符(id),同時每次將變動保存到資料庫中時還會分配一個修訂號(rev)。CouchDB還有一個更加商業化的“表親”——Couchbase,不過它提供快取功能,更好的分片,增量查詢,更好的索引和一些其他的功能。其實Couchbase與CouchDB也是緊密相關的,Couchbase產品包含了CouchDB的一個副本。
所用語言: Erlang
特點:DB一致性,易於使用
使用許可: Apache
協定: HTTP/REST
雙向數據複製,持續進行或臨時處理,處理時帶衝突檢查,因此,採用的是master-master複製
MVCC – 寫操作不阻塞讀操作
可保存檔案之前的版本
Crash-only(可靠的)設計
需要不時地進行數據壓縮
視圖:嵌入式 映射/減少
格式化視圖:列表顯示
支持進行伺服器端文檔驗證
支持認證
根據變化實時更新
支持附屬檔案處理
因此, CouchApps(獨立的 js應用程式)
需要 jQuery程式庫
最佳套用場景:適用於數據變化較少,執行預定義查詢,進行數據統計的應用程式。適用於需要提供數據版本支持的應用程式。
例如:CRM、CMS系統。 master-master複製對於多站點部署是非常有用的。
和其他資料庫比較,其突出特點是:
模式靈活 :使用Cassandra,像文檔存儲,你不必提前解決記錄中的欄位。你可以在系統運行時隨意的添加或移除欄位。這是一個驚人的效率提升,特別是在大型部 署上。
真正的可擴展性 :Cassandra是純粹意義上的水平擴展。為給集群添加更多容量,可以指向另一台電腦。你不必重啟任何進程,改變套用查詢,或手動遷移任何數據。
多數據中心識別 :你可以調整你的節點布局來避免某一個數據中心起火,一個備用的數據中心將至少有每條記錄的完全複製。
範圍查詢 :如果你不喜歡全部的鍵值查詢,則可以設定鍵的範圍來查詢。
列表數據結構 :在混合模式可以將超級列添加到5維。對於每個用戶的索引,這是非常方便的。
分散式寫操作 :有可以在任何地方任何時間集中讀或寫任何數據。並且不會有任何單點失敗。