MongoDB 是一個基於分布式文件存儲的數據庫。由 C++ 語言編寫。旨在為 WEB 應用提供可擴展的高性能數據存儲解決方案。
MongoDB 是一個介於關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫的。
Mongodb如今越來越火,要做好對mongodb的監控就需要從它的安裝配置,到簡單的command語句使用,再到對它運行機制以及狀態獲取方法的掌握。
mongodb有三種基本的狀態獲取方式:
1.mongostat
2.開啟28017的監聽端口,curl http://127.0.0.1:28017/_status
3.進入mongo執行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", --進程名 "uptime" : 1238418, --啟動時間(單位:S) "uptimeEstimate" : 1230730, --基於MongoDB內部粗粒度定時器的運行時間 "localTime" : ISODate("2012-09-14T09:09:52.657Z"), --server的本地時間 "globalLock" : { "totalTime" : 1238418105923, --全局鎖創建的時間(單位:ms 微秒) "lockTime" : 75055831911, --全局鎖保持的時間(單位:ms 微秒) "ratio" : 0.06060621332329477, --lockTime和totalTime的比 "currentQueue" : { "total" : 0, --等待全局鎖的隊列中操作數目 "readers" : 0, --等待讀鎖的隊列中操作數目 "writers" : 0 --等待寫鎖的隊列中操作數目 }, "activeClients" : { "total" : 1, --連接到server的當前活動client數目 "readers" : 1, --執行讀操作的當前活動client數目 "writers" : 0 --執行寫操作的當前活動client數目 } }, "mem" : { "bits" : 64, --64位機器 "resident" : 18363, --占用物理內存量。 "virtual" : 478810, --占用的虛擬內存量 "supported" : true, --是否支持擴展內存 "mapped" : 233311, --映射到內存的數據文件大小,很接近於你的所有數據庫大小。 "mappedWithJournal" : 466622, "note" : "virtual minus mapped is large. could indicate a memory leak" }, "connections" : { "current" : 737, --當前活動連接量。連接到server的當前活躍連接數目 "available" : 82 --剩余空閒連接量。剩余的可用連接數目 }, "extra_info" : { "note" : "fields vary by platform", "heap_usage_bytes" : 3838448, --此過程中所有的堆字節數目。僅適用於Linux "page_faults" : 31058356 --此過程中訪問內存中頁面失敗的總次數。僅適用於Linux }, "indexCounters" : { "btree" : { "accesses" : 68229146, --Btree索引的訪問次數(索引被訪問量) "hits" : 68229146, --內存中的Btree頁的數目。(索引命中量) "misses" : 0, --內存中不存在的Btree也數目。(索引偏差量)(索引內存訪問失敗次數) "resets" : 0, --索引計數器被重置為0的次數 "missRatio" : 0 --索引偏差率(未命中率) } }, "backgroundFlushing" : { "flushes" : 20640, --數據庫刷新寫到磁盤的次數 "total_ms" : 2453287, --數據庫刷新數據到磁盤花費的微秒數 "average_ms" : 118.8608042635659, --執行單次刷新花費的平均微秒數 "last_ms" : 1, --最後一次執行完成刷新數據到磁盤花費的微秒數 "last_finished" : ISODate("2012-09-14T09:09:35.656Z") --當最後一次刷新數據完成時的時間戳 }, "cursors" : { "totalOpen" : 0, --server為client保持的游標(cursor)總數 "clientCursors_size" : 0, -- "timedOut" : 24 --server啟動以來游標(cursor)超時的總數 }, "network" : { "bytesIn" : NumberLong("1929833164782"), --發送到數據庫的數據總量(bytes) "bytesOut" : 553137147925, --數據庫發出的數據總量(bytes) "numRequests" : 2475184328 --發送到數據庫的請求量 }, "opcounters" : { "insert" : 687531883, --server啟動以來總的insert數據量 "query" : 711010343, --server啟動以來總的query數據量 "update" : 0, --server啟動以來總的update數據量 "delete" : 0, --server啟動以來總的delete數據量 "getmore" : 6484, --server啟動以來調用任何游標的getMore總次數 "command" : 1287537 --server啟動以來執行其他命令的總次數 }, "asserts" : { "regular" : 0, --server啟動以來拋出正規斷言(assert 類似於異常處理的形式)總數目 "warning" : 1, --server啟動以來拋出的告警總數目 "msg" : 0, --消息斷言數目。服務器內部定義的良好字符串錯誤 "user" : 4, --用戶斷言數目。用戶產生的錯誤,譬如:磁盤空間滿;重復鍵。 "rollovers" : 0 --server啟動以來,assert counters have rolled over的次數 }, "writeBacksQueued" : false, --是否有從mongos執行的retry操作 "dur" : { "commits" : 30, --上一間隔journal日志發生commit的次數 "journaledMB" : 0, --上一間隔寫到journal日志的數據量(單位:MB) "writeToDataFilesMB" : 0, --上一間隔journal日志寫到數據文件的數據量(單位:MB) "compression" : 0, -- "commitsInWriteLock" : 0, --寫鎖期間發生commits的次數 "earlyCommits" : 0, --schedule時間前請求commit的次數 "timeMs" : { "dt" : 3064, "prepLogBuffer" : 0, --准備寫journal日志花費的時間 "writeToJournal" : 0, --寫journal日志花費的實際時間 "writeToDataFiles" : 0, --journal日志後寫數據文件花費的時間 "remapPrivateView" : 0 --The amount of time spent remapping copy-on-write memory mapped views } }, "ok" : 1 --serverStatus是否返回正確 }
以上,我們把所需要的參數抽取出來就可以做成監控項了。
先定義鍵值:
#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
寫mongo_discovery.py腳本(用於端口發現)
#!/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
寫mongo_status.sh狀態檢測腳本
#!/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
權限設置
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模板
定義自動發現規則
定義監控項
最後添加觸發器和圖就完成了
注意:在mongodb.conf配置文件裡定義了鍵值對應關系後要重啟zabbix服務才能生效