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,但因為它們本身自帶的QQ靚號地圖預定義欄讓你望而卻步。
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開發並開源。
當然,所有的系統都不只具有上面列出的這些特性。這裡僅僅根據自己的觀點列出一些認為的重要特性。與此同時,技術進步是飛速的,所以上述的內容肯定需要不斷更新。