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



























