MongoDB、Hbase、Redis等NoSQL優(yōu)劣勢、應(yīng)用場景
NoSQL的四大種類
NoSQL數(shù)據(jù)庫在整個數(shù)據(jù)庫領(lǐng)域的江湖地位已經(jīng)不言而喻。在大數(shù)據(jù)時代,雖然RDBMS很優(yōu)秀,但是面對快速增長的數(shù)據(jù)規(guī)模和日漸復(fù)雜的數(shù)據(jù)模型,RDBMS漸漸力不從心,無法應(yīng)對很多數(shù)據(jù)庫處理任務(wù),這時NoSQL憑借易擴展、大數(shù)據(jù)量和高性能以及靈活的數(shù)據(jù)模型成功的在數(shù)據(jù)庫領(lǐng)域站穩(wěn)了腳跟。
目前大家基本認同將NoSQL數(shù)據(jù)庫分為四大類:鍵值存儲數(shù)據(jù)庫,文檔型數(shù)據(jù)庫,列存儲數(shù)據(jù)庫和圖形數(shù)據(jù)庫,其中每一種類型的數(shù)據(jù)庫都能夠解決關(guān)系型數(shù)據(jù)不能解決的問題。在實際應(yīng)用中,NoSQL數(shù)據(jù)庫的分類界限其實沒有那么明顯,往往會是多種類型的組合體。
主流nosql的詳解:MongoDB、Hbase、Redis
MongoDB
MongoDB 是一個高性能,開源,無模式的文檔型數(shù)據(jù)庫,開發(fā)語言是C++。它在許多場景下可用于替代統(tǒng)的關(guān)系型數(shù)據(jù)庫或鍵/值存儲方式。
1.MongoDB特點
- 所用語言:C++
- 特點:保留了SQL一些友好的特性(查詢,索引)。
- 使用許可: AGPL(發(fā)起者: Apache)
- 協(xié)議: Custom, binary( BSON)
- Master/slave復(fù)制(支持自動錯誤恢復(fù),使用 sets 復(fù)制)
- 內(nèi)建分片機制
- 支持 javascript表達式查詢
- 可在服務(wù)器端執(zhí)行任意的 javascript函數(shù)
- update-in-place支持比CouchDB更好
- 在數(shù)據(jù)存儲時采用內(nèi)存到文件映射
- 對性能的關(guān)注超過對功能的要求
- 建議***打開日志功能(參數(shù) --journal)
- 在32位操作系統(tǒng)上,數(shù)據(jù)庫大小限制在約2.5Gb
- 空數(shù)據(jù)庫大約占 192Mb
- 采用 GridFS存儲大數(shù)據(jù)或元數(shù)據(jù)(不是真正的文件系統(tǒng))
2.MongoDB優(yōu)點:
1)更高的寫負載,MongoDB擁有更高的插入速度。
2)處理很大的規(guī)模的單表,當數(shù)據(jù)表太大的時候可以很容易的分割表。
3)高可用性,設(shè)置M-S不僅方便而且很快,MongoDB還可以快速、安全及自動化的實現(xiàn)節(jié)點 (數(shù)據(jù)中心)故障轉(zhuǎn)移。
4)快速的查詢,MongoDB支持二維空間索引,比如管道,因此可以快速及精確的從指定位置 獲取數(shù)據(jù)。MongoDB在啟動后會將數(shù)據(jù)庫中的數(shù)據(jù)以文件映射的方式加載到內(nèi)存中。如果內(nèi) 存資源相當豐富的話,這將極大地提高數(shù)據(jù)庫的查詢速度。
5)非結(jié)構(gòu)化數(shù)據(jù)的爆發(fā)增長,增加列在有些情況下可能鎖定整個數(shù)據(jù)庫,或者增加負載從而 導(dǎo)致性能下降,由于MongoDB的弱數(shù)據(jù)結(jié)構(gòu)模式,添加1個新字段不會對舊表格有任何影響, 整個過程會非常快速。
3.MongoDB缺點:
1)不支持事務(wù)。
2)MongoDB占用空間過大 。
3)MongoDB沒有成熟的維護工具。
4.MongoDB應(yīng)用場景
1.)適用于實時的插入、更新與查詢的需求,并具備應(yīng)用程序?qū)崟r數(shù)據(jù)存儲所需的復(fù)制及高度伸縮性;
2) 非常適合文檔化格式的存儲及查詢;
3.)高伸縮性的場景:MongoDB 非常適合由數(shù)十或者數(shù)百臺服務(wù)器組成的數(shù)據(jù)庫。
4.)對性能的關(guān)注超過對功能的要求。
HBase
HBase 是 Apache Hadoop 中的一個子項目,屬于 bigtable 的開源版本,所實現(xiàn)的語言為Java(故依賴 Java SDK)。HBase 依托于 Hadoop 的 HDFS(分布式文件系統(tǒng))作為最基本存儲基礎(chǔ)單元。
1.HBase 特點:
- 所用語言: Java
- 特點:支持數(shù)十億行X上百萬列
- 使用許可: Apache
- 協(xié)議:HTTP/REST (支持 Thrift,見編注4)
- 在 BigTable之后建模
- 采用分布式架構(gòu) Map/reduce
- 對實時查詢進行優(yōu)化
- 高性能 Thrift網(wǎng)關(guān)
- 通過在server端掃描及過濾實現(xiàn)對查詢操作預(yù)判
- 支持 XML, Protobuf, 和binary的HTTP
- Cascading, hive, and pig source and sink modules
- 基于 Jruby( JIRB)的shell
- 對配置改變和較小的升級都會重新回滾
- 不會出現(xiàn)單點故障
- 堪比MySQL的隨機訪問性能
3. HBase 優(yōu)點
1) 存儲容量大,一個表可以容納上億行,上百萬列;
2.)可通過版本進行檢索,能搜到所需的歷史版本數(shù)據(jù);
3.)負載高時,可通過簡單的添加機器來實現(xiàn)水平切分擴展,跟Hadoop的無縫集成保障了其數(shù)據(jù)可靠性(HDFS)和海量數(shù)據(jù)分析的高性能(MapReduce);
4.)在第3點的基礎(chǔ)上可有效避免單點故障的發(fā)生。
4.HBase 缺點
1. 基于Java語言實現(xiàn)及Hadoop架構(gòu)意味著其API更適用于Java項目;
2. node開發(fā)環(huán)境下所需依賴項較多、配置麻煩(或不知如何配置,如持久化配置),缺乏文檔;
3. 占用內(nèi)存很大,且鑒于建立在為批量分析而優(yōu)化的HDFS上,導(dǎo)致讀取性能不高;
4. API相比其它 NoSql 的相對笨拙。
5.HBase 適用場景
1)bigtable類型的數(shù)據(jù)存儲;
2)對數(shù)據(jù)有版本查詢需求;
3)應(yīng)對超大數(shù)據(jù)量要求擴展簡單的需求。
Redis
Redis 是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。目前由VMware主持開發(fā)工作。
1.Redis 特點:
- 所用語言:C/C++
- 特點:運行異常快
- 使用許可: BSD
- 協(xié)議:類 Telnet
- 有硬盤存儲支持的內(nèi)存數(shù)據(jù)庫,
- 但自2.0版本以后可以將數(shù)據(jù)交換到硬盤(注意, 2.4以后版本不支持該特性!)
- Master-slave復(fù)制(見編注3)
- 雖然采用簡單數(shù)據(jù)或以鍵值索引的哈希表,但也支持復(fù)雜操作,例如 ZREVRANGEBYSCORE。
- INCR & co (適合計算極限值或統(tǒng)計數(shù)據(jù))
- 支持 sets(同時也支持 union/diff/inter)
- 支持列表(同時也支持隊列;阻塞式 pop操作)
- 支持哈希表(帶有多個域的對象)
- 支持排序 sets(高得分表,適用于范圍查詢)
- Redis支持事務(wù)
- 支持將數(shù)據(jù)設(shè)置成過期數(shù)據(jù)(類似快速緩沖區(qū)設(shè)計)
- Pub/Sub允許用戶實現(xiàn)消息機制
2. Redis 優(yōu)勢
1)非常豐富的數(shù)據(jù)結(jié)構(gòu);
2.)Redis提供了事務(wù)的功能,可以保證一串 命令的原子性,中間不會被任何操作打斷;
3.)數(shù)據(jù)存在內(nèi)存中,讀寫非常的高速,可以達到10w/s的頻率。
3.Redis 缺點
1) Redis3.0后才出來官方的集群方案,但仍存在一些架構(gòu)上的問題;
2.)持久化功能體驗不佳——通過快照方法實現(xiàn)的話,需要每隔一段時間將整個數(shù)據(jù)庫的數(shù)據(jù)寫到磁盤上,代價非常高;而aof方法只追蹤變化的數(shù)據(jù),類似于mysql的binlog方法,但追加log可能過大,同時所有操作均要重新執(zhí)行一遍,恢復(fù)速度慢;
3)由于是內(nèi)存數(shù)據(jù)庫,所以,單臺機器,存儲的數(shù)據(jù)量,跟機器本身的內(nèi)存大小。雖然redis本身有key過期策略,但是還是需要提前預(yù)估和節(jié)約內(nèi)存。如果內(nèi)存增長過快,需要定期刪除數(shù)據(jù)。
4.Redis 應(yīng)用場景:
***應(yīng)用場景:適用于數(shù)據(jù)變化快且數(shù)據(jù)庫大小可遇見(適合內(nèi)存容量)的應(yīng)用程序。
例如:微博、數(shù)據(jù)分析、實時數(shù)據(jù)搜集、實時通訊等。