Linux中國

各種 NoSQL 的比較

即使關係型資料庫依然是非常有用的工具,但它們持續幾十年的壟斷地位就要走到頭了。現在已經存在無數能撼動關係型資料庫地位的 NoSQL,當然,這些 NoSQL 還無法完全取代它們。(也就是說,關係型資料庫還是處理關係型事務的最佳方式。)

NoSQL 與 NoSQL 之間的區別,要遠大於不同的 SQL 資料庫之間的區別,所以軟體架構師必須要在項目一開始就選好一款合適的 NoSQL。

考慮到這種情況,本文為大家介紹以下幾種 NoSQL 之間的區別:Cassandra, Mongodb, CouchDB, Redis, Riak, Couchbase (ex-Membase), Hypertable, ElasticSearch, Accumulo, VoltDB, Kyoto Tycoon, Scalaris, Neo4jHBase

最流行的 NoSQL

MongoDB 2.2版

開發語言: C++

主要特性: 保留 SQL 中一些用戶友好的特性(查詢、索引等)

許可證: AGPL (驅動: 採用Apache許可協議)

數據傳輸格式: 自定義,二進位( BSON 文檔格式)

  • 主/從備份(支持自動故障切換功能)
  • 自帶數據分片功能
  • 通過 javascript 表達式提供數據查詢
  • 伺服器端完全支持 javascript 腳本
  • 比 CouchDB 更好的升級功能
  • 數據存儲使用內存映射文件技術
  • 功能豐富,性能不俗
  • 最好開啟日誌功能(使用 --journal 參數)
  • 在 32 位系統中,內存限制在 2.5GB
  • 空資料庫佔用 192MB 空間
  • 使用 GridFS(不是真正的文件系統)來保存大數據和元數據
  • 支持對地理數據建立索引
  • 可用於數據中心

應用場景:

  • 動態查詢
  • 喜歡定義索引,而不是使用 map/reduce 功能
  • 高性能的大數據訪問
  • 想使用 CouchDB 但數據變化頻度太大

使用案例:

想布署 MySQL 或 PostgreSQL,但預先定義數據字典讓你望而卻步。這個時候,MongoDB 是你可以考慮的選項

Riak 1.2版

開發語言: Erlang、C、以及一些 JavaScript

主要特性: 容錯機制(當一份數據失效,服務會自動切換到備份數據,保證服務一直在線 —— 譯者注)

許可證: Apache

數據傳輸格式: HTTP/REST 架構,或自定義二進位格式

  • 可存儲 BLOB(binary large object,二進位大對象,比如一張圖片、一個聲音文件 —— 譯者注)
  • 可在分散式存儲和複製存儲之間作協調
  • 為了保證可驗證性和安全性,Riak 在 JS 和 Erlaing 中提供提交前(pre-commit)和提交後(post-commit)鉤子(hook)函數(你可以在提交數據前執行一個 hook,或者在提交數據後執行一個 hook —— 譯者注)
  • JS 和 Erlang 提供映射和簡化(map/reduce)編程模型
  • 使用 links 和 link walking ,用於圖形化資料庫(link 用於描述對象之間的關係,link walking 是一個用於查詢對象關係的進程 —— 譯者注)
  • 次要標記(secondaty indeces,開發者在寫數據時可用多個名稱來標記一個對象 —— 譯者注),一次只能用一個
  • 支持大數據對象(Luwak)(Luwak 是 Riak 中的一個服務層,為大數據量對象提供簡單的、面向文檔的抽象,彌補了 Riak 的 Key/Value 存儲格式在處理大數據對象方面的不足 —— 譯者注)
  • 提供「開源」和「企業」兩個版本
  • 基於Riak搜索的全文檢索、建立索引和查詢
  • 正在將存儲後端從「Bitcask」遷移到 Google 的「LevelDB」上
  • 企業版本提供無主模式的多點複製(各點地位平等,非主從架構)和SNMP監控功能

應用場景:

  • 假如你想要類似 Dynamo 的資料庫,但不想要它的龐大和複雜
  • 假如你需要良好的單點可擴展性、可用性和容錯能力,但不想為多點備份買單。

