如何學(xué)習(xí)MongoDB?
MongoDB日趨流行,作為一個(gè)開(kāi)發(fā)/運(yùn)維,如何快速上手MongoDB?或者有哪些推薦的學(xué)習(xí)MongoDB的方式?
寫在最前:請(qǐng)使用mongodb 3.2或以上版本進(jìn)行學(xué)習(xí),或者直接從3.4開(kāi)始。另外,百度出來(lái)的中文資料,請(qǐng)查看15年及以后的信息,可以少走很多彎路。另外,建議使用linux系統(tǒng)進(jìn)行學(xué)習(xí),方便排錯(cuò)。
英文比較好的小伙伴:
如果英語(yǔ)不好,建議先花時(shí)間學(xué)英語(yǔ)
1. 強(qiáng)烈推薦MongoDB官方的教程,MongoDB在線大學(xué),無(wú)論開(kāi)發(fā)還是DBA,都可以找到適合自己的視頻教程。因?yàn)?a href="http://m.xsypw.cn/v/" target="_blank">視頻有英語(yǔ)字幕,聽(tīng)不懂的同學(xué),多多暫停,看一下字幕都能理解。
每節(jié)課結(jié)束都有相應(yīng)的作業(yè),可以自己用來(lái)練手。而且作業(yè)都會(huì)有類似一鍵腳本的東西,幫你配置好需要的實(shí)驗(yàn)環(huán)境。完成作業(yè)后,會(huì)有不少成就感,讓自己可以有學(xué)下去的動(dòng)力。另外,每次作業(yè)和最后的考試都通過(guò)會(huì)有一張結(jié)業(yè)證書。
最后,MongoDB官方的新員工也是從這里開(kāi)始學(xué)習(xí)的,而且課程更新頻率也很高。
2. MongoDB的官方文檔,文檔地址,選擇自己想要看到章節(jié),文檔的內(nèi)容寫的很詳細(xì),而且有的地方直接提供web shell的環(huán)境,讓你實(shí)際操作。
3. MongoDB工程師網(wǎng)站,網(wǎng)站地址,這里可以深入看到一些MongoDB原理的內(nèi)容。此外也推薦看percona公司關(guān)于MongoDB的一些博文
看到英語(yǔ)就頭疼的小伙伴:
暫時(shí)沒(méi)找到較好的基礎(chǔ)視頻教程,IT大咖說(shuō)上面有MongoDB使用案例的視頻,可以一看,不過(guò)不適合初學(xué),需要有一定的基礎(chǔ)。
1. 先從看書開(kāi)始,強(qiáng)烈推薦《MongoDB實(shí)戰(zhàn) 第二版》,因?yàn)檫@本書是3.x版本的,相對(duì)來(lái)說(shuō)內(nèi)容比較新。然后《MongoDB權(quán)威指南 第二版》,這本內(nèi)容蠻多的,不過(guò)已經(jīng)過(guò)時(shí)了。《MongoDB應(yīng)用設(shè)計(jì)模式》關(guān)于MongoDB設(shè)計(jì)適用的書,非常短,值得一看。
2. MongoDB中文社區(qū)有部分官方文檔的翻譯。
3. MongoDB中文社區(qū)的公眾號(hào)及博客,云棲社區(qū)MongoDB板塊
mongodb使用場(chǎng)景
Mongodb是最近流行的NOsql數(shù)據(jù)庫(kù),但一直對(duì)其用在什么場(chǎng)景合適而不清楚。主要知道這個(gè)數(shù)據(jù)庫(kù)是快速開(kāi)發(fā)很合適。但一直歸屬到大數(shù)據(jù)板塊,想要咨詢下Mongodb適用的場(chǎng)景有哪些?在大數(shù)據(jù)板塊充當(dāng)什么角色哪?
常見(jiàn)應(yīng)用場(chǎng)景:
1. 最近單的入手就是存log,因?yàn)閙ongodb本身存的就是json,可以很方便的接入各種存儲(chǔ)日志的地方。然后可以做成相關(guān)監(jiān)控報(bào)表,比如說(shuō)APM,NPM等,比如說(shuō)千尋位置
2. 其他的話要看題主所在的行業(yè)了,不同的行業(yè)有不同的用法,比如說(shuō)信息的展示等等
3. 在網(wǎng)游界,MongoDB也非常流行,比如說(shuō)最近大火的陰陽(yáng)師,數(shù)據(jù)庫(kù)用的就是MongoDB
大數(shù)據(jù)方面,MongoDB有以下三個(gè)優(yōu)勢(shì):
1. 自帶sharding,快速得水平擴(kuò)展,為存儲(chǔ)海量數(shù)據(jù)帶來(lái)便捷
2. 官方提供驅(qū)動(dòng),可以直接對(duì)接hadoop或者spark
客戶場(chǎng)景
1、用在應(yīng)用服務(wù)器的日志記錄,查找起來(lái)比文本靈活,導(dǎo)出也很方便。也是給應(yīng)用練手,從外圍系統(tǒng)開(kāi)始使用MongoDB。
2、在一些第三方信息的獲取或者抓取,因?yàn)镸ongoDB的schema-less,所有格式靈活,不用為了各種格式不一樣的信息專門設(shè)計(jì)統(tǒng)一的格式,極大得減少開(kāi)發(fā)的工作。
3、主要用來(lái)存儲(chǔ)一些監(jiān)控?cái)?shù)據(jù),No schema 對(duì)開(kāi)發(fā)人員來(lái)說(shuō),真的很方便,增加字段不用改表結(jié)構(gòu),而且學(xué)習(xí)成本極低。
4、使用MongoDB做了O2O快遞應(yīng)用,·將送快遞騎手、快遞商家的信息(包含位置信息)存儲(chǔ)在 MongoDB,然后通過(guò) MongoDB 的地理位置查詢,這樣很方便的實(shí)現(xiàn)了查找附近的商家、騎手等功能
特性及優(yōu)勢(shì)
?
行業(yè)應(yīng)用
從目前 阿里云MongoDB云數(shù)據(jù)庫(kù) 上的用戶看,MongoDB 的應(yīng)用已經(jīng)滲透到各個(gè)領(lǐng)域,比如游戲、物流、電商、內(nèi)容管理、社交、物聯(lián)網(wǎng)、視頻直播等,以下是幾個(gè)實(shí)際的應(yīng)用案例。
游戲場(chǎng)景:使用 MongoDB 存儲(chǔ)游戲用戶信息,用戶的裝備、積分等直接以內(nèi)嵌文檔的形式存儲(chǔ),方便查詢、更新
物流場(chǎng)景:使用 MongoDB 存儲(chǔ)訂單信息,訂單狀態(tài)在運(yùn)送過(guò)程中會(huì)不斷更新,以 MongoDB 內(nèi)嵌數(shù)組的形式來(lái)存儲(chǔ),一次查詢就能將訂單所有的變更讀取出來(lái)。
社交場(chǎng)景:使用 MongoDB 存儲(chǔ)存儲(chǔ)用戶信息,以及用戶發(fā)表的朋友圈信息,通過(guò)地理位置索引實(shí)現(xiàn)附近的人、地點(diǎn)等功能
物聯(lián)網(wǎng)場(chǎng)景:使用 MongoDB 存儲(chǔ)所有接入的智能設(shè)備信息,以及設(shè)備匯報(bào)的日志信息,并對(duì)這些信息進(jìn)行多維度的分析
視頻直播:使用 MongoDB 存儲(chǔ)用戶信息、禮物信息等
如果你還在為是否應(yīng)該使用 MongoDB,不如來(lái)做幾個(gè)選擇題來(lái)輔助決策:
目前云數(shù)據(jù)庫(kù) MongoDB 版:支持三節(jié)點(diǎn)副本集容災(zāi)切換、自動(dòng)備份、一鍵式的數(shù)據(jù)恢復(fù)。支持彈性擴(kuò)容、提供資源監(jiān)控
關(guān)于mongodb的幾個(gè)熱點(diǎn)問(wèn)題
能提供幾個(gè)mongodb的案例嗎?
國(guó)外的例子太多,在mongodb的官網(wǎng)上就有,無(wú)論是金融、傳統(tǒng)等行業(yè),我這里說(shuō)一下國(guó)內(nèi)的案例
金融:
非核心業(yè)務(wù)的話幾乎每家知名企業(yè)都在嘗試使用,比如某國(guó)有銀行用在了apm系統(tǒng),平安科技用在了內(nèi)部系統(tǒng)和日志系統(tǒng)。核心業(yè)務(wù)的話互聯(lián)網(wǎng)金融企業(yè)考拉理財(cái)?shù)拇蠖鄶?shù)業(yè)務(wù)都在mongodb上
傳統(tǒng):
這一塊了解不多,目前知道東方航空用在了下一代旅客服務(wù)系統(tǒng)
互聯(lián)網(wǎng):
互聯(lián)網(wǎng)使用的企業(yè)非常多。媽媽幫的核心系統(tǒng),小紅書的核心系統(tǒng),高德的app展示,千尋位置的日志收集分析,Teambition的核心系統(tǒng),陰陽(yáng)師的數(shù)據(jù)庫(kù),360的移動(dòng)搜索等
Mongodb相對(duì)hbase、MySQL來(lái)說(shuō),有哪些優(yōu)勢(shì)?
這里就簡(jiǎn)單說(shuō)一下題主說(shuō)的幾個(gè)數(shù)據(jù)庫(kù)中,mongodb優(yōu)勢(shì)的地方
vs hbase:
hbase是基于row key存儲(chǔ)寬列的一款nosql,乍一看結(jié)構(gòu)類似mongodb的_id主鍵和可變長(zhǎng)的列數(shù)量。
具體的原理和區(qū)別這里不展開(kāi)。
mongodb的優(yōu)勢(shì)在于輕量化部署非常簡(jiǎn)單,不用像hbase那樣搭一整套hadoop集群,即開(kāi)即用。hbase更適合離線的海量數(shù)據(jù)分析
vs mysqlpg:
這兩款都是關(guān)系型數(shù)據(jù)庫(kù),所以放在一起比較。
MongoDB的優(yōu)勢(shì)主要有3個(gè)。
1、結(jié)構(gòu)靈活,表結(jié)構(gòu)更改比較自由,不用每次alter的時(shí)候付出代價(jià),適合業(yè)務(wù)快速迭代,而且json原生和大多數(shù)的語(yǔ)言有天然的契合。還支持?jǐn)?shù)組,嵌套文檔等數(shù)據(jù)類型
2、自帶高可用,自動(dòng)主從切換(副本集)
3、自帶水平分片(分片),內(nèi)置了路由,配置管理。應(yīng)用只要連接路由,對(duì)應(yīng)用來(lái)說(shuō)是透明的。
MongoDB是否支持事務(wù)?
MongoDB只支持行級(jí)的事務(wù),或者說(shuō)支持原子性,單行的操作要么全部成功,要么全部失敗。
需要事務(wù)的話,得自己用代碼實(shí)現(xiàn)二次提交作,模擬事務(wù)的功能,官方文檔有相關(guān)的說(shuō)明。
https://docs.mongodb.com/manual/tutorial/perform-two-phase-commits/
這里放一個(gè)小彩蛋,因?yàn)閃iredTiger引擎本身支持事務(wù),官方正考慮在MongoDB上實(shí)現(xiàn)事務(wù)。
MongoDB黑客勒索事件是怎么回事?
這次鬧的沸沸揚(yáng)揚(yáng)的黑客事件主要是用戶自己的MongoDB沒(méi)有打開(kāi)用戶驗(yàn)證,而且把MongoDB保護(hù)在公網(wǎng)。打個(gè)比方就是你家住在鬧市區(qū),晚上沒(méi)人的時(shí)候,門還沒(méi)鎖,然后就被小偷光顧了。
要解決問(wèn)題很簡(jiǎn)單,首先,千,萬(wàn),不,要把MongoDB暴露在公網(wǎng),如果要外網(wǎng)訪問(wèn),無(wú)論是vpn還是ssh隧道都行。
此外,打開(kāi)Mongodb的驗(yàn)證,這樣所有操作都要用戶名密碼了但是短連接會(huì)因?yàn)轵?yàn)證造成資源損耗,這里就自己權(quán)衡了。阿里云和騰訊云針對(duì)這個(gè)問(wèn)題都做了優(yōu)化。
MONGODB數(shù)據(jù)庫(kù)備份只能用mongodump嗎?
常用而且通用的方法就是mongodump
備份還有這幾種方法:
1. mongoexport(這個(gè)是邏輯備份,備份出json和csv)
2. 做磁盤快照
3. 停機(jī)后冷拷貝
Mongo大數(shù)據(jù)遷移方案,遷移過(guò)程中需要注意什么,集群的時(shí)候呢?
你的遷移是指怎么遷移?一般來(lái)說(shuō)mongodump來(lái)遷移即可。
集群遷移的話,建議直接在目標(biāo)服務(wù)器上面搭建從節(jié)點(diǎn)。全部搭建完之后,把新的從節(jié)點(diǎn)升級(jí)為主節(jié)點(diǎn),再把老機(jī)器剔除出集群。
不過(guò)如果數(shù)據(jù)量太大,而且平時(shí)數(shù)據(jù)更改很頻繁的話,初始化同步的過(guò)程可能Oplog不夠用。
方案1
先升級(jí)到3.4版本,這個(gè)版本在初始化同步的時(shí)候會(huì)抓取oplog
方案2
停機(jī)一臺(tái)從節(jié)點(diǎn),物理復(fù)制到局域網(wǎng)中心機(jī)器,當(dāng)從節(jié)點(diǎn)啟動(dòng)
這臺(tái)從節(jié)點(diǎn)配置一個(gè)大oplog,然后遷移目標(biāo)端的從節(jié)點(diǎn)從這臺(tái)oplog從節(jié)點(diǎn)同步
MONGODB的水平擴(kuò)展是什么原理?
MONGODB的水平擴(kuò)展是依賴什么原理哪?如果由于前期規(guī)劃不足,導(dǎo)致需要通過(guò)擴(kuò)容的方式提高M(jìn)OGODB的能力,在給他水平擴(kuò)展的時(shí)候是否復(fù)雜哪?是否將原有數(shù)據(jù)重新同步?是否可以在線處理哪?
MongoDB的水平擴(kuò)展主要依賴的原理相當(dāng)有一個(gè)config組件負(fù)責(zé)管理元數(shù)據(jù)的位置,然后mongo的路由會(huì)從config取得數(shù)據(jù)所在或者應(yīng)該在的數(shù)據(jù)節(jié)點(diǎn)位置,從而去對(duì)應(yīng)的數(shù)據(jù)節(jié)點(diǎn)讀寫(路由本身也會(huì)有緩存)
我這里只是簡(jiǎn)單的說(shuō)明,具體可以看官方文檔sharding一章節(jié)
水平擴(kuò)展的步驟不算復(fù)雜,不用將數(shù)據(jù)重新同步(但是從單點(diǎn)到副本集還是要做同步的),整個(gè)過(guò)程可以在線處理(不過(guò)3.4開(kāi)始,在設(shè)置為sharding模式的時(shí)候需要滾動(dòng)重啟一下mongod進(jìn)程,加上shardsvr的配置)
mongodb集群實(shí)際應(yīng)用中如何選擇片鍵和索引?
分片方式有兩種:
1. 范圍分片:這個(gè)類似分區(qū)表,合適的分片條件可以增加查詢性能,更優(yōu)的設(shè)計(jì)可以優(yōu)化寫入性能。
比如說(shuō)數(shù)據(jù)1、2在節(jié)點(diǎn)a,數(shù)據(jù)3、4、5在節(jié)點(diǎn)b,數(shù)據(jù)6、7在節(jié)點(diǎn)c
2. hash分片:使數(shù)據(jù)均勻落在不同的分片節(jié)點(diǎn)上,優(yōu)化寫入性能,但是讀的話需要掃所有節(jié)點(diǎn)
好的片鍵需要以下的考量:
1. 片鍵中文檔盡可能的少,避免單chunk過(guò)大,這個(gè)會(huì)導(dǎo)致無(wú)法balance
2. 片鍵離散分布,這樣可以在不同的節(jié)點(diǎn)寫入(避免自增主鍵或者時(shí)間戳單獨(dú)的做片鍵,這樣會(huì)存在寫入熱點(diǎn)問(wèn)題)
3. 大多數(shù)的查詢的條件要包含你的分片條件
舉一個(gè)例子:
一個(gè)日志記錄系統(tǒng),有hostname,timestamp,message等信息,經(jīng)常會(huì)有查詢需求,這里用范圍分片
很多人可能會(huì)直接拿timestamp做范圍片鍵,這樣可以覆蓋到常見(jiàn)的時(shí)間查詢需求,但是所有寫的請(qǐng)求都落到同一臺(tái),造成熱點(diǎn)問(wèn)題。而且查hostname的時(shí)候會(huì)掃描所有節(jié)點(diǎn)。
好的方案就是選擇hostname和timestamp做一個(gè)聯(lián)合的分片條件,一來(lái)數(shù)據(jù)分布更均勻,二來(lái)基于主機(jī)和時(shí)間的查詢也可以優(yōu)化到。
MongoDB如何進(jìn)行升級(jí)?
這里升級(jí)以副本集為例
小版本升級(jí):
非常簡(jiǎn)單,直接停機(jī),替換二進(jìn)制文件,啟動(dòng)即可。先升級(jí)從節(jié)點(diǎn),再升級(jí)主節(jié)點(diǎn),避免業(yè)務(wù)中斷。
大版本升級(jí)(不更換存儲(chǔ)引擎):
也是直接替換即可,有的版本(如升級(jí)到3.4),想啟動(dòng)新版本功能,需要執(zhí)行
db.adminCommand( { setFeatureCompatibilityVersion: “3.4” } )
大版本升級(jí)(換存儲(chǔ)引擎):
數(shù)據(jù)文件需要重做,新建從節(jié)點(diǎn),升級(jí)那個(gè)從節(jié)點(diǎn)的二進(jìn)制文件,配置使用新的引擎,將數(shù)據(jù)完整的同步,然后該從節(jié)點(diǎn)升級(jí)為主節(jié)點(diǎn),其他節(jié)點(diǎn)正常升級(jí)。
不建議跨大版本升級(jí),否則會(huì)有不確定的問(wèn)題。
最后,官方文檔非常詳細(xì),一步一步的操作都有
https://docs.mongodb.com/manual/release-notes/3.4-upgrade-replica-set/
Mongodb升級(jí)報(bào)錯(cuò)?
mongodb副本集從2.6升級(jí)到3.0,密碼驗(yàn)證升級(jí)了 報(bào)如下錯(cuò)誤
Failed to authenticate xxx@xxxx with mechanism MONGODB-CR: AuthenticationFailed MONGODB-CR credentials missing in the user document
應(yīng)該如何解決呢? 是把原來(lái)的用戶刪了,用3.0的在創(chuàng)建一個(gè)一樣的用戶嗎? 有沒(méi)有更好的辦法呢?
原因是因?yàn)?.0開(kāi)始mongodb的認(rèn)證加密模式從Mongodb-cr改到了sha1
治標(biāo)方法:
先關(guān)閉驗(yàn)證,然后把
admin庫(kù)中system.version表的
{ “_id” : “authSchema”, “currentVersion” : 3 }
那個(gè)currentVersion改成3(默認(rèn)是5),就可以了
治本方法:
1. 升級(jí)客戶端的驅(qū)動(dòng)(遲早要升級(jí)了,不然不支持新功能)
2. 上面那個(gè)currentVersion別動(dòng)
參考:https://jira.mongodb.org/browse/SERVER-17459
MongoDB在出現(xiàn)負(fù)載過(guò)高的情況下如何處理?
原來(lái)遇到過(guò)一次mongodb負(fù)載過(guò)高的情況,主庫(kù)和從庫(kù)的負(fù)載突然就上來(lái)了,CPU占有率都到了100%,這種情況下,如何處理?mongodb是做的副本集,但是主庫(kù)和從庫(kù)這個(gè)時(shí)候是負(fù)載同時(shí)來(lái)的。
簡(jiǎn)單點(diǎn)看db.currentop,看mongotop和mongostat,currentop相當(dāng)于當(dāng)前所有在執(zhí)行的任務(wù),看一下是在執(zhí)行什么,有多少數(shù)量。也可以去slowlog里面看是否有記錄,然后mongotop和mongostat是用來(lái)查看和平時(shí)比有什么異常信息。
可能的情況有連接數(shù)突然變高,查詢突然變多,有一種查詢沒(méi)有索引,建立大表的索引等等。
評(píng)論