8種主流NoSQL數據庫對比


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

簡介

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

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

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

1. CouchDB

1. 所用語言: Erlang

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

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開發並開源。

當然,所有的系統都不只具有上面列出的這些特性。這里僅僅根據自己的觀點列出一些認為的重要特性。與此同時,技術進步是飛速的,所以上述的內容肯定需要不斷更新。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM