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