使用案例:

銷售點數據收集;工廠控制系統;必須實時在線的系統;需要易於升級的網站伺服器

CouchDB 1.2版

開發語言: Erlang

主要特性: 數據一致性;易於使用

許可證: Apache

數據傳輸格式: HTTP/REST

  • 雙向複製!(一種同步技術,每個備份點都有一份它們自己的拷貝,允許用戶在存儲點斷線的情況下修改數據,當存儲節點重新上線時,CouchDB 會對所有節點同步這些修改 —— 譯者注)
  • 支持持續同步或者點對點同步
  • 支持衝突檢測
  • 支持主主互備!(多個資料庫實時同步數據,起到備份和分攤用戶並行訪問量的作用 —— 譯者注)
  • 多版本並發控制(MVCC),寫操作時不需要阻塞讀操作(或者說不需要鎖住資料庫的讀取操作)
  • 向下兼容以前版本的數據
  • 可靠的 crash-only 設計(所謂 crash-only,就是程序出錯時,只需重啟下程序,丟棄內存的所有數據,不需要執行複雜的數據恢復操作 —— 譯者注)
  • 需要實時壓縮數據
  • 視圖(文檔是 CouchDB 的核心概念,CouchDB 中的視圖聲明了如何從文檔中提取數據,以及如何對提取出來的數據進行處理 —— 譯者注):內嵌映射和簡化(map/reduce)編程模型
  • 格式化的views欄位:lists(包含把視圖運行結果轉換成非 JSON 格式的方法)和 shows(包含把文檔轉換成非 JSON 格式的方法)(在 CouchDB 中,一個 Web 應用是與一個設計文檔相對應的。在設計文檔中可以包含一些特殊的欄位,views 欄位包含永久的視圖定義 —— 譯者注)
  • 能夠進行伺服器端文檔驗證
  • 能夠提供身份認證功能
  • 通過 _changes 函數實時更新數據!
  • 鏈接處理(attachment:couchDB 的每份文檔都可以有一個 attachment,就像一份 email 有它的網址 —— 譯者注)
  • 有個 CouchApps(第三方JS的應用)

應用場景:

  • 用於隨機數據量多、需要預定義查詢的地方
  • 用於版本控制比較重要的地方

使用案例:

可用於客戶關係管理(CRM),內容管理系統(CMS);可用於主主互備甚至多機互備

Redis 2.4版

開發語言: C/C++

主要特性: 快到掉渣

許可證: BSD

數據傳輸格式: 類似 Telnet 式的交換

  • Redis 是一個內存資料庫(in-memory database,簡稱 IMDB,將數據放在內存進行讀寫,這才是「快到掉渣」的真正原因 —— 譯者注),磁碟只是提供數據持久化(即將內存的數據寫到磁碟)的功能(這類資料庫被稱為「disk backed」資料庫)
  • 當前不支持將磁碟作為 swap 分區,虛擬內存(VM)和 Diskstore 方式都沒加到此版本(Redis 的數據持久化共有4種方式:定時快照、基於語句追加、虛擬內存、diskstore。其中 VM 方式由於性能不好以及不穩定的問題,已經被作者放棄,而 diskstore 方式還在實驗階段 —— 譯者注)
  • 主從備份
  • 存儲結構為簡單的 key/value 或 hash 表
  • 但是操作比較複雜,比如:ZREVRANGEBYSCORE
  • 支持 INCR(INCR key 就是將key中存儲的數值加一 —— 譯者注)命令(對限速和統計有幫助)
  • 支持sets數據類型(以及 union/diff/inter)
  • 支持 lists (以及 queue/blocking pop)
  • 支持 hash sets (多級對象)
  • 支持 sorted sets(高效率的表,在範圍查找方面有優勢)
  • 支持事務處理!
  • 緩存中的數據可被標記為過期
  • Pub/Sub 實現了消息訂閱和推送!

應用場景:

  • 適合布署快速多變的小規模數據(可以完全運行在存在中)

使用案例:

股價系統、分析系統、實時數據收集系統、實時通信系統、以及取代 memcached

