欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用zabbix监控mongodb的方法

程序员文章站 2022-05-01 19:31:31
mongodb 是一个基于分布式文件存储的数据库。由 c++ 语言编写。旨在为 web 应用提供可扩展的高性能数据存储解决方案。 mongodb 是一个介于关系数据库...

mongodb 是一个基于分布式文件存储的数据库。由 c++ 语言编写。旨在为 web 应用提供可扩展的高性能数据存储解决方案。

mongodb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

mongodb如今越来越火,要做好对mongodb的监控就需要从它的安装配置,到简单的command语句使用,再到对它运行机制以及状态获取方法的掌握。

    mongodb有三种基本的状态获取方式:

    1.mongostat

    2.开启28017的监听端口,curl

   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模板

定义自动发现规则

使用zabbix监控mongodb的方法

定义监控项

使用zabbix监控mongodb的方法

最后添加触发器和图就完成了

注意:在mongodb.conf配置文件里定义了键值对应关系后要重启zabbix服务才能生效