Wanger | Zabbix开源社区签约专家
Zabbix运维工程师,熟悉Zabbix开源监控系统的架构。乐于分享Zabbix运维经验,个人公众号“运维开发故事”。
擅长领域:Zabbix基础设施运维以及Zabbix图形化展示。
从Zabbix5.0.10和5.2.6的版本开始,Zabbix官方开始支持对MongoDB数据库的监控,平时作者用MongoDB比较多,本文介绍如何使用zabbix-agent2来监控MongoDB数据库。
监控什么?
Zabbix官方分别提供了监控MongoDB集群和MongoDB节点的模板。获取MongoDB节点和集群状态和集合的存储信息的方式是一样的,只不过监控集群状态的模板多了获取连接池的状态和集群巨型块的数量,而节点模板会获取每个集合的使用情况、操作日志信息、ReplSet的状态。
获取Jumbo chunks的数量
当chunk超过默认大小并且不能被拆分将会被标记为jumbo chunk,jumbo chunk会不断增长,MongoDB集群有一个balancer会根据分片间的chunk数的差异来进行迁移,使数据均匀分布,jumbo chunk数量过多会导致分片间的负载不均衡,jumbo chunk数量过多的原因其实还是shard key规划不合理造成的。下面是zabbix获取jumbo chunk数量时调用的命令:
代码语言:javascript复制use config
db.chunks.find({"jumbo":true})
获取connpool.stats信息
下面是zabbix获取connpool时调用的命令:
代码语言:javascript复制db.runCommand({"connPoolStats" : 1})
关于此监控项依赖项的详细信息可查看官网有详细说明:
https://docs.mongodb.com/manual/reference/command/connPoolStats/#dbcmd.connPoolStats
获取MongoDB服务器状态
获取MongoDB服务状态调用的是下面的命令:
代码语言:javascript复制db.runCommand({serverStatus:1,recordStats:0})
关于此监控项依赖项的详细信息可查看官网有详细说明:https://docs.mongodb.com/manual/reference/command/serverStatus/#dbcmd.serverStatus
获取集合的信息
通过自动发现规则获取数据库和collections的名字, 并返回每个collections的信息,可以使用宏定义不需要获取的collections信息 下面是获取collections信息调用的命令。
代码语言:javascript复制db.runCommand( { collStats : "collections_name"})
关于此监控项依赖项的详细信息可查看
https://docs.mongodb.com/manual/reference/command/collStats/index.html
获取replSet状态
将会收集MongoDB的replSet的状态,当然没有配置replSet是不会获取到结果的 下面是获取replSet状态调用的命令。
代码语言:javascript复制db.adminCommand({replSetGetStatus:1})
关于此监控项的详细信息可查看:https://docs.mongodb.com/manual/reference/command/replSetGetStatus/
获取给定数据库的信息
通过自动发现规则获取数据库的名字, 并返回每个数据库的信息,可以使用宏定义不需要获取的数据库 下面是获取数据库存储信息调用的命令。
代码语言:javascript复制db.runCommand({dbStats:1})
关于此监控项的详细信息可查看:https://docs.mongodb.com/manual/reference/command/dbStats/
轮询oplog的数据获取replSet的状态
oplog是local库下的集合,replSet的信息会存储在这个集合中,执行下面的命令会获取oplog的状态、大小、存储的时间范围。
代码语言:javascript复制db.getReplicationInfo()
关于此监控项的输出信息可查看:https://docs.mongodb.com/manual/reference/method/db.getReplicationInfo/。
如何去监控?
首先需要在MongoDB中创建数据库和集群的只读用户。
代码语言:javascript复制use admin
db.auth("admin", "qwer@1234..asd")
db.createUser({
... "user": "zabbix",
... "pwd": "zabbix123",
... "roles": [
... { role: "readAnyDatabase", db: "admin" },
... { role: "clusterMonitor", db: "admin" },
... ]
... })
除了在url上直接定义连接信息外,还可以使用会话命名的方式,这对于监控多个实例是很方便的一种方式,也方便模板对监控项统一配置。
代码语言:javascript复制Plugins.Mongo.Sessions.Mongo1.Uri=tcp://127.0.0.1:27017
Plugins.Mongo.Sessions.Mongo1.User=<UsernameForMongo1>
Plugins.Mongo.Sessions.Mongo1.Password=<PasswordForMongo1>
Plugins.Mongo.Sessions.Mongo2.Uri=tcp://127.0.0.1:27018
Plugins.Mongo.Sessions.Mongo2.User=<UsernameForMongo2>
Plugins.Mongo.Sessions.Mongo2.Password=<PasswordForMongo2>
之后在url上可以只定义会话名即可对多实例进行监控。
代码语言:javascript复制mongodb.ping[Mongo1]
mongodb.ping[Mongo2]
模板使用了默认的连接参数,这里我改用命名会话进行连接。
之后直接在主机上链接模板即可实现对MongoDB的监控。
关于监控MongoDB模板的宏、发现规则,以及监控项触发器的说明可以参考官方说明https://www.zabbix.com/integrations/mongodb
备注“使用Zabbix年限 企业 姓名”