Google Bigtable 的衍生品

HBase 0.92.0 版

開發語言: Java

主要特性: 支持幾十億行*幾百萬列的大表

許可證: Apache

數據傳輸格式: HTTP/REST (也支持 Thrift 開發框架)

  • 仿造 Google 的 BigTable
  • 使用 Hadoop 的 HDFS 文件系統作為存儲
  • 使用 Hadoop 的映射和簡化(map/reduce)編程模型
  • 查詢條件被推送到伺服器端,由伺服器端執行掃描和過濾
  • 對實時查詢進行優化
  • 高性能的 Thrift gateway(訪問 HBase 的介面之一,特點是利用 Thrift 序列化支持多種語言,可用於異構系統在線訪問 HBase 表數據 —— 譯者注)
  • 使用 HTTP 通信協議,支持 XML、Protobuf 以及二進位格式
  • 支持基於 Jruby(JIRB)的shell
  • 當配置信息有更改時,支持 rolling restart(輪流重啟數據節點)
  • 隨機讀寫性能與 MySQL 一樣
  • 一個集群可由不同類型的結點組成

應用場景:

  • Hadoop 可能是在大數據上跑 Map/Reduce 業務的最佳選擇
  • 如果你已經搭建了 Hadoop/HDFS 架構,HBase 也是你最佳的選擇。

使用案例:

搜索引擎;日誌分析系統;掃描大型二維非關係型數據表。

Cassandra 1.2版

開發語言: Java

主要特性: BigTable 和 Dynamo的完美結合(Cassandra 以 Amazon 專有的完全分散式的 Dynamo 為基礎,結合了Google BigTable基於 Column Family 的數據模型 —— 譯者注)

許可證: Apache

數據傳輸格式: Thrift 和自定義二進位 CQL3(即 Cassandra 查詢語言第3版 —— 譯者注)

  • 可以靈活調整對數據的分散式或備份式存儲(通過設置N,R,W之間的關係)(NRW是資料庫布署模型中的概念,N是存儲網路中複製數據的節點數,R是網路中讀數據的節點數,W是網路中寫數據的節點數。一個環境中N值是固定的,設置不同的WR值組合能在數據可用性和數據一致性之間取得不同的平衡,可參考 CAP 定理 —— 譯者注)
  • 按列查詢,按keys值排序後存儲(需要包含你想要搜索的任何信息)(Cassandra 的數據模型借鑒自 BigTable 的列式存儲,列式存儲可以理解成這樣,將行ID、列簇號,列號以及時間戳一起,組成一個Key,然後將Value按Key的順序進行存儲 —— 譯者注)
  • 類似 BigTable 的特性:列、列簇
  • 支持分散式 hash 表,使用「類 SQL」 語言 —— CQL(但沒有 SQL 中的 JOIN 語句)
  • 可以為數據設置一個過期時間(使用 INSERT 指令)
  • 寫性能遠高於讀性能(讀性能的瓶頸是磁碟 IO)
  • 可使用 Hadoop 的映射和簡化(map/reduce)編程模型
  • 所有節點都相似,這點與 Hadop/HBase 架構不同
  • 可靠的跨數據中心備份解決方案

應用場景:

  • 寫操作多於讀操作的環境(比如日誌系統)
  • 如果系統全部由 JAVA 組成(「沒人會因為使用了 Apache 許可下的產品而被炒魷魚」(此句貌似是網上有人針對「Apache considered harmful」一文所作的回應 —— 譯者注))

使用案例:

銀行、金融機構;寫性能強於讀性能,所以 Cassandra 天生就是用來作數據分析的。

Hypertable 0.9.6.5版

開發語言: C++

主要特性: HBase 的精簡版,但比 HBase 更快

許可證: GPL 2.0

