與關係型數據庫RDBMS的大廠商壟斷不同,NoSQL在發展之初就可謂是百家爭鳴、百花齊放,無論目前如日中天的MongoDB,還是剛剛發佈最新版本的Redis;無論是面向文本的CouchDB,還是基於KV的Cassandra,都有着各自的特點和應用場景。而作爲傳統SQL數據庫的良好補充,DBA有必要了解這些主流NoSQL數據庫的各自特點。在本文中,我們就將對比一下主流NoSQL數據庫,包括了Cassandra、Mongodb、CouchDB、Redis、Riak以及HBase。
基本特性:
各自特點與應用場景:
- 分佈式與複製的權衡
- 根據列和鍵範圍進行查詢
- BigTable類似的功能:列,列族
- 寫比讀快很多
- Map/reduce Apache Hadoop
- Java語言在設置上會有一定複雜度
最佳適用:寫操作較多,讀比較少的時候。如果你的系統都是基於Java的時候。
應用場景:銀行,金融行業。數據分析。
- 主從複製
- 查詢利用javascript表達式
- 服務器端運行javascript函數
- 比CouchDB更容易就地升級
- 內置Sharding
- 數據存儲使用的是內存映射文件
- 數據庫崩潰後需要對錶進行修復
- 持久性更好
最佳適用:如果你需要動態的查詢,如果你更偏向與定義索引而非 map/reduce,如果你針對大數據庫想要更好的性能,如果你想使用CouchDB而數據變化太快,磁盤不夠用的話,可以使用MongoDB。
應用場景:一言以蔽之,MySQL或PostgreSQL的替代品。
- 雙向複製
- 連續或ad-hoc
- 衝突檢測
- 主主複製(master-master replication)
- 多版本併發控制,寫操作不會阻塞讀取
- 通用的技術文檔
- 只崩潰設計Crash-only
- 需要經常壓縮
- 視圖:嵌入式map/reduce
- 格式化視圖:lists & shows
- 服務器端文檔驗證可行
- 身份驗證可行
- 通過_changes實時更新
- 附件處理
- CouchApps(獨立js應用)
- 包括jQuery庫
最佳適用:對於數據變化不太頻繁的業務,運行有預先定義的查詢。此外對於版本控制有高要求的業務同樣適用。
應用場景:CRM、CMS系統。主主複製是非常有趣的功能特性,它令多站點部署變得更加容易。
Riak
- 分佈式與複製的權衡
- post-commit 和pre-commit hooks
- 安全性驗證
- 內置的全文檢索
- Javascript或Erlang Map/reduce
- 開源 與 企業 兩個版本
最佳適用:如果你想要Cassandra或Dynamo類似的功能,但不想太複雜。如果你需要非常好的單點擴展性、可用性和容錯功能可以使用Riak。
應用場景:銷售點數據採集。工廠控制系統。需要零停機時間的場景。
- 內存數據庫
- 2.0版本之後可以部署到硬盤上
- 主從複製
- 簡單的Key-Value
- 操作符較爲複雜,如ZREVRANGEBYSCORE
- INCR & co (有利於速率限制和統計)
- 有集合(union/diff/inter)
- 有列表(a queue; blocking pop)
- 有散列(多字段對象)
- NoSQL中唯一處理交易的數據庫
- Value可以設定過期
- 分類集合(有利於範圍查詢)
- 針對數據變化的Pub/Sub和WATCH
最佳適用:在數據庫大小可預見的前提下,適用於數據變化速度快的應用。
應用場景:股價系統,數據分析,實時數據採集以及實時通信場景。
- 分佈式與複製的權衡
- 模仿BigTable
- Map/reduce Hadoop
- 利用服務器端掃描進行查詢預測疊加並獲取過濾
- 優化的實時查詢
- 高性能Thrift網關
- HTTP支持XML、Protobuf和二進制
- Cascading、hive、pig source和sink模塊
- 基於Jruby的shell
- 無單點故障
- 類似MySQL的隨機訪問性能
最佳適用:如果你喜歡BigTable,如果你需要隨即、實時的讀寫大數據(Big Data),可以使用HBase。
應用場景:Facebook網站郵件數據庫等。