centos7环境下使用python脚本监控mongodb集群复制状态
centos7环境下使用python脚本监控mongodb集群复制状态
centos环境下搭建了 MongoDB 副本集,需要对集群的复制状态进行监控
获取集群的状态信息,集群是3个节点,没有设置仲裁者
[root@eus-image-design-mongo01:/usr/local]# mongo --port 21000 MongoDB shell version v3.4.24 connecting to: mongodb://127.0.0.1:21000/ MongoDB server version: 3.4.24 configs:SECONDARY> use admin switched to db admin configs:SECONDARY> db.auth('zabbix','zabbix') 1 configs:SECONDARY> rs.status() { "set" : "configs", "date" : ISODate("2020-11-12T08:07:11.216Z"), "myState" : 2, "term" : NumberLong(4), "syncingTo" : "172.30.0.110:21000", "syncSourceHost" : "172.30.0.110:21000", "syncSourceId" : 2, "configsvr" : true, "heartbeatIntervalMillis" : NumberLong(2000), "optimes" : { "lastCommittedOpTime" : { "ts" : Timestamp(1605168428, 2), "t" : NumberLong(4) }, "readConcernMajorityOpTime" : { "ts" : Timestamp(1605168428, 2), "t" : NumberLong(4) }, "appliedOpTime" : { "ts" : Timestamp(1605168428, 2), "t" : NumberLong(4) }, "durableOpTime" : { "ts" : Timestamp(1605168428, 2), "t" : NumberLong(4) } }, "members" : [ { "_id" : 0, "name" : "172.30.0.109:21000", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 8363759, "optime" : { "ts" : Timestamp(1605168428, 2), "t" : NumberLong(4) }, "optimeDate" : ISODate("2020-11-12T08:07:08Z"), "syncingTo" : "172.30.0.110:21000", "syncSourceHost" : "172.30.0.110:21000", "syncSourceId" : 2, "infoMessage" : "", "configVersion" : 1, "self" : true, "lastHeartbeatMessage" : "" }, { "_id" : 1, "name" : "172.30.0.108:21000", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 8363758, "optime" : { "ts" : Timestamp(1605168428, 2), "t" : NumberLong(4) }, "optimeDurable" : { "ts" : Timestamp(1605168428, 2), "t" : NumberLong(4) }, "optimeDate" : ISODate("2020-11-12T08:07:08Z"), "optimeDurableDate" : ISODate("2020-11-12T08:07:08Z"), "lastHeartbeat" : ISODate("2020-11-12T08:07:10.523Z"), "lastHeartbeatRecv" : ISODate("2020-11-12T08:07:10.529Z"), "pingMs" : NumberLong(0), "lastHeartbeatMessage" : "", "syncingTo" : "172.30.0.110:21000", "syncSourceHost" : "172.30.0.110:21000", "syncSourceId" : 2, "infoMessage" : "", "configVersion" : 1 }, { "_id" : 2, "name" : "172.30.0.110:21000", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 8363758, "optime" : { "ts" : Timestamp(1605168428, 2), "t" : NumberLong(4) }, "optimeDurable" : { "lastHeartbeatMessage" : "", "syncingTo" : "172.30.0.110:21000", "syncSourceHost" : "172.30.0.110:21000", "syncSourceId" : 2, "infoMessage" : "", "configVersion" : 1 }, { "_id" : 2, "name" : "172.30.0.110:21000", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 8363758, "optime" : { "ts" : Timestamp(1605168428, 2), "t" : NumberLong(4) }, "optimeDurable" : { "ts" : Timestamp(1605168428, 2), "t" : NumberLong(4) }, "optimeDate" : ISODate("2020-11-12T08:07:08Z"), "optimeDurableDate" : ISODate("2020-11-12T08:07:08Z"), "lastHeartbeat" : ISODate("2020-11-12T08:07:10.506Z"), "lastHeartbeatRecv" : ISODate("2020-11-12T08:07:11.097Z"), "pingMs" : NumberLong(0), "lastHeartbeatMessage" : "", "syncingTo" : "", "syncSourceHost" : "", "syncSourceId" : -1, "infoMessage" : "", "electionTime" : Timestamp(1596804656, 1), "electionDate" : ISODate("2020-08-07T12:50:56Z"), "configVersion" : 1 } ], "ok" : 1 } configs:SECONDARY>
1.编写监控脚本
yum install -y python-pip
pip install pymongo
# vim /usr/local/zabbix_agents/scripts/mongodb-monitor.py #coding:utf-8 import pymongo from pymongo import MongoClient class check_mongo_repl(): def __init__(self): self.conn = pymongo.MongoClient('mongodb://zabbix:zabbix@127.0.0.1:21000/') self.db = self.conn.admin self.rs = self.db.command('replSetGetStatus') def get_rs_num(self): list_values = "Value : %s" % self.rs.values() # 统计 primary和 secondary在字符串中出现的次数,统计主节点和从节点个数之和 pri_count = list_values.count("PRIMARY") #print "pri_count= %s" % pri_count sec_count = list_values.count("SECONDARY") #print "sec_count= %s" % sec_count #get_list = list_values.split(',') #a = 0 #if " u'stateStr': u'SECONDARY'" in get_list: # a += 1 #if " u'stateStr': u'ARBITER'" in get_list: # a += 1 return pri_count + sec_count if __name__ == "__main__": mongo = check_mongo_repl() print mongo.get_rs_num()
2.在 zabbix_agentd.conf 配置文件中加入监控项
# vim /usr/local/zabbix_agents/conf/zabbix_agentd.conf
UserParameter=mongodb.repl.status,/usr/bin/python /usr/local/zabbix_agents/scripts/mongodb-monitor.py
触发器:
{Template mongodb replication:mongodb.repl.status.count(#5,3,"eq")}=0
实例:据说可以监控mongodb 的分片集群,看了一下能监控复制状态,里面的增删改查的情况
1.下载监控配置模板
从github拉取监控配置文件与脚本
git clone https://github.com/petrushinvs/mongodb-zabbix-templates-4.0.git
cd mongodb-zabbix-templates-4.0
chmod +x *.py
# 拷贝文件到zabbix 服务端调用目录(也可以在Data collector 这个item中查看报错的具体位置进行配置)
cp *.py /usr/local/zabbix/share/zabbix/externalscripts/
也可以从这里下载:https://gitee.com/reblue520/mongodb-zabbix-templates-4.0
导入模板 zbx_MongoDB_template.xml
2.准备环境
使用的是 External check 方式,需要在zabbix_server端安装mongodb命令
zabbix服务端安装
yum install -y python-pip
sudo pip install pymongo
sudo pip install py-zabbix
# 服务端进行测试
# /usr/local/zabbix/share/zabbix/externalscripts/mongod-db.py -u zabbix -s zabbix -h 172.30.0.109 -p 21000 -n eus-image-design-mongo01 History opcounters 1605237495 0 0 0 3651676 0 11703367 {"failed": 2, "chunk": 1, "total": 17, "processed": 15, "time": "0.000179"}
# Zabbix trapper 的测试,在客户端进行验证
# /usr/local/zabbix_agents/bin/zabbix_sender -s 客户端IP -z zabbix服务端IP -k 'mongodb_rs_status' -o test -vv
# /usr/local/zabbix_agents/bin/zabbix_sender -s 172.30.0.109 -z 172.30.0.9 -k 'mongodb_rs_status' -o test -vv zabbix_sender [4675]: DEBUG: answer [{"response":"success","info":"processed: 0; failed: 1; total: 1; seconds spent: 0.000026"}] info from server: "processed: 0; failed: 1; total: 1; seconds spent: 0.000026" sent: 1; skipped: 0; total: 1
3.填写mongodb的宏配置
{$MONGODB_HOSTNAME} :mongod服务所在的域名或IP
{$MONGODB_USER} : mongodb的用户名
{$MONGODB_PASS} :mongodb的密码
{$MONGOS_PORT}:mongod服务监听的端口
{$MONGODB_ZABBIX_NAME}:客户端主机名
报错的处理
# /usr/local/zabbix/share/zabbix/externalscripts/mongod-db.py -u zabbix -s zabbix -h 172.30.0.109 -p 21000 -n eus-image-design-mongo01 Traceback (most recent call last): File "/usr/local/zabbix/share/zabbix/externalscripts/mongod-db.py", line 35, in <module> r = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) File "/usr/lib64/python2.7/subprocess.py", line 711, in __init__ errread, errwrite) File "/usr/lib64/python2.7/subprocess.py", line 1327, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory
# 生成软链(需要安装mongdb到zabbix服务端,否则没有 mongostat命令)
ln -s /usr/local/mongodb/bin/mongostat /usr/bin/mongostat