數據傳輸格式: Thrift,C++庫,或者 HQL shell

  • 採用與 Google BigTable 相似的設計
  • 運行在 Hadoop HDFS 之上
  • 使用自己的「類 SQL」語言 —— HQL
  • 可以根據 key 值、單元(cell)進行查找,可以在列簇上查找
  • 查詢數據可以指定 key 或者列的範圍
  • 由百度公司贊助(百度早在2009年就成為這個項目的贊助商了 —— 好吧譯者表示有點大驚小怪了:P)
  • 能保留一個值的 N 個歷史版本
  • 表在命名空間內定義
  • 使用 Hadoop 的 Map/reduce 模型

應用場景:

  • 假如你需要一個更好的HBase,就用Hypertable吧

使用案例:

與HBase一樣,就是搜索引擎被換了下;分析日誌數據的系統;適用於瀏覽大規模二維非關係型數據表。

Accumulo 1.4版

開發語言: Java 和 C++

主要特性: 一個有著單元級安全的 BigTable

許可證: Apache

數據傳輸格式: Thrift

  • 另一個 BigTable 的複製品,也是跑在 Hadoop 的上層
  • 單元級安全保證
  • 允許使用比內存容量更大的數據列
  • 通過 C++ 的 STL 可保持數據從 JAVA 環境的內存映射出來
  • 使用 Hadoop 的 Map/reduce 模型
  • 支持在伺服器端編程

應用場景:

  • HBase的替代品

使用案例:

與HBase一樣,就是搜索引擎被換了下;分析日誌數據的系統;適用於瀏覽大規模二維非關係型數據表。

特殊用途

Neo4j V1.5M02 版

開發語言: Java

主要特性: 圖形化資料庫

許可證: GPL,AGPL(商業用途)

數據傳輸格式: HTTP/REST(或內嵌在 Java 中)

  • 可獨立存在,或內嵌在 JAVA 的應用中
  • 完全的 ACID 保證(包括正在處理的數據)
  • 節點和節點的關係都可以擁有原數據
  • 集成基於「模式匹配」的查詢語言(Cypher)
  • 支持「Gremlin」圖形轉化語言
  • 可對節點與節點關係進行索引
  • 良好的自包含網頁管理技術
  • 多個演算法實現高級文件查找功能
  • 可對 key 與 key 的關係進行索引
  • 優化讀性能
  • 在 JAVA API 中實現事務處理
  • 可運行腳本 Groovy 腳本
  • 在商用版本中提供在線備份,高級監控和高可用性功能

應用場景:

  • 適用於用圖形顯示複雜的交互型數據。

使用案例:

搜尋社交關係網、公共傳輸鏈、公路路線圖、或網路拓撲結構

ElasticSearch 0.20.1 版

開發語言: Java

主要特性: 高級搜索

許可證: Apache

數據傳輸格式: 通過 HTTP 使用 JSON 進行數據索引(插件:Thrift, memcached)

  • 以 JSON 形式保存數據
  • 提供版本升級功能
  • 有父文檔和子文檔功能
  • 文檔有過期時間
  • 提供複雜多樣的查詢指令,可使用腳本
  • 支持寫操作一致性的三個級別:ONE、QUORUM、ALL
  • 支持通過分數排序
  • 支持通過地理位置排序
  • 支持模糊查詢(通過近似數據查詢等方式實現)
  • 支持非同步複製
  • 自動升級,也可通過設置腳本升級
  • 可以維持自動的「統計組」(對調試很有幫助)
  • 只有一個開發者(kimchy)

應用場景:

  • 當你有可伸縮性很強的項目並且想擁有「高級搜索」功能。

使用案例:

可布署一個約會服務,提供不同年齡、不同地理位置、不同品味的客戶的交友需求。或者可以布署一個基於多項參數的排行榜。

其他

(不怎麼有名,但值得在這裡介紹一下)

Couchbase (ex-Membase) 2.0 版

開發語言: Erlang 和 C

主要特性: 兼容 Memcache,但數據是持久化的,並且支持集群

許可證: Apache

數據傳輸格式: 緩存和擴展(memcached + extensions)

  • 通過 key 訪問數據非常快(20萬以上IOPS)
  • 數據保存在磁碟(不像 Memcache 保存在內存中 —— 譯者注)
  • 在主主互備中,所有節點數據是一致的
  • 提供類似 Memcache 將數據保存在內存的功能
  • 支持重複數據刪除功能
  • 友好的集群管理 Web 界面
  • 支持池和多叢結構的代理(利用 Moxi 項目)
  • 支持 Map/reduce 模式
  • 支持跨數據中心備份

