8種主流NoSQL數據庫對比

摘要:雖然SQL數據庫是很是有用的工具,但經歷了15年的一支獨秀以後壟斷即將被打破。這只是時間問題:被迫使用關係數據庫,但最終發現不能適應需求的狀況不勝枚舉。javascript

簡介java

NoSQL,是一項全新的數據庫革命性運動,NoSQL的擁護者們提倡運用非關係型的數據存儲。現今的計算機體系結構在數據存儲方面要求具有龐大的水平擴展性,而NoSQL致力於改變這一現狀。目前Google的 BigTable 和Amazon 的Dynamo使用的就是NoSQL型數據庫。web

可是NoSQL數據庫之間的不一樣,遠超過兩 SQL數據庫之間的差異。這意味着軟件架構師更應該在項目開始時就選擇好一個適合的 NoSQL數據庫。算法

針對這種狀況,這裏對 Cassandra、 Mongodb、CouchDB、Redis、 Riak、 Membase、Neo4j、HBase進行了比較:sql

1. CouchDBshell

1. 所用語言: Erlang數據庫

2. 特色:DB一致性,易於使用api

3. 使用許可: Apache緩存

4. 協議: HTTP/REST安全

5. 雙向數據複製

6. 持續進行或臨時處理

7. 處理時帶衝突檢查

8. 所以,採用的是master-master複製(見編注2)

9. MVCC – 寫操做不阻塞讀操做

10. 可保存文件以前的版本

11. Crash-only(可靠的)設計

12. 須要不時地進行數據壓縮

13. 視圖:嵌入式 映射/減小

14. 格式化視圖:列表顯示

15. 支持進行服務器端文檔驗證

16. 支持認證

17. 根據變化實時更新

18. 支持附件處理

19. 所以,CouchApps(獨立的 js應用程序)

20. 須要 jQuery程序庫

21. master-master複製是一種數據庫同步方法,容許數據在一組計算機之間共享數據,而且能夠經過小組中任意成員在組內進行數據更新。

最佳應用場景:適用於數據變化較少,執行預約義查詢,進行數據統計的應用程序。適用於須要提供數據版本支持的應用程序。

例如: CRM、CMS系統。 master-master複製對於多站點部署是很是有用的。

2. Redis

1. 所用語言:C/C++

2. 特色:運行異常快

3. 使用許可: BSD

4. 協議:類 Telnet

5. 有硬盤存儲支持的內存數據庫,

6. 但自2.0版本之後能夠將數據交換到硬盤(注意, 2.4之後版本不支持該特性!)

7. Master-slave複製(見編注3)

8. 雖然採用簡單數據或以鍵值索引的哈希表,但也支持複雜操做,例如 ZREVRANGEBYSCORE。

9. INCR & co (適合計算極限值或統計數據)

10. 支持 sets(同時也支持 union/diff/inter)

11. 支持列表(同時也支持隊列;阻塞式 pop操做)

12. 支持哈希表(帶有多個域的對象)

13. 支持排序 sets(高得分表,適用於範圍查詢)

14. Redis支持事務

15. 支持將數據設置成過時數據(相似快速緩衝區設計)

16. Pub/Sub容許用戶實現消息機制

17. Master-slave複製,若是同一時刻只有一臺服務器處理全部的複製請求,一般應用在須要提供高可用性的服務器集羣。

最佳應用場景:適用於數據變化快且數據庫大小可碰見(適合內存容量)的應用程序。

例如:股票價格、數據分析、實時數據蒐集、實時通信。

3. MongoDB

1. 所用語言:C++

2. 特色:保留了SQL一些友好的特性(查詢,索引)。

3. 使用許可: AGPL(發起者: Apache)

4. 協議: Custom, binary( BSON)

5. Master/slave複製(支持自動錯誤恢復,使用 sets 複製)

6. 內建分片機制

7. 支持 javascript表達式查詢

8. 可在服務器端執行任意的 javascript函數

9. update-in-place支持比CouchDB更好

10. 在數據存儲時採用內存到文件映射

11. 對性能的關注超過對功能的要求

12. 建議最好打開日誌功能(參數 –journal)

13. 在32位操做系統上,數據庫大小限制在約2.5Gb

14. 空數據庫大約佔 192Mb

15. 採用 GridFS存儲大數據或元數據(不是真正的文件系統)

最佳應用場景:適用於須要動態查詢支持;須要使用索引而不是 map/reduce功能;須要對大數據庫有性能要求;須要使用 CouchDB但由於數據改變太頻繁而佔滿內存的應用程序。

例如:你本打算採用 MySQL或 PostgreSQL,但由於它們自己自帶的預約義欄讓你望而卻步。

4. Riak

所用語言:Erlang和C,以及一些Javascript

1. 特色:具有容錯能力

2. 使用許可: Apache

3. 協議: HTTP/REST或者 custom binary

4. 可調節的分發及複製(N, R, W)

5. 用 JavaScript or Erlang在操做前或操做後進行驗證和安全支持。

