關(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),小紅書(shū)的核心系統(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. 做磁盤(pán)快照
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)讀寫(xiě)(路由本身也會(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)化寫(xiě)入性能。
比如說(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)化寫(xiě)入性能,但是讀的話需要掃所有節(jié)點(diǎn)
好的片鍵需要以下的考量:
1. 片鍵中文檔盡可能的少,避免單chunk過(guò)大,這個(gè)會(huì)導(dǎo)致無(wú)法balance
2. 片鍵離散分布,這樣可以在不同的節(jié)點(diǎn)寫(xiě)入(避免自增主鍵或者時(shí)間戳單獨(dú)的做片鍵,這樣會(huì)存在寫(xiě)入熱點(diǎn)問(wèn)題)
3. 大多數(shù)的查詢的條件要包含你的分片條件
舉一個(gè)例子:
一個(gè)日志記錄系統(tǒng),有hostname,timestamp,message等信息,經(jīng)常會(huì)有查詢需求,這里用范圍分片
很多人可能會(huì)直接拿timestamp做范圍片鍵,這樣可以覆蓋到常見(jiàn)的時(shí)間查詢需求,但是所有寫(xiě)的請(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)論