應用場景:

  • 適用於低延遲數據訪問系統,高並發和高可用系統。

使用案例:

低延遲可用於廣告定投;高並發可用於在線遊戲(如星佳公司)。

VoltDB 2.8.4.1版

開發語言: Java

主要特性: 快速的事務處理和數據變更

許可證: GPL 3

數據傳輸格式: 專有方式

  • 運行在內存的關係型資料庫
  • 可以將數據導入到 Hadoop
  • 支持 ANSI SQL
  • 在 JAVA 環境中保存操作過程
  • 支持跨數據中心備份

應用場景:

  • 適用於在大量傳入數據中保證快速反應能力的場合。

使用案例:

銷售點數據分析系統;工廠控制系統。

Scalaris 0.5版

開發語言: Erlang

主要特性: 分散式 P2P 鍵值存儲

許可證: Apache

數據傳輸和存儲的方式: 自有方式和 基於JSON的遠程過程調用協議

  • 數據保存在內存中(使用 Tokyo Cabinet 作為後台時,數據可以持久化到磁碟中)
  • 使用 YAWS 作為 Web 伺服器
  • Has transactions (an adapted Paxos commit)
  • 支持事務處理(基於 Paxos 提交)(Paxos 是一種基於消息傳遞模型的一致性演算法 —— 譯者注)
  • 支持分散式數據的一致性寫操作
  • 根據 CAP 定理,數據一致性要求高於數據可用性(前提是在一個比較大的網路分區環境下工作)(CAP 定理:數據一致性consistency、數據可用性availability、分隔容忍partition tolerance是分散式計算系統的三個屬性,一個分散式計算系統不可能同時滿足全部三項)

應用場景:

  • 如果你喜歡 Erlang 並且想要使用 Mnesia 或 DETS 或 ETS,但你需要一個能使用多種語言(並且可擴展性強於 ETS 和 DETS)的技術,那就選它吧。

使用案例:

使用基於 Erlang 的系統,但是想通過 Python、Ruby 或 JAVA 訪問資料庫

Kyoto Tycoon 0.9.56版

開發語言: C++

主要特性: 輕量級網路資料庫管理系統

許可證: GPL

數據傳輸和存儲的方式: HTTP (TSV-RPC or REST)

  • 基於 Kyoto Cabinet, 是 Tokyo Cabinet 的成功案例
  • 支持多種存儲後端:Hash,樹、目錄等等(所有概念都是從 Kyoto Cabinet 那裡來的)
  • Kyoto Cabinet 可以達到每秒100萬次插入/查詢操作(但是 Tycoon 由於瓶頸問題,性能比 Cabinet 要差點)
  • 伺服器端支持 Lua 腳本語言
  • 支持 C、JAVA、Python、Ruby、Perl、Lua 等語言
  • 使用訪問者模式開發(visitor patten:讓開發者能在不修改類層次結構的前提下,定義該類層次結構的操作 —— 不明白就算了,譯者也不明白)
  • 支持熱備、非同步備份
  • 支持內存資料庫在後端執行快照
  • 自動過期處理(可用來布署一個緩存伺服器)

應用場景:

  • 當你想要一個很精準的後端存儲演算法引擎,並且速度是剛需的時候,玩玩 Kyoto Tycoon 吧。

使用案例:

緩存伺服器;股價查詢系統;數據分析系統;實時數據控制系統;實時交互系統;memcached的替代品。

當然,上述系統的特點肯定不止列出來這麼點。我只是列出了我認為很關鍵的信息。另外科技發展迅猛,技術改變得非常快。

附:現在下定論比較孰優孰劣還為時過早。上述資料庫的版本號以及特性我會一個一個慢慢更新。相信我,這些資料庫的特性不會變得很快。

via: http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

譯者:bazz2 校對:wxy

本文由 LCTT 原創翻譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國