6. 使用JavaScript或Erlang進行 Map/reduce

7. 鏈接及鏈接遍歷:可做爲圖形數據庫使用

8. 索引:輸入元數據進行搜索(1.0版本即將支持)

9. 大數據對象支持( Luwak)

10. 提供「開源」和「企業」兩個版本

11. 全文本搜索,索引,經過 Riak搜索服務器查詢( beta版)

12. 支持Masterless多站點複製及商業許可的 SNMP監控

最佳應用場景:適用於想使用相似 Cassandra(相似Dynamo)數據庫但沒法處理 bloat及複雜性的狀況。適用於你打算作多站點複製,但又須要對單個站點的擴展性,可用性及出錯處理有要求的狀況。

例如:銷售數據蒐集,工廠控制系統;對宕機時間有嚴格要求;能夠做爲易於更新的 web服務器使用。

5. Membase

1. 所用語言: Erlang和C

2. 特色:兼容 Memcache,但同時兼具持久化和支持集羣

3. 使用許可: Apache 2.0

4. 協議:分佈式緩存及擴展

5. 很是快速(200k+/秒),經過鍵值索引數據

6. 可持久化存儲到硬盤

7. 全部節點都是惟一的( master-master複製)

8. 在內存中一樣支持相似分佈式緩存的緩存單元

9. 寫數據時經過去除重複數據來減小 IO

10. 提供很是好的集羣管理 web界面

11. 更新軟件時軟無需中止數據庫服務

12. 支持鏈接池和多路複用的鏈接代理

最佳應用場景:適用於須要低延遲數據訪問,高併發支持以及高可用性的應用程序

例如:低延遲數據訪問好比以廣告爲目標的應用,高併發的 web 應用好比網絡遊戲(例如 Zynga)

6. Neo4j

1. 所用語言: Java

2. 特色:基於關係的圖形數據庫

3. 使用許可: GPL,其中一些特性使用 AGPL/商業許可

4. 協議: HTTP/REST(或嵌入在 Java中)

5. 可獨立使用或嵌入到 Java應用程序

6. 圖形的節點和邊均可以帶有元數據

7. 很好的自帶web管理功能

8. 使用多種算法支持路徑搜索

9. 使用鍵值和關係進行索引

10. 爲讀操做進行優化

11. 支持事務(用 Java api)

12. 使用 Gremlin圖形遍歷語言

13. 支持 Groovy腳本

14. 支持在線備份,高級監控及高可靠性支持使用 AGPL/商業許可

最佳應用場景:適用於圖形一類數據。這是 Neo4j與其餘nosql數據庫的最顯著區別

例如:社會關係,公共交通網絡,地圖及網絡拓譜

7. Cassandra

1. 所用語言: Java

2. 特色:對大型表格和 Dynamo支持得最好

3. 使用許可: Apache

4. 協議: Custom, binary (節約型)

5. 可調節的分發及複製(N, R, W)

6. 支持以某個範圍的鍵值經過列查詢

7. 相似大表格的功能:列,某個特性的列集合

8. 寫操做比讀操做更快

9. 基於 Apache分佈式平臺儘量地 Map/reduce

10. 對 Cassandra有偏見,一部分是由於它自己的臃腫和複雜性,也由於 Java的問題(配置,出現異常,等等)

最佳應用場景:當使用寫操做多過讀操做(記錄日誌)若是每一個系統組建都必須用 Java編寫(沒有人由於選用 Apache的軟件被解僱)

例如:銀行業,金融業(雖然對於金融交易不是必須的,但這些產業對數據庫的要求會比它們更大)寫比讀更快,因此一個天然的特性就是實時數據分析

8. HBase(配合 ghshephard使用)

1. 所用語言: Java

2. 特色:支持數十億行X上百萬列

3. 使用許可: Apache

4. 協議:HTTP/REST (支持 Thrift,見編注4)

5. 在 BigTable以後建模

6. 採用分佈式架構 Map/reduce

7. 對實時查詢進行優化

8. 高性能 Thrift網關

9. 經過在server端掃描及過濾實現對查詢操做預判

10. 支持 XML, Protobuf, 和binary的HTTP

11. Cascading, hive, and pig source and sink modules

12. 基於 Jruby( JIRB)的shell

13. 對配置改變和較小的升級都會從新回滾

14. 不會出現單點故障

15. 堪比MySQL的隨機訪問性能

最佳應用場景:適用於偏好BigTable:)而且須要對大數據進行隨機、實時訪問的場合。

例如: Facebook消息數據庫(更多通用的用例即將出現)

Thrift 是一種接口定義語言,爲多種其餘語言提供定義和建立服務,由Facebook開發並開源。

固然,全部的系統都不僅具備上面列出的這些特性。這裏僅僅根據本身的觀點列出一些認爲的重要特性。與此同時,技術進步是飛速的,因此上述的內容確定須要不斷更新。

相關文章
相關標籤/搜索