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:[email protected]: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