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服务才能生效
本文地址:https://www.stayed.cn/item/2124
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我