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