MongoDB作为文档型数据库,承载着大量业务读写请求,实例运行状态是否健康直接影响服务可用性。运维人员需要持续关注连接数、操作延迟、缓存命中、复制延迟等关键指标,而仅靠mongostat或日志排查很难形成全局视图。通过Grafana配合mongodb_exporter和Prometheus,可以将这些指标转化为实时曲线和面板,在问题扩大前发现异常。下面介绍这套监控体系的具体搭建方法。

一、监控方案选型:为什么使用Grafana加Exporter
在MongoDB监控领域,常见做法有三种。第一种是使用Grafana的MongoDB数据源插件直接连接数据库执行聚合查询,这种方式配置门槛低,但每次刷新面板都可能向MongoDB发起额外请求,容易加重生产实例负担,并且不适合展示长期历史趋势。第二种是使用云厂商提供的托管监控,例如MongoDB Atlas自带的性能面板,但如果数据库部署在自建机房或混合云环境,就需要自己构建监控链路。第三种方案则是采用Prometheus拉取模式配合mongodb_exporter,这也是目前社区最主流的自建监控方案。
mongodb_exporter是Percona维护的开源工具,它通过调用MongoDB的管理命令,例如serverStatus、replSetGetStatus和dbStats,将返回数据转换为Prometheus可识别的指标格式,并通过HTTP接口暴露在/metrics路径上。Prometheus按照固定间隔拉取这些指标进行存储,Grafana再从Prometheus查询数据渲染仪表盘。这样的架构将数据库与展示层解耦,即使Grafana频繁刷新,也只会访问Prometheus而不是MongoDB,对生产数据库几乎没有额外压力,同时还能复用Prometheus的告警能力。
二、部署数据采集链路:mongodb_exporter与Prometheus
先准备一个具有监控权限的MongoDB用户。建议创建专用账号,授予clusterMonitor和readAnyDatabase角色,避免使用root账号运行Exporter。启动mongodb_exporter最简单的方式是使用Docker容器,命令如下:
docker run -d \ --name mongodb-exporter \ -p 9216:9216 \ percona/mongodb_exporter:0.40 \ --mongodb.uri=mongodb://monitor:pass@127.0.0.1:27017/admin?ssl=false
该命令会启动一个监听9216端口的Exporter容器,并通过--mongodb.uri参数指定连接串。如果MongoDB启用了认证,需要将用户名和密码写入URI;若使用副本集,可以写成mongodb://monitor:pass@192.168.1.10:27017,192.168.1.11:27017/admin?replicaSet=rs0的形式。生产环境建议将密码放入密钥管理或环境变量中,而不是直接写在命令历史里。
接下来配置Prometheus抓取Exporter。编辑Prometheus配置文件,在<scrape_config>段添加新的job:
scrape_configs:
- job_name: 'mongodb'
scrape_interval: 15s
static_configs:
- targets: ['127.0.0.1:9216']
保存后重启Prometheus,可以在Prometheus的Targets页面看到mongodb任务状态为UP。此时通过浏览器访问Exporter的/metrics端点,能查看大量以mongodb_开头的指标,说明采集链路已打通。注意如果MongoDB是分片集群,需要为每个mongos、config server和shard分别运行Exporter,并为它们配置不同的job或使用文件服务发现。
三、导入Grafana仪表盘并定制面板
在Grafana中添加Prometheus数据源,地址填写Prometheus服务地址,例如http://127.0.0.1:9090,保存后测试连通性。接着点击Dashboard Import,输入社区常用的MongoDB Overview仪表盘ID,例如2583,加载后选择刚创建的数据源即可完成导入。该模板默认包含连接数、操作计数器、内存使用、网络吞吐、WiredTiger缓存等多个面板,能以较全面的视图展示MongoDB运行状态。
如果没有合适的现成模板,或者需要对面板进行深度定制,可以使用PromQL编写查询表达式。例如想查看查询操作速率的曲线,可以在面板中使用如下表达式:
rate(mongodb_op_counters_total{type="query"}[5m])
这个表达式计算5分钟窗口内query操作次数的每秒增长速率。将其添加为时间序列面板后,再根据实例标签或数据库名称筛选,就能看到不同节点的查询负载。通过Grafana的变量模板,可以建立实例下拉框和数据库下拉框,让仪表盘在多个MongoDB实例间灵活切换,减少重复创建仪表盘的工作量。
四、核心指标解读与告警设置
搭建好仪表盘后,更重要的是理解哪些指标需要重点关注。连接数方面,mongodb_connections_current反映当前打开的连接数,如果接近进程上限,通常意味着应用连接池配置不当或存在连接泄漏。操作延迟方面,mongodb_mongod_op_latencies_latency可以按操作类型展示延迟分布,当p99值持续超过业务容忍阈值时,应排查慢查询和索引缺失。复制延迟则通过mongodb_replset_member_last_applied_timestamp与主节点时间差计算,延迟过大可能触发选举或造成读不一致。
WiredTiger存储引擎的缓存指标同样不可忽视。mongodb_wiredtiger_cache_dirty_bytes表示脏数据字节数,如果持续增长并接近缓存容量,说明写入压力较大,可能需要扩容内存或优化写入模式。磁盘IO利用率可以通过rate(mongodb_wiredtiger_disk_io_bytes_total[5m])观察,当磁盘吞吐达到硬件瓶颈时,操作延迟往往会同步上升。建议在Prometheus中为这些指标设置告警规则,例如连接数超过上限的80%、复制延迟超过10秒、查询延迟p99超过500毫秒持续5分钟等,并通过Alertmanager通知运维人员。
五、常见排查思路与优化建议
在实际使用中,容易出现Prometheus无法抓取Exporter的情况。首先检查Exporter容器是否正常运行,使用docker logs mongodb-exporter查看日志,确认MongoDB连接串的认证信息和网络可达性。如果日志提示Authentication failed,需要核对监控账号的密码和认证数据库是否正确。其次检查Prometheus配置文件是否缩进正确,YAML格式对空格敏感,错误缩进会导致job无法加载。
如果Grafana面板中显示无数据,先到Prometheus的Graph页面执行同样的PromQL,确认是否有返回结果。没有结果可能是标签选择器写错,例如type标签值大小写不匹配,或者Exporter版本差异导致指标名称变化。此时可以查看/metrics端点中的原始指标名,调整表达式。对于大规模MongoDB集群,建议适当调低采集频率,比如30秒或60秒,并开启Exporter的--collect-all参数,避免遗漏关键指标。长期运行时,还需关注Prometheus自身的存储空间和性能,定期清理过期数据或配置远程存储。
MongoDB监控Grafana仪表盘mongodb_exporter修改时间:2026-08-27 16:00:09