定義
MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)。由C++語(yǔ)言編寫(xiě)。旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。它介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫(kù)的。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似json的bson格式,因此可以存儲(chǔ)比較復(fù)雜的數(shù)據(jù)類型。Mongo最大的特點(diǎn)是他支持的查詢語(yǔ)言非常強(qiáng)大,其語(yǔ)法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z(yǔ)言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫(kù)單表查詢的絕大部分功能,而且還支持對(duì)數(shù)據(jù)建立索引。
特點(diǎn)
-
高性能、易部署、易使用,存儲(chǔ)數(shù)據(jù)非常方便。
主要功能特性
-
面向集合存儲(chǔ),易存儲(chǔ)對(duì)象類型的數(shù)據(jù)。
-
模式自由。
-
支持動(dòng)態(tài)查詢。
-
支持完全索引,包含內(nèi)部對(duì)象。
-
支持查詢。
-
支持復(fù)制和故障恢復(fù)。
-
使用高效的二進(jìn)制數(shù)據(jù)存儲(chǔ),包括大型對(duì)象(如視頻等)。
-
自動(dòng)處理碎片,以支持云計(jì)算層次的擴(kuò)展性。
-
支持RUBY,PYTHON,JAVA,C++,PHP,C#等多種語(yǔ)言。
-
文件存儲(chǔ)格式為BSON(一種JSON的擴(kuò)展)。
-
可通過(guò)網(wǎng)絡(luò)訪問(wèn)。
適用場(chǎng)景
-
作為文檔型DB
MongoDB是文檔型(Document store)的NoSQL數(shù)據(jù)庫(kù),數(shù)據(jù)以文檔的形式在MongoDB中保存,文檔實(shí)際上就是一個(gè)個(gè)JSON字符串,使用JSON的好處是非常直觀,數(shù)據(jù)從MongoDB中讀取出來(lái)后,可無(wú)需轉(zhuǎn)換直接使用;通過(guò)一系列的Key-Value鍵值對(duì)來(lái)表示數(shù)據(jù),且Key-Value鍵值對(duì)支持豐富的數(shù)據(jù)結(jié)構(gòu),Value可以是普通的整型、字符串,可以是數(shù)組,也可以是嵌套的子文檔,使用嵌套的好處是在MongoDB中僅需一次簡(jiǎn)單的查詢就能夠獲取到你所需的數(shù)據(jù)。舉電商領(lǐng)域?yàn)槔?,網(wǎng)易嚴(yán)選上賣的上衣和褲子兩種商品,除了有共同屬性,如產(chǎn)地、價(jià)格、材質(zhì)、顏色等外,還有各自有不同的屬性集,如上衣的獨(dú)有屬性是肩寬、胸圍、袖長(zhǎng)等,褲子的獨(dú)有屬性是臀圍、腳口和褲長(zhǎng)等。
-
地理位置索引
MongoDB還具有強(qiáng)大的索引能力,支持創(chuàng)建唯一索引、二級(jí)索引、TTL索引和地理位置索引。而地理位置索引是MongoDB早已被用戶所熟知的特性,其球面(Spherical)和平面(Flat)兩種模式,提供了豐富的地址位置的表示方式,如2d、2dsphere和GeoJSON等,對(duì)于移動(dòng)App,如地圖軟件、打車軟件、外賣軟件,MongoDB強(qiáng)大的地理位置索引功能使其為最佳選擇;此外,對(duì)于物聯(lián)網(wǎng)、智慧都市等領(lǐng)域,也需要大量的地理位置相關(guān)操作,這些都是MongoDB的競(jìng)技場(chǎng)。
-
高可用和讀寫(xiě)負(fù)載均衡解決方案
MongoDB的復(fù)制集是數(shù)據(jù)庫(kù)領(lǐng)域領(lǐng)先的高可用和讀寫(xiě)負(fù)載均衡解決方案,提供了數(shù)據(jù)自動(dòng)(異步/同步)復(fù)制能力,一個(gè)新節(jié)點(diǎn)加入到復(fù)制集中會(huì)自動(dòng)進(jìn)行數(shù)據(jù)初始同步隨后使用oplog進(jìn)行增量復(fù)制,無(wú)需人工干預(yù);如果復(fù)制集的Primary節(jié)點(diǎn)發(fā)生宕機(jī),MongoDB會(huì)自動(dòng)進(jìn)行主從切換,在復(fù)制集大多數(shù)節(jié)點(diǎn)在線的情況下,能夠基于Raft協(xié)議自動(dòng)地快速選出新的Primary并恢復(fù)讀寫(xiě)服務(wù),無(wú)需人工干預(yù);MongoDB運(yùn)維人員所需做的僅僅是將宕機(jī)節(jié)點(diǎn)重新啟動(dòng),若宕機(jī)的是Primary,則重新啟動(dòng)后,會(huì)自動(dòng)進(jìn)行數(shù)據(jù)回滾并最終成為復(fù)制集的Secondary節(jié)點(diǎn),所以,相比目前的大多數(shù)關(guān)系型數(shù)據(jù)庫(kù),MongoDB復(fù)制集實(shí)現(xiàn)了自動(dòng)復(fù)制和故障切換,大大減低了運(yùn)維復(fù)雜度,解放了DBA。如果你對(duì)數(shù)據(jù)的持久化和可用性有較高的要求,MongoDB復(fù)制集是上佳的選擇。
-
大數(shù)據(jù)
MongoDB是為大數(shù)據(jù)而生的,提供sharding機(jī)制用于實(shí)現(xiàn)業(yè)務(wù)的水平擴(kuò)展。每個(gè)shard都保存業(yè)務(wù)的一部分?jǐn)?shù)據(jù),shard可以配置為復(fù)制集,確保shard上數(shù)據(jù)的高可用性,shard內(nèi)部由一系列連續(xù)的chunk組成,chunk是某一片鍵區(qū)間內(nèi)的數(shù)據(jù)記錄集合;mongos用于業(yè)務(wù)請(qǐng)求的路由,將業(yè)務(wù)負(fù)載分?jǐn)偟讲煌膕hard上,此外mongos還會(huì)對(duì)shard上超過(guò)一定大小的chunk進(jìn)行分裂(split);根據(jù)不同shard中數(shù)據(jù)量的大小,在shard將進(jìn)行chunk遷移(migrate),應(yīng)該說(shuō)sharding提供了完善的業(yè)務(wù)數(shù)據(jù)和負(fù)載水平擴(kuò)展的機(jī)制,對(duì)于物聯(lián)網(wǎng)、日志系統(tǒng)和監(jiān)控系統(tǒng)這類包含TB級(jí)海量數(shù)據(jù)的應(yīng)用場(chǎng)景,使用MongoDB sharding是個(gè)不錯(cuò)的選擇。
怎樣決定選擇使用MongoDB
-
無(wú)需要跨文檔或跨表的事務(wù)及復(fù)雜的join查詢支持
-
敏捷迭代的業(yè)務(wù),需求變動(dòng)頻繁,數(shù)據(jù)模型無(wú)法確定
-
存儲(chǔ)的數(shù)據(jù)格式靈活,不固定,或?qū)儆诎虢Y(jié)構(gòu)化數(shù)據(jù)
-
業(yè)務(wù)并發(fā)訪問(wèn)量大,需數(shù)千的QPS
-
TB級(jí)以上的海量數(shù)據(jù)存儲(chǔ),且數(shù)據(jù)量不斷增加
-
要求存儲(chǔ)的數(shù)據(jù)持久化、不丟失
-
需要99.999%的數(shù)據(jù)高可用性
-
需要大量的地理位置查詢、文本查詢
NoSql與關(guān)系型DB的比較
-
理解ACID與BASE的區(qū)別(ACID是關(guān)系型數(shù)據(jù)庫(kù)強(qiáng)一致性的四個(gè)要求,而B(niǎo)ASE是NoSQL數(shù)據(jù)庫(kù)通常對(duì)可用性及一致性的弱要求原則。
-
理解持久化與非持久化的區(qū)別。這么說(shuō)是因?yàn)橛械腘oSQL系統(tǒng)是純內(nèi)存存儲(chǔ)的。
-
你必須意識(shí)到傳統(tǒng)有關(guān)系型數(shù)據(jù)庫(kù)與NoSQL系統(tǒng)在數(shù)據(jù)結(jié)構(gòu)上的本質(zhì)區(qū)別。傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)通常是基于行的表格型存儲(chǔ),而NoSQL系統(tǒng)包括了列式存儲(chǔ)(Cassandra)、key/value存儲(chǔ)(Memcached)、文檔型存儲(chǔ)(CouchDB)以及圖結(jié)構(gòu)存儲(chǔ)(Neo4j)
-
與傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)有統(tǒng)一的SQL語(yǔ)言操作接口不同,NoSQL系統(tǒng)通常有自己特有的API接口。
-
在架構(gòu)上,你必須搞清楚,NoSQL系統(tǒng)是被設(shè)計(jì)用于成百上千臺(tái)機(jī)器的集群中的,而非共享型數(shù)據(jù)庫(kù)系統(tǒng)的架構(gòu)。
-
在NoSQL系統(tǒng)中,可能你得習(xí)慣一下不知道你的數(shù)據(jù)具體存在何處的情況。
-
在NoSQL系統(tǒng)中,你最好習(xí)慣它的弱一致性。”eventually consistent”(最終一致性)正是BASE原則中的重要一項(xiàng)。比如在Twitter,你在Followers列表中經(jīng)常會(huì)感受到數(shù)據(jù)的延遲。
-
在NoSQL系統(tǒng)中,你要理解,很多時(shí)候數(shù)據(jù)并不總是可用的。
-
你得理解,有的方案是擁有分區(qū)容忍性的,有的方案不一定有。
NoSql中的mongodb,redis,hbase對(duì)比
mongodb
定位是取代關(guān)系型數(shù)據(jù)庫(kù),想當(dāng)一個(gè)主流數(shù)據(jù)庫(kù)。因?yàn)樗蟹墙Y(jié)構(gòu)化、方便擴(kuò)充字段、寫(xiě)性能優(yōu)于mysql。萬(wàn)事萬(wàn)物有利有弊,mongodb的內(nèi)存型緩存內(nèi)容,讓其速度飛快,帶來(lái)內(nèi)存率多,掉電數(shù)據(jù)問(wèn)題等,加上自身代碼還有很多bug帶來(lái)不如老牌關(guān)系型數(shù)據(jù)庫(kù)穩(wěn)定,特別是在主從等分布式環(huán)境,其設(shè)計(jì)也帶來(lái)諸多問(wèn)題。
redis
是一個(gè)小而美的數(shù)據(jù)庫(kù),主要用在key-value 的內(nèi)存緩存,讀寫(xiě)性能極佳,list,set,hash等幾種簡(jiǎn)單結(jié)構(gòu)使得使用也很簡(jiǎn)單。緩存與簡(jiǎn)單是其定位,分布式redis架構(gòu)的出現(xiàn),讓redis更加廣泛的使用,穩(wěn)坐緩存第一把交椅。
hbase
定位非結(jié)構(gòu)化大數(shù)據(jù),可伸縮性好,并不是完全高可用,底層依靠hadoop提供的HDFS,當(dāng)你發(fā)現(xiàn)128GB內(nèi)存雙路CPU25TB存儲(chǔ)只夠一星期的時(shí)候,估計(jì)就沒(méi)有選擇綜合癥了,HBase成了最佳選擇。