centos7环境下使用python脚本监控mongodb集群复制状态
centos环境下搭建了 MongoDB 副本集,需要对集群的复制状态进行监控
获取集群的状态信息,集群是3个节点,没有设置仲裁者
[root@eus-image-design-mongo01:/usr/local]# mongo --port 21000MongoDB shell version v3.4.24connecting to: mongodb://127.0.0.1:21000/
MongoDB server version: 3.4.24configs:SECONDARY>use admin
switched to db admin
configs:SECONDARY> db.auth('zabbix','zabbix')1configs: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
importpymongofrom pymongo importMongoClientclasscheck_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')defget_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_countif __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 opcounters1605237495 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 calllast):
File"/usr/local/zabbix/share/zabbix/externalscripts/mongod-db.py", line 35, in 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: [Errno2] No such file or directory
# 生成软链(需要安装mongdb到zabbix服务端,否则没有 mongostat命令)
ln -s /usr/local/mongodb/bin/mongostat /usr/bin/mongostat