专家专栏|使用Zabbix Agent 2监控MongoDB

举报
Zabbix中国 发表于 2021/06/15 18:05:38 2021/06/15
【摘要】 Wanger | Zabbix开源社区签约专家Zabbix运维工程师,熟悉Zabbix开源监控系统的架构。乐于分享Zabbix运维经验,个人公众号“运维开发故事”。擅长领域:Zabbix基础设施运维以及Zabbix图形化展示。从Zabbix5.0.10和5.2.6的版本开始,Zabbix官方开始支持对MongoDB数据库的监控,平时作者用MongoDB比较多,本文介绍如何使用zabbix-a...

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数量时调用的命令:

use config
db.chunks.find({"jumbo":true})

获取connpool.stats信息

下面是zabbix获取connpool时调用的命令:

db.runCommand({"connPoolStats" : 1})

关于此监控项依赖项的详细信息可查看官网有详细说明:

https://docs.mongodb.com/manual/reference/command/connPoolStats/#dbcmd.connPoolStats

获取MongoDB服务器状态

获取MongoDB服务状态调用的是下面的命令:

db.runCommand({serverStatus:1,recordStats:0})

关于此监控项依赖项的详细信息可查看官网有详细说明:https://docs.mongodb.com/manual/reference/command/serverStatus/#dbcmd.serverStatus

获取集合的信息

通过自动发现规则获取数据库和collections的名字, 并返回每个collections的信息,可以使用宏定义不需要获取的collections信息 下面是获取collections信息调用的命令。

db.runCommand( { collStats : "collections_name"})

关于此监控项依赖项的详细信息可查看

https://docs.mongodb.com/manual/reference/command/collStats/index.html

获取replSet状态

将会收集MongoDB的replSet的状态,当然没有配置replSet是不会获取到结果的 下面是获取replSet状态调用的命令。

db.adminCommand({replSetGetStatus:1})

关于此监控项的详细信息可查看:https://docs.mongodb.com/manual/reference/command/replSetGetStatus/

获取给定数据库的信息

通过自动发现规则获取数据库的名字, 并返回每个数据库的信息,可以使用宏定义不需要获取的数据库 下面是获取数据库存储信息调用的命令。

db.runCommand({dbStats:1})

关于此监控项的详细信息可查看:https://docs.mongodb.com/manual/reference/command/dbStats/

轮询oplog的数据获取replSet的状态

oplog是local库下的集合,replSet的信息会存储在这个集合中,执行下面的命令会获取oplog的状态、大小、存储的时间范围。

db.getReplicationInfo()

关于此监控项的输出信息可查看:https://docs.mongodb.com/manual/reference/method/db.getReplicationInfo/

如何去监控?

首先需要在MongoDB中创建数据库和集群的只读用户。

use admin
db.auth("admin", "qwer@1234..asd")
db.createUser({
...   "user": "zabbix",
...   "pwd": "zabbix123",
...   "roles": [
...     { role: "readAnyDatabase", db: "admin" },
...     { role: "clusterMonitor", db: "admin" },
...   ]
... })

图片

除了在url上直接定义连接信息外,还可以使用会话命名的方式,这对于监控多个实例是很方便的一种方式,也方便模板对监控项统一配置。

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上可以只定义会话名即可对多实例进行监控。

mongodb.ping[Mongo1]
mongodb.ping[Mongo2]

模板使用了默认的连接参数,这里我改用命名会话进行连接。

图片

之后直接在主机上链接模板即可实现对MongoDB的监控。


图片

关于监控MongoDB模板的宏、发现规则,以及监控项触发器的说明可以参考官方说明https://www.zabbix.com/integrations/mongodb

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。