使用zabbix監(jiān)控mongodb的方法
MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)。由 C++ 語(yǔ)言編寫(xiě)。旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。
MongoDB 是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫(kù)的。
Mongodb如今越來(lái)越火,要做好對(duì)mongodb的監(jiān)控就需要從它的安裝配置,到簡(jiǎn)單的command語(yǔ)句使用,再到對(duì)它運(yùn)行機(jī)制以及狀態(tài)獲取方法的掌握。
mongodb有三種基本的狀態(tài)獲取方式:
1.mongostat
2.開(kāi)啟28017的監(jiān)聽(tīng)端口,curl http://127.0.0.1:28017/_status
3.進(jìn)入mongo執(zhí)行db.serverStatus命令
我用的是第三種方法:
echo "db.serverStatus()" |/usr/local/mongodb/bin/mongo 192.168.1.123:27017/foo --quiet
{
"host" : "TENCENT64.site", --server的hostname
"version" : "2.0.5", --mongo版本
"process" : "mongod", --進(jìn)程名
"uptime" : 1238418, --啟動(dòng)時(shí)間(單位:S)
"uptimeEstimate" : 1230730, --基于MongoDB內(nèi)部粗粒度定時(shí)器的運(yùn)行時(shí)間
"localTime" : ISODate("2012-09-14T09:09:52.657Z"), --server的本地時(shí)間
"globalLock" : {
"totalTime" : 1238418105923, --全局鎖創(chuàng)建的時(shí)間(單位:ms 微秒)
"lockTime" : 75055831911, --全局鎖保持的時(shí)間(單位:ms 微秒)
"ratio" : 0.06060621332329477, --lockTime和totalTime的比
"currentQueue" : {
"total" : 0, --等待全局鎖的隊(duì)列中操作數(shù)目
"readers" : 0, --等待讀鎖的隊(duì)列中操作數(shù)目
"writers" : 0 --等待寫(xiě)鎖的隊(duì)列中操作數(shù)目
},
"activeClients" : {
"total" : 1, --連接到server的當(dāng)前活動(dòng)client數(shù)目
"readers" : 1, --執(zhí)行讀操作的當(dāng)前活動(dòng)client數(shù)目
"writers" : 0 --執(zhí)行寫(xiě)操作的當(dāng)前活動(dòng)client數(shù)目
}
},
"mem" : {
"bits" : 64, --64位機(jī)器
"resident" : 18363, --占用物理內(nèi)存量。
"virtual" : 478810, --占用的虛擬內(nèi)存量
"supported" : true, --是否支持?jǐn)U展內(nèi)存
"mapped" : 233311, --映射到內(nèi)存的數(shù)據(jù)文件大小,很接近于你的所有數(shù)據(jù)庫(kù)大小。
"mappedWithJournal" : 466622,
"note" : "virtual minus mapped is large. could indicate a memory leak"
},
"connections" : {
"current" : 737, --當(dāng)前活動(dòng)連接量。連接到server的當(dāng)前活躍連接數(shù)目
"available" : 82 --剩余空閑連接量。剩余的可用連接數(shù)目
},
"extra_info" : {
"note" : "fields vary by platform",
"heap_usage_bytes" : 3838448, --此過(guò)程中所有的堆字節(jié)數(shù)目。僅適用于Linux
"page_faults" : 31058356 --此過(guò)程中訪問(wèn)內(nèi)存中頁(yè)面失敗的總次數(shù)。僅適用于Linux
},
"indexCounters" : {
"btree" : {
"accesses" : 68229146, --Btree索引的訪問(wèn)次數(shù)(索引被訪問(wèn)量)
"hits" : 68229146, --內(nèi)存中的Btree頁(yè)的數(shù)目。(索引命中量)
"misses" : 0, --內(nèi)存中不存在的Btree也數(shù)目。(索引偏差量)(索引內(nèi)存訪問(wèn)失敗次數(shù))
"resets" : 0, --索引計(jì)數(shù)器被重置為0的次數(shù)
"missRatio" : 0 --索引偏差率(未命中率)
}
},
"backgroundFlushing" : {
"flushes" : 20640, --數(shù)據(jù)庫(kù)刷新寫(xiě)到磁盤(pán)的次數(shù)
"total_ms" : 2453287, --數(shù)據(jù)庫(kù)刷新數(shù)據(jù)到磁盤(pán)花費(fèi)的微秒數(shù)
"average_ms" : 118.8608042635659, --執(zhí)行單次刷新花費(fèi)的平均微秒數(shù)
"last_ms" : 1, --最后一次執(zhí)行完成刷新數(shù)據(jù)到磁盤(pán)花費(fèi)的微秒數(shù)
"last_finished" : ISODate("2012-09-14T09:09:35.656Z") --當(dāng)最后一次刷新數(shù)據(jù)完成時(shí)的時(shí)間戳
},
"cursors" : {
"totalOpen" : 0, --server為client保持的游標(biāo)(cursor)總數(shù)
"clientCursors_size" : 0, --
"timedOut" : 24 --server啟動(dòng)以來(lái)游標(biāo)(cursor)超時(shí)的總數(shù)
},
"network" : {
"bytesIn" : NumberLong("1929833164782"), --發(fā)送到數(shù)據(jù)庫(kù)的數(shù)據(jù)總量(bytes)
"bytesOut" : 553137147925, --數(shù)據(jù)庫(kù)發(fā)出的數(shù)據(jù)總量(bytes)
"numRequests" : 2475184328 --發(fā)送到數(shù)據(jù)庫(kù)的請(qǐng)求量
},
"opcounters" : {
"insert" : 687531883, --server啟動(dòng)以來(lái)總的insert數(shù)據(jù)量
"query" : 711010343, --server啟動(dòng)以來(lái)總的query數(shù)據(jù)量
"update" : 0, --server啟動(dòng)以來(lái)總的update數(shù)據(jù)量
"delete" : 0, --server啟動(dòng)以來(lái)總的delete數(shù)據(jù)量
"getmore" : 6484, --server啟動(dòng)以來(lái)調(diào)用任何游標(biāo)的getMore總次數(shù)
"command" : 1287537 --server啟動(dòng)以來(lái)執(zhí)行其他命令的總次數(shù)
},
"asserts" : {
"regular" : 0, --server啟動(dòng)以來(lái)拋出正規(guī)斷言(assert 類似于異常處理的形式)總數(shù)目
"warning" : 1, --server啟動(dòng)以來(lái)拋出的告警總數(shù)目
"msg" : 0, --消息斷言數(shù)目。服務(wù)器內(nèi)部定義的良好字符串錯(cuò)誤
"user" : 4, --用戶斷言數(shù)目。用戶產(chǎn)生的錯(cuò)誤,譬如:磁盤(pán)空間滿;重復(fù)鍵。
"rollovers" : 0 --server啟動(dòng)以來(lái),assert counters have rolled over的次數(shù)
},
"writeBacksQueued" : false, --是否有從mongos執(zhí)行的retry操作
"dur" : {
"commits" : 30, --上一間隔journal日志發(fā)生commit的次數(shù)
"journaledMB" : 0, --上一間隔寫(xiě)到j(luò)ournal日志的數(shù)據(jù)量(單位:MB)
"writeToDataFilesMB" : 0, --上一間隔journal日志寫(xiě)到數(shù)據(jù)文件的數(shù)據(jù)量(單位:MB)
"compression" : 0, --
"commitsInWriteLock" : 0, --寫(xiě)鎖期間發(fā)生commits的次數(shù)
"earlyCommits" : 0, --schedule時(shí)間前請(qǐng)求commit的次數(shù)
"timeMs" : {
"dt" : 3064,
"prepLogBuffer" : 0, --準(zhǔn)備寫(xiě)journal日志花費(fèi)的時(shí)間
"writeToJournal" : 0, --寫(xiě)journal日志花費(fèi)的實(shí)際時(shí)間
"writeToDataFiles" : 0, --journal日志后寫(xiě)數(shù)據(jù)文件花費(fèi)的時(shí)間
"remapPrivateView" : 0 --The amount of time spent remapping copy-on-write memory mapped views
}
},
"ok" : 1 --serverStatus是否返回正確
}
以上,我們把所需要的參數(shù)抽取出來(lái)就可以做成監(jiān)控項(xiàng)了。
先定義鍵值:
#mongodb.conf UserParameter=mongodb_port_discovery,/usr/local/zabbix/exec/mongo_discovery.py UserParameter=mongodb_stats[*],/usr/local/zabbix/exec/mongo_status.sh $1 $2 $3 $4 $5
寫(xiě)mongo_discovery.py腳本(用于端口發(fā)現(xiàn))
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import json
import subprocess
json_data = {"data":[]}
net_cmd = '''sudo netstat -nlpt|awk '/mongo/{print $4}'
'''
p = subprocess.Popen(net_cmd, shell=True, stdout=subprocess.PIPE)
net_result = p.stdout.readlines()
for server in net_result:
dic_content = {
"{#MONGO_PORT}" : server.split(':')[1].strip(),
"{#MONGO_IPADDR}" : server.split(':')[0].strip()
}
json_data['data'].append(dic_content)
result = json.dumps(json_data,sort_keys=True,indent=4)
print result
寫(xiě)mongo_status.sh狀態(tài)檢測(cè)腳本
#!/bin/bash ##mongo_status.sh## ##wuhf## case $# in 3) output=$(/bin/echo "db.serverStatus().$3" |/usr/local/mongodb/bin/mongo $1:$2/foo --quiet) ;; 4) output=$(/bin/echo "db.serverStatus().$3.$4" |/usr/local/mongodb/bin/mongo $1:$2/foo --quiet) ;; 5) output=$(/bin/echo "db.serverStatus().$3.$4.$5" |/usr/local/mongodb/bin/mongo $1:$2/foo --quiet) ;; esac if [[ "$output" =~ "NumberLong" ]];then echo $output|sed -n 's/NumberLong(//p'|sed -n 's/)//p' else echo $output fi
權(quán)限設(shè)置
chmod 755 /usr/local/zabbix/exec/* chown zabbix.zabbix /usr/local/zabbix/exec/* chown zabbix.zabbix /usr/local/zabbix/etc/zabbix_agentd.conf.d/* echo "zabbix ALL=(root) NOPASSWD:ALL" >> /etc/sudoers sed -i 's/^Defaults.*.requiretty/#Defaults requiretty/' /etc/sudoers
做MongoDB模板
定義自動(dòng)發(fā)現(xiàn)規(guī)則

定義監(jiān)控項(xiàng)

最后添加觸發(fā)器和圖就完成了
注意:在mongodb.conf配置文件里定義了鍵值對(duì)應(yīng)關(guān)系后要重啟zabbix服務(wù)才能生效
相關(guān)文章
MongoDB系列教程(五):mongo語(yǔ)法和mysql語(yǔ)法對(duì)比學(xué)習(xí)
這篇文章主要介紹了MongoDB系列教程(五):mongo語(yǔ)法和mysql語(yǔ)法對(duì)比學(xué)習(xí),本文對(duì)熟悉Mysql數(shù)據(jù)庫(kù)的同學(xué)來(lái)說(shuō)幫助很大,用對(duì)比的方式可以快速學(xué)習(xí)到MongoDB的命令,需要的朋友可以參考下2015-05-05
mongodb 數(shù)據(jù)庫(kù)操作--備份 還原 導(dǎo)出 導(dǎo)入
mongodb數(shù)據(jù)備份和還原主要分為二種,一種是針對(duì)于庫(kù)的mongodump和mongorestore,一種是針對(duì)庫(kù)中表的mongoexport和mongoimport。2014-07-07
mongodb 集群重構(gòu)和釋放磁盤(pán)空間實(shí)例詳解
這篇文章主要介紹了mongodb 集群重構(gòu)和釋放磁盤(pán)空間實(shí)例詳解的相關(guān)資料,具有一定的參考價(jià)值,需要的朋友可以參考下2016-11-11
MongoDB入門(mén)教程之C#驅(qū)動(dòng)操作實(shí)例
這篇文章主要介紹了MongoDB入門(mén)教程之C#驅(qū)動(dòng)操作實(shí)例,即C#中操作MongoDB數(shù)據(jù)的方法和代碼示例,需要的朋友可以參考下2014-08-08
mongodb使用docker搭建replicaSet集群與變更監(jiān)聽(tīng)(最新推薦)
replicaSet和cluster從部署難度相比,replicaSet要簡(jiǎn)單許多。如果所存儲(chǔ)的數(shù)據(jù)量規(guī)模不算太大的情況下,那么使用replicaSet方式部署mongodb是一個(gè)不錯(cuò)的選擇,這篇文章主要介紹了mongodb使用docker搭建replicaSet集群與變更監(jiān)聽(tīng),需要的朋友可以參考下2023-03-03
MongoDB模糊查詢操作案例詳解(類關(guān)系型數(shù)據(jù)庫(kù)的 like 和 not like)
這篇文章主要介紹了MongoDB的模糊查詢操作(類關(guān)系型數(shù)據(jù)庫(kù)的 like 和 not like) ,本文通過(guò)代碼案例分析給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,,需要的朋友可以參考下2019-07-07

