NoSQL的四大種類
NoSQL資料庫在整個資料庫領域的江湖地位已經不言而喻。在大資料時代,雖然RDBMS很優秀,但是面對快速增長的資料規模和日漸複雜的資料模型,RDBMS漸漸力不從心,無法應對很多資料庫處理任務,這時NoSQL憑借易擴充、大資料量和高性能以及靈活的資料模型成功的在資料庫領域站穩了腳跟。
目前大家基本認同将NoSQL資料庫分為四大類:鍵值存儲資料庫,文檔型資料庫,列存儲資料庫和圖形資料庫,其中每一種類型的資料庫都能夠解決關系型資料不能解決的問題。在實際應用中,NoSQL資料庫的分類界限其實沒有那麼明顯,往往會是多種類型的組合體。
分類 | Examples舉例 | 典型應用場景 | 資料模型 | 優點 | 缺點 |
---|---|---|---|---|---|
鍵值(key-value) | Tokyo Cabinet/Tyrant Redis Voldemort Oracle BDB | 内容緩存,主要用于處理大量資料的高通路負載,也用于一些日志系統等等。 | Key 指向 Value 的鍵值對,通常用hash table來實作 | 查找速度快 | 資料無結構化,通常隻被當作字元串或者二進制資料 |
列存儲資料庫 | Cassandra HBase Riak | 分布式的檔案系統 | 以列簇式存儲,将同一列資料存在一起 | 查找速度快,可擴充性強,更容易進行分布式擴充 | 功能相對局限 |
文檔型資料庫 | CouchDB MongoDb | Web應用(與Key-Value類似,Value是結構化的,不同的是資料庫能夠了解Value的内容) | Key-Value對應的鍵值對,Value為結構化資料 | 資料結構要求不嚴格,表結構可變,不需要像關系型資料庫一樣需要預先定義表結構 | 查詢性能不高,而且缺乏統一的查詢文法。 |
圖形(Graph)資料庫 | Neo4J InfoGrid Infinite Graph | 社交網絡,推薦系統等。專注于建構關系圖譜 | 圖結構 | 利用圖結構相關算法。比如最短路徑尋址,N度關系查找等 | 很多時候需要對整個圖做計算才能得出需要的資訊,而且這種結構不太好做分布式的叢集方案 |
主流 NoSQL 的詳解:MongoDB、Hbase、Redis
MongoDB
- MongoDB 是一個高性能,開源,無模式的文檔型資料庫,開發語言是C++。它在許多場景下可用于替代統的關系型資料庫或鍵/值存儲方式。
MongoDB特點
- 所用語言:C++
- 特點:保留了SQL一些友好的特性(查詢,索引)。
- 使用許可: AGPL(發起者: Apache)
- 協定: Custom, binary( BSON)
- Master/slave複制(支援自動錯誤恢複,使用 sets 複制)
- 内建分片機制
- 支援 javascript表達式查詢
- 可在伺服器端執行任意的 javascript函數
- update-in-place支援比CouchDB更好
- 在資料存儲時采用記憶體到檔案映射
- 對性能的關注超過對功能的要求
- 建議最好打開日志功能(參數 --journal)
- 在32位作業系統上,資料庫大小限制在約2.5Gb
- 空資料庫大約占 192Mb
- 采用 GridFS存儲大資料或中繼資料(不是真正的檔案系統)
MongoDB優點
- 更高的寫負載,MongoDB擁有更高的插入速度。
- 處理很大的規模的單表,當資料表太大的時候可以很容易的分割表。
- 高可用性,設定M-S不僅友善而且很快,MongoDB還可以快速、安全及自動化的實作節點 (資料中心)故障轉移。
- 快速的查詢,MongoDB支援二維空間索引,比如管道,是以可以快速及精确的從指定位置 擷取資料。MongoDB在啟動後會将資料庫中的資料以檔案映射的方式加載到記憶體中。如果内 存資源相當豐富的話,這将極大地提高資料庫的查詢速度。
- 非結構化資料的爆發增長,增加列在有些情況下可能鎖定整個資料庫,或者增加負載進而 導緻性能下降,由于MongoDB的弱資料結構模式,添加1個新字段不會對舊表格有任何影響, 整個過程會非常快速。
MongoDB缺點
- 不支援事務。
- MongoDB占用空間過大 。
- MongoDB沒有成熟的維護工具。
MongoDB應用場景
- 适用于實時的插入、更新與查詢的需求,并具備應用程式實時資料存儲所需的複制及高度伸縮性。
- 非常适合文檔化格式的存儲及查詢。
- 高伸縮性的場景:MongoDB 非常适合由數十或者數百台伺服器組成的資料庫。
- 對性能的關注超過對功能的要求。
HBase
- HBase 是 Apache Hadoop 中的一個子項目,屬于 bigtable 的開源版本,所實作的語言為Java(故依賴 Java SDK)。HBase 依托于 Hadoop 的 HDFS(分布式檔案系統)作為最基本存儲基礎單元。
HBase 特點
- 所用語言: Java
- 特點:支援數十億行X上百萬列
- 使用許可: Apache
- 協定:HTTP/REST (支援 Thrift,見編注4)
- 在 BigTable之後模組化
- 采用分布式架構 Map/reduce
- 對實時查詢進行優化
- 高性能 Thrift網關
- 通過在server端掃描及過濾實作對查詢操作預判
- 支援 XML, Protobuf, 和binary的HTTP
- Cascading, hive, and pig source and sink modules
- 基于 Jruby( JIRB)的shell
- 對配置改變和較小的更新都會重新復原
- 不會出現單點故障
- 堪比MySQL的随機通路性能
HBase 優點
- 存儲容量大,一個表可以容納上億行,上百萬列;
- 可通過版本進行檢索,能搜到所需的曆史版本資料;
- 負載高時,可通過簡單的添加機器來實作水準切分擴充,跟Hadoop的無縫內建保障了其資料可靠性(HDFS)和海量資料分析的高性能(MapReduce);
- 在第3點的基礎上可有效避免單點故障的發生。
HBase 缺點
- 基于Java語言實作及Hadoop架構意味着其API更适用于Java項目;
- node開發環境下所需依賴項較多、配置麻煩(或不知如何配置,如持久化配置),缺乏文檔;
- 占用記憶體很大,且鑒于建立在為批量分析而優化的HDFS上,導緻讀取性能不高;
- API相比其它 NoSql 的相對笨拙。
HBase 适用場景
- bigtable類型的資料存儲;
- 對資料有版本查詢需求;
- 應對超大資料量要求擴充簡單的需求。
Redis
- Redis 是一個開源的使用ANSI C語言編寫、支援網絡、可基于記憶體亦可持久化的日志型、Key-Value資料庫,并提供多種語言的API。目前由VMware主持開發工作。
Redis 特點
- 所用語言:C/C++
- 特點:運作異常快
- 使用許可: BSD
- 協定:類 Telnet
- 有硬碟存儲支援的記憶體資料庫,
- 但自2.0版本以後可以将資料交換到硬碟(注意, 2.4以後版本不支援該特性!)
- Master-slave複制(見編注3)
- 雖然采用簡單資料或以鍵值索引的哈希表,但也支援複雜操作,例如 ZREVRANGEBYSCORE。
- INCR & co (适合計算極限值或統計資料)
- 支援 sets(同時也支援 union/diff/inter)
- 支援清單(同時也支援隊列;阻塞式 pop操作)
- 支援哈希表(帶有多個域的對象)
- 支援排序 sets(高得分表,适用于範圍查詢)
- Redis支援事務
- 支援将資料設定成過期資料(類似快速緩沖區設計)
- Pub/Sub允許使用者實作消息機制
Redis 優勢
- 非常豐富的資料結構。
- Redis提供了事務的功能,可以保證一串 指令的原子性,中間不會被任何操作打斷。
- 資料存在記憶體中,讀寫非常的高速,可以達到10w/s的頻率。
Redis 缺點
- Redis3.0後才出來官方的叢集方案,但仍存在一些架構上的問題。
- 持久化功能體驗不佳——通過快照方法實作的話,需要每隔一段時間将整個資料庫的資料寫到磁盤上,代價非常高。
- 而aof方法隻追蹤變化的資料,類似于mysql的binlog方法,但追加log可能過大,同時所有操作均要重新執行一遍,恢複速度慢。
- 由于是記憶體資料庫,是以,單台機器,存儲的資料量,跟機器本身的記憶體大小。雖然redis本身有key過期政策,但是還是需要提前預估和節約記憶體。如果記憶體增長過快,需要定期删除資料。
Redis 應用場景
- 最佳應用場景:适用于資料變化快且資料庫大小可遇見(适合記憶體容量)的應用程式。
- 例如:微網誌、資料分析、實時資料搜集、實時通訊等