Mongodb是一種單進(jìn)程且靈活的非關(guān)系型數(shù)據(jù)庫(kù)。但由于其軟件小巧,單進(jìn)程多線程的特點(diǎn)注定不會(huì)存在完善的系統(tǒng)動(dòng)態(tài)性能視圖,這點(diǎn)與mysql類(lèi)似,但個(gè)人認(rèn)為即便與mysql對(duì)比,不足還是顯而易見(jiàn)。此外,對(duì)于運(yùn)維人員來(lái)說(shuō),多數(shù)人習(xí)慣使用字符終端處理問(wèn)題,由于mongodb是基于json,所以輸出都是json格式,這點(diǎn)跟關(guān)系型數(shù)據(jù)庫(kù)輸出的行列格式相比,個(gè)人感覺(jué)可讀性相對(duì)較差。所以,基于運(yùn)維需要的MongDB監(jiān)控能力補(bǔ)齊,是運(yùn)維工作不可或缺工作之一,至于是腳本形式還是工具平臺(tái)形式,都可以基于各自已有IT能力水平有計(jì)劃分步驟的進(jìn)行實(shí)施。畢竟不管白貓黑貓,能抓老鼠的就是好貓。
數(shù)據(jù)庫(kù)性能數(shù)據(jù)獲取診斷方式對(duì)比:
數(shù)據(jù)庫(kù) | 進(jìn)程結(jié)構(gòu) | 獲取、診斷性能問(wèn)題的方式 | 備注 |
oracle | 多進(jìn)程 | 1、有大量的動(dòng)態(tài)性能視圖,如v$session,v$latch等,可進(jìn)行關(guān)聯(lián)查詢反饋當(dāng)前數(shù)據(jù)庫(kù)實(shí)例的會(huì)話等待、會(huì)話CPU、IO等資源消耗等 | |
mysql | 單進(jìn)程多線程 | 1、存在少量多臺(tái)性能視圖可供查詢 | |
mongodb | 單進(jìn)程多線程 | 1、通過(guò)mongotop、mongostat工具診斷 |
在數(shù)據(jù)庫(kù)日常運(yùn)維過(guò)程中,數(shù)據(jù)庫(kù)性能監(jiān)控是重點(diǎn)工作之一。對(duì)于mongodb來(lái)說(shuō),由于在數(shù)據(jù)庫(kù)中不會(huì)保存歷史性能信息,所以我們只能通過(guò)使用集中監(jiān)控軟件或者自己編寫(xiě)腳本的方式采集性能數(shù)據(jù)保存在本地,本文只介紹利用Mongodb自帶工具或者命令采集性能數(shù)據(jù)。
1、操作系統(tǒng)資源使用率監(jiān)控
操作系統(tǒng)CPU、內(nèi)存、IO等資源使用率監(jiān)控,在任一數(shù)據(jù)庫(kù)產(chǎn)品都需要部署,本文不再闡述。
2、mongotop&&mongostat
mongotop和mongostat是mongodb官方提供的兩個(gè)在不同級(jí)別對(duì)數(shù)據(jù)庫(kù)性能進(jìn)行監(jiān)控的工具,可以獲取到實(shí)例全局和表級(jí)的性能數(shù)據(jù)。通過(guò)在操作系統(tǒng)上部署定時(shí)任務(wù)的方式執(zhí)行這兩個(gè)命令并將結(jié)果輸出保存,可用于歷史性能分析。
1)、mongotop
返回?cái)?shù)據(jù)庫(kù)集合級(jí)別的讀寫(xiě)耗時(shí)情況,輸出結(jié)果按照讀寫(xiě)耗時(shí)降序排列,排序越靠前表示該集合訪問(wèn)并發(fā)越大或者說(shuō)該集合上執(zhí)行的MQL語(yǔ)句執(zhí)行計(jì)劃不是最優(yōu)。輸出結(jié)果示例如下:
2)、mongostat
mongostat類(lèi)似操作系統(tǒng)的vmstat命令,返回實(shí)例全局每秒鐘整體性能情況,包括讀寫(xiě)次數(shù)、內(nèi)存占用,鎖隊(duì)列、網(wǎng)絡(luò)、連接數(shù)等信息。如果是集群,建議使用—discover參數(shù)獲取集群全局信息。
oracle有一個(gè)監(jiān)控利器叫Oswatcher,使用mongostat&&mongotop合理編寫(xiě)腳本,在用crontab定時(shí)調(diào)用,可實(shí)現(xiàn)類(lèi)似oswatcher的功能,作為歷史性能數(shù)據(jù)分析。
3、慢查詢分析
mongodb的慢查詢,可以通過(guò)設(shè)置profile后,在system.profile集合或者在數(shù)據(jù)庫(kù)日志中獲取。設(shè)置命令為db.setProfilingLevel(level,options),如db.setProfilingLevel(1,{ slowms: 200 }),表示級(jí)別為1,超過(guò)200ms的操作將被捕獲,設(shè)置級(jí)別為0表示不捕獲,級(jí)別為2表示捕獲所有操作??赏ㄟ^(guò)db.getProfilingStatus()命令查詢當(dāng)前的profile設(shè)置級(jí)別。
1)、system.profile
system.profile是通過(guò)使用db.setProfilingLevel(level,options)命令設(shè)置后在每一個(gè)庫(kù)中生成的固定大小為1MB的集合,該集合根據(jù)設(shè)置的profile級(jí)別保存所有或者超過(guò)指定時(shí)間的操作命令信息,當(dāng)保存數(shù)據(jù)過(guò)多超過(guò)1MB時(shí),會(huì)自動(dòng)清理歷史數(shù)據(jù)。
保存信息示例:
{
"op": "query", --操作類(lèi)型為查詢
"ns": "opn###od.optN###em", --操作的庫(kù)名.集合名
"command": {
"find": "optNu###tem", --集合名稱(chēng)
"filter": { --過(guò)濾條件
"_id": {
"res##id": "1000000000000003733049",
"res##etype": "3002"
}
},
"limit": 1, --limit條數(shù)
"singleBatch": true,
"$db": "opnu###od" --庫(kù)名
},
"keysExamined": 0,
"docsExamined": 0,
"cursorExhausted": true,
"numYield": 0,
"locks": { ---本次操作的鎖信息
"Global": {
"acquireCount": {
"r": NumberLong(2)
}
},
"Database": {
"acquireCount": {
"r": NumberLong(1)
}
},
"Collection": {
"acquireCount": {
"r": NumberLong(1)
}
}
},
"nreturned": 0,
"responseLength": 237,
"protocol": "op_query",
"millis": 77432, --操作耗時(shí),單位為毫秒
"planSummary": "IDHACK", ---執(zhí)行計(jì)劃類(lèi)型
"execStats": {
"stage": "IDHACK",
"nReturned": 0,
"executionTimeMillisEstimate": 0,
"works": 1,
"advanced": 0,
"needTime": 0,
"needYield": 0,
"saveState": 0,
"restoreState": 0,
"isEOF": 1,
"invalidates": 0,
"keysExamined": 0,
"docsExamined": 0
},
"ts": ISODate("2019-11-14T06:47:45.285Z"),--操作時(shí)間
"client": "10***227", ---客戶端IP
"allUsers": [
{
"user": "user_admin",
"db": "admin"
}
],
"user": "user_admin@admin"
}
2)、從日志中獲取慢查詢
在mongodb的后臺(tái)日志中會(huì)同時(shí)記錄一份慢查詢信息,相對(duì)于system.profile集合的優(yōu)點(diǎn)是會(huì)永久保存,缺點(diǎn)是需要從海量的日志中過(guò)濾慢日志信息,不過(guò)若數(shù)據(jù)庫(kù)的性能較差且并發(fā)較大,此時(shí)可看到日志上有大量的慢查尋日志刷屏,一般也可快速定位問(wèn)題。
日志中輸出的內(nèi)容跟system.profile保存的基本一致,只是可讀性稍微較差些,示例見(jiàn)上圖。
4、當(dāng)前會(huì)話操作獲取
在mongodb中,如需獲取當(dāng)前的會(huì)話信息,可使用db.currentOp()命令,該命令獲取到的信息,類(lèi)似于在oracle中通過(guò)聯(lián)合查詢v$session和v$process獲取到的信息,包含客戶端類(lèi)型、IP、正在執(zhí)行的命令、正在操作的對(duì)象、執(zhí)行計(jì)劃、鎖等等詳細(xì)信息,其中包括活動(dòng)會(huì)話和非活動(dòng)會(huì)話信息。對(duì)于自己需要的信息,可通過(guò)相關(guān)的過(guò)濾條件進(jìn)行過(guò)濾,如下示例:
--獲取活動(dòng)會(huì)話信息
db.currentOp(
{
"active": true
}
)
--查詢所有在等待鎖,且操作命令為增刪改的會(huì)話信息。
db.currentOp(
{
"waitingForLock": true,
$or:[
{"op" : { "$in" : [ "insert", "update","remove" ] } },
{"query.findandmodify": { $exists: true } }
]
}
)
從3.6版本開(kāi)始,提供了$currentOp這個(gè)聚合管道階段,可以更加靈活的獲取到當(dāng)前的會(huì)話操作信息,并且返回的是游標(biāo),規(guī)避了db.currentOp的最大16MB的BSON大小限制。
--獲取活動(dòng)會(huì)話,
useadmin
db.aggregate([
{$currentOp: { allUsers: true ,idleConnections:false} },
{$project:{opid:1,client:1,op:1,ns:1,microsecs_running:1}},
{$match:{client:{$exists:true}}}
]);
針對(duì)獲取到的異常會(huì)話或者執(zhí)行時(shí)間長(zhǎng)的會(huì)話,可以通過(guò)db.killOp()命令kill客戶端會(huì)話。
1、通過(guò)創(chuàng)建索引優(yōu)化慢查詢
跟其他關(guān)系型數(shù)據(jù)庫(kù)一樣,當(dāng)出現(xiàn)對(duì)大量的慢查詢時(shí),可以檢查其執(zhí)行計(jì)劃,若執(zhí)行計(jì)劃是全表掃描(COLLSCAN)語(yǔ)句時(shí),可以通過(guò)在選擇性較高的過(guò)濾條件上創(chuàng)建索引來(lái)優(yōu)化查詢。db.collection.createIndex({field:1},{background,true});
注:生產(chǎn)系統(tǒng)創(chuàng)建索引一定必須在后臺(tái)創(chuàng)建索引,即指定{background,true},否則會(huì)產(chǎn)生庫(kù)級(jí)鎖
2、數(shù)據(jù)庫(kù)阻塞處理
mongodb作為一款輕量級(jí)nosql數(shù)據(jù)庫(kù),在并發(fā)鎖控制上相對(duì)弱些。部分操作會(huì)加庫(kù)級(jí)鎖,如前臺(tái)創(chuàng)建索引、碎片整理、repair等,庫(kù)級(jí)鎖會(huì)阻塞當(dāng)前數(shù)據(jù)庫(kù)的所有操作,最明顯的表現(xiàn)就是會(huì)導(dǎo)致數(shù)據(jù)庫(kù)會(huì)話數(shù)逐漸上升,阻塞時(shí)間長(zhǎng)還會(huì)導(dǎo)致連接數(shù)爆滿。此類(lèi)操作一般會(huì)記錄在后臺(tái)日志中,通過(guò)db.currentop()也可獲取會(huì)話信息,然后通過(guò)db.killOp()命令kill會(huì)話。注:killop只能kill客戶端會(huì)話,并且不是所有的操作都可以kill。
3、內(nèi)存優(yōu)化處理
在3.2版本以后,默認(rèn)使用wiredtiger存儲(chǔ)引擎,可以通過(guò)參數(shù)cacheSizeGB設(shè)置存儲(chǔ)引擎的內(nèi)存使用上限,默認(rèn)是系統(tǒng)內(nèi)存的60%??梢酝ㄟ^(guò)mongostat觀察內(nèi)存cache的使用情況,一般情況下used會(huì)小于80%,如果長(zhǎng)時(shí)間的used達(dá)90%或者dirty10%,可考慮增加內(nèi)存或者檢查IO 。
4、數(shù)據(jù)庫(kù)寫(xiě)入性能較差
寫(xiě)入性能差,需確定是整體性能差還是某個(gè)集合寫(xiě)入性能差,如果是整體都差的話,需檢查IO,考慮更換性能更好的存儲(chǔ)或者進(jìn)行分片打散IO。如果是某個(gè)集合寫(xiě)入性能差,則需要檢查這個(gè)集合是否索引過(guò)多,或者高并發(fā)或者異常語(yǔ)句導(dǎo)致異常加鎖。
--查詢?cè)谀硞€(gè)庫(kù)中從未使用過(guò)的索引,如果索引長(zhǎng)期未使用,建議刪除
db.getCollectionNames().forEach(function(collection){
if(db[collection].getIndexes().length != 1){
print("Indexesfor "+ collection + ":");
db[collection].aggregate([{
$indexStats:{}
},{
$project:{
host:0
}
}]).forEach(
function(opDoc){
if(opDoc.accesses.ops== 0&& opDoc.name!= "_id_"){
printjson(opDoc);
}
});
}
});
5、便捷的數(shù)據(jù)生命周期管理
TTL索引是MongoDB中一種特殊的索引,可以支持文檔在一定時(shí)間之后自動(dòng)過(guò)期刪除。可以再除_id外的所有字段上建立,但是只有在當(dāng)字段值是時(shí)間或者數(shù)組中包含時(shí)間時(shí),TTL索引才會(huì)執(zhí)行刪除操作,數(shù)組中包含多個(gè)時(shí)間時(shí),按照數(shù)組中最小的時(shí)間計(jì)算。
例:db.collection.createIndex({ "InsertTime": 1 }, { expireAfterSeconds: 2592000?} );
6、內(nèi)存數(shù)據(jù)庫(kù)引擎
Mongodb企業(yè)版擁有自己的內(nèi)存數(shù)據(jù)庫(kù)引擎,但是需要收費(fèi)。在社區(qū)版中,可將數(shù)據(jù)文件(dbpath)放入/de/shm中,變相使用內(nèi)存引擎。
注:由于內(nèi)存一般不會(huì)太大,建議合理選擇業(yè)務(wù),并使用固定大小集合。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/130193.html
摘要:優(yōu)志愿張海鵬宋體背景宋體每年月下旬到月下旬期間是高考填志愿的高峰期,也是優(yōu)志愿后端面臨大流量高并發(fā)請(qǐng)求的業(yè)務(wù)高峰期。對(duì)于優(yōu)志愿讀多寫(xiě)少的場(chǎng)景及其業(yè)務(wù)高峰期,用戶可以按需增刪節(jié)點(diǎn),更好地實(shí)現(xiàn)讀取性能的擴(kuò)展。 隨著用戶規(guī)模的增長(zhǎng),數(shù)據(jù)庫(kù)的壓力也在成倍增加。面對(duì)大流量、高并發(fā),UCloud MongoDB 做到了高效,并展現(xiàn)出了更好的性能體驗(yàn)。 —— 優(yōu)志愿 CTO 張海鵬 背景...
摘要:監(jiān)控和管理概述監(jiān)控和管理是一個(gè)用于管理和監(jiān)控和性能的開(kāi)源平臺(tái)。是收集性能指標(biāo)的。刪除數(shù)據(jù)容器升級(jí)服務(wù)器先停再刪,如果如要保留收集數(shù)據(jù),不要執(zhí)行此操作在和上安裝客戶端客戶端是安裝在您要監(jiān)視的或主機(jī)上的一組代理和出口商。 Percona監(jiān)控和管理概述 Percona監(jiān)控和管理(PMM)是一個(gè)用于管理和監(jiān)控MySQL和MongoDB性能的開(kāi)源平臺(tái)。 它由Percona與托管數(shù)據(jù)庫(kù)服務(wù),支持和...
摘要:推薦閱讀資源庫(kù)工具應(yīng)用程序精選列表中文版有哪些鮮為人知,但是很有意思的網(wǎng)站一份攻城獅筆記每天搜集上優(yōu)秀的項(xiàng)目一些有趣的民間故事超好用的谷歌瀏覽器油猴插件合集目錄資源文檔文章圖書(shū)會(huì)談教程更多庫(kù)工具管理數(shù)據(jù)部署桌面發(fā)展監(jiān)控應(yīng)用資源文檔介紹文檔教 推薦閱讀 MongoDB 資源、庫(kù)、工具、應(yīng)用程序精選列表中文版 有哪些鮮為人知,但是很有意思的網(wǎng)站? 一份攻城獅筆記 每天搜集 Github ...
閱讀 1356·2023-01-11 13:20
閱讀 1707·2023-01-11 13:20
閱讀 1215·2023-01-11 13:20
閱讀 1906·2023-01-11 13:20
閱讀 4165·2023-01-11 13:20
閱讀 2757·2023-01-11 13:20
閱讀 1402·2023-01-11 13:20
閱讀 3671·2023-01-11 13:20