首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Prometheus怎么监控MongoDB?MongoDB Exporter部署配置教程

Prometheus怎么监控MongoDB?MongoDB Exporter部署配置教程

作者头像
fruge365
发布2026-07-28 08:43:37
发布2026-07-28 08:43:37
1640
举报

前言

MongoDB能够正常连接,并不代表数据库始终运行健康。连接数量持续上涨、副本集复制延迟扩大、WiredTiger缓存接近上限,或者查询队列逐渐积压,都可能在业务明显变慢之前出现。

只依靠日志和人工登录检查,很难持续观察这些变化。更实用的做法,是把MongoDB内部状态转换为Prometheus能够识别的指标,再统一保存、查询并设置告警条件。

MongoDB Exporter就是连接数据库与监控平台的中间组件。它使用专门的监控账号读取连接、操作计数、复制状态、缓存和内存等数据,并通过/metrics接口对外提供标准指标。

本文会以CentOS 7为例,完成Percona MongoDB Exporter的下载、解压和systemd服务配置,再创建具有clusterMonitor等必要权限的MongoDB监控用户,并验证本地9216端口能够正常输出数据。

本地采集链路运行正常后,还会将Exporter加入Prometheus配置,设置实例不可达、复制延迟、连接数和缓存使用率等告警,并借助 cpolar 建立公网入口,让远程Prometheus也能跨网络抓取指标。

downloaded-image (4)
downloaded-image (4)

1.什么是MongoDB Exporter?

MongoDB Exporter是一个开源的监控数据采集工具,专门用于从MongoDB数据库实例中提取运行时指标,并以Prometheus可识别的格式暴露这些指标,从而实现对MongoDB的可观测性与性能监控。

核心作用

MongoDB Exporter的主要功能包括:

  • 采集MongoDB内部指标:如连接数、操作计数(insert/update/delete)、查询延迟、复制集状态、WiredTiger 存储引擎统计、内存使用、缓存命中率等。
  • 暴露标准HTTP接口:通过 /metrics端点以文本格式输出Prometheus指标,便于Prometheus Server抓取。
  • 支持多种部署模式:可监控单机、副本集(Replica Set)或分片集群(Sharded Cluster)架构的MongoDB实例。
  • 集成认证与TLS:支持通过用户名/密码、SCRAM认证、x.509证书等方式安全连接MongoDB。

工作原理简述

  • MongoDB Exporter作为一个独立进程运行(通常以容器或服务形式部署)。
  • 它定期连接到目标MongoDB实例,执行db.serverStatus()、db.replSetGetStatus() 等管理命令获取内部状态。
  • 将原始数据转换为Prometheus格式的指标(如mongodb_connections{state=“current”})。
  • 启动一个HTTP服务(默认端口如 9216),供Prometheus主动拉取(pull)数据。
  • Prometheus存储这些时间序列数据后,可通过Grafana进行可视化,或通过Alertmanager配置告警规则

常用开源实现

目前最主流的MongoDB Exporter是由percona维护的版本(原为dcu/mongodb_exporter的社区分支),它功能完善、活跃更新,并广泛用于生产环境。

GitHub地址: https://github.com/percona/mongodb_exporter

为什么运维需要它?

  • 可视化数据库健康状态:告别“黑盒”,实时掌握负载与瓶颈。
  • 精准告警:基于真实指标(如复制延迟 > 30s、连接数突增)触发告警,避免误报漏报。
  • 容量规划依据:长期指标趋势帮助预测资源需求。
  • 故障快速定位:结合历史数据,快速判断是应用层问题还是数据库层问题。

简言之,MongoDB Exporter是连接MongoDB与现代监控体系(Prometheus + Grafana)的关键桥梁,是构建可观测性基础设施不可或缺的一环。对于任何依赖MongoDB的生产系统,部署Exporter几乎已成为运维标配。

2.Centos7安装MongoDB_Exporter实时监控MongoDB数据

本地下载后上传到linux服务器:

下载地址:https://github.com/percona/mongodb_exporter/releases/download/v0.43.1/

或者直接在linux服务器上wget方式下载:

代码语言:javascript
复制
# 进入目标目录
cd /app/
wget https://github.com/percona/mongodb_exporter/releases/download/v0.43.1/mongodb_exporter-0.43.1.linux-amd64.tar.gz
img
img

解压:

代码语言:javascript
复制
tar -vxzf mongodb_exporter-0.43.1.linux-amd64.tar.gz
mv mongodb_exporter-0.43.1.linux-amd64 mongodb_exporter

启动Exporter服务:

代码语言:javascript
复制
/app/mongodb_exporter/mongodb_exporter \
  --mongodb.uri=mongodb://mongodb_exporter:shanjixin520@192.168.42.140:27017/admin \
  --web.listen-address=:9216 \
  --compatible-mode

配置Systemd服务:

代码语言:javascript
复制
vim /usr/lib/systemd/system/mongodb_exporter.service
代码语言:javascript
复制
[Unit]
Description=MongoDB Exporter
After=network.target

[Service]
User=root
Group=root
Type=simple
ExecStart=/app/mongodb_exporter/mongodb_exporter \
  --mongodb.uri=mongodb://mongodb_exporter:shanjixin520@192.168.42.140:27017/admin \
  --web.listen-address=:9216 \
  --compatible-mode
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
image-20260422153759763
image-20260422153759763

服务管理命令:

代码语言:javascript
复制
# 重载systemd配置
systemctl daemon-reload
# 设置开机自启
systemctl enable mongodb_exporter
# 服务控制
systemctl stop mongodb_exporter
systemctl restart mongodb_exporter
systemctl status mongodb_exporter
image-20260422154008980
image-20260422154008980

3.设置MongoDB监控专属用户

以管理员身份登录MongoDB:

代码语言:javascript
复制
 mongo -u admin -p --authenticationDatabase admin

切换至admin数据库:

代码语言:javascript
复制
use admin

创建监控用户:

代码语言:javascript
复制
db.createUser({
  user: "mongodb_expo",
  pwd: "shanjixin520",
  roles: [
    { role: "clusterMonitor", db: "admin" },
    { role: "read", db: "local" }
  ]
});

验证用户创建:

代码语言:javascript
复制
db.getUser("mongodb_exporter")
image-20260422153046518
image-20260422153046518

4.配置prometheus监控MongoDB_exporter

找到prometheus的配置文件,编辑添加如下内容:

代码语言:javascript
复制
vi prometheus.yml
代码语言:javascript
复制
      - targets: ["localhost:9216"]
        labels:
          app: "mongodb_exporter"
image-20260422154703339
image-20260422154703339

重启prometheus服务:

代码语言:javascript
复制
systemctl restart prometheus

使用浏览器Ip+9090打开promethues的页面:

image-20260416163025314
image-20260416163025314

我们可以看到成功的检测到了mongodb_exporter服务啦!

image-20260422154843208
image-20260422154843208

5.配置MongoDB告警

进入到prometheus配置目录下:

代码语言:javascript
复制
cd /app/prometheus

创建一个规则文件,例如mongodb_alerts.yml:

代码语言:javascript
复制
vi mongodb_alerts.yml
代码语言:javascript
复制
groups:
  - name: mongodb-alerts
    rules:
      # 1. MongoDB 实例不可达(Exporter 挂了或 MongoDB 连不上)
      - alert: MongoDBDown
        expr: up{job="mongodb"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "MongoDB instance down"
          description: "MongoDB Exporter ({{ $labels.instance }}) has been down for more than 1 minute."

      # 2. 主节点变更(副本集主节点切换,可能表示异常故障转移)
      - alert: MongoDBPrimaryChanged
        expr: changes(mongodb_replset_member_state{name=~".*PRIMARY.*"}[5m]) > 0
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "MongoDB primary node changed"
          description: "MongoDB replica set primary has changed in the last 5 minutes on {{ $labels.instance }}."

      # 3. 复制延迟过高(仅适用于副本集)
      - alert: MongoDBReplicationLagHigh
        expr: mongodb_replset_member_optime_date{state="PRIMARY"} - ignoring(state,name) mongodb_replset_member_optime_date{state="SECONDARY"} > 30
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: "MongoDB replication lag too high"
          description: "Replication lag on {{ $labels.instance }} is over 30 seconds."

      # 4. 连接数过高(接近最大连接限制,默认通常是 20000)
      - alert: MongoDBTooManyConnections
        expr: mongodb_connections{state="current"} > 15000
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High MongoDB connections"
          description: "{{ $value }} current connections on {{ $labels.instance }}, approaching limit."

      # 5. 查询延迟高(可选,需 exporter 支持 detailed metrics)
      - alert: MongoDBSlowOperations
        expr: rate(mongodb_op_counters{type="query"}[5m]) > 0 and rate(mongodb_mongod_global_lock_current_queue_total[5m]) > 10
        for: 3m
        labels:
          severity: warning
        annotations:
          summary: "MongoDB slow operations detected"
          description: "High query queue or slow ops on {{ $labels.instance }}."

      # 6. 内存使用过高(WiredTiger 缓存接近上限)
      - alert: MongoDBHighCacheUsage
        expr: mongodb_wt_cache_bytes_in_use / mongodb_wt_cache_max_bytes > 0.9
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "MongoDB cache usage too high"
          description: "WiredTiger cache usage is over 90% on {{ $labels.instance }}."
image-20260422155452740
image-20260422155452740

在Prometheus中加载告警规则,修改prometheus.yml,加入rule_files:

代码语言:javascript
复制
rule_files:
  - "/app/prometheus//mongodb_alerts.yml"
image-20260422155700329
image-20260422155700329

配置Alertmanager确保Prometheus的alerting指向Alertmanager:

代码语言:javascript
复制
# prometheus.yml
alerting:
  alertmanagers:
    - static_configs:
        - targets: ['localhost:9093']
image-20260422160217745
image-20260422160217745

重启prometheus服务:

代码语言:javascript
复制
systemctl restart prometheus

使用浏览器Ip+9090打开promethues的页面:

image-20260416163025314
image-20260416163025314

我们可以看到成功的检测到了mongodbd的告警啦!

image-20260422160447680
image-20260422160447680

为了实现Prometheus对位于公网或不同局域网中的MongoDB数据库的监控,可在目标机器上部署mongodb_exporter以暴露数据库指标,并通过内网穿透工具cpolar将其本地监听端口(如9216)安全地映射到公网。Prometheus服务器即可通过cpolar 提供的公网地址拉取远端MongoDB实例的监控数据,从而在不依赖复杂网络配置或无需直接暴露数据库本身的前提下,完成跨网络的安全监控集成。

6.安装cpolar实现随时随地开发

6.1 什么是cpolar?

cpolar是一款安全高效的内网穿透工具,无需公网IP或复杂配置,只需一条命令,即可将本地服务器、Web服务或任意端口映射到公网,让你随时随地远程访问内网应用,特别适合开发调试、远程运维和应急部署等场景。

6.2 部署cpolar

cpolar 可以将你本地电脑中的服务(如 SSH、Web、数据库)映射到公网。即使你在家里或外出时,也可以通过公网地址连接回本地运行的开发环境。

❤️以下是安装cpolar步骤:

使用一键脚本安装命令:

代码语言:javascript
复制
sudo curl https://get.cpolar.sh | sh
image-20250725104019896
image-20250725104019896

安装完成后,执行下方命令查看cpolar服务状态:(如图所示即为正常启动)

代码语言:javascript
复制
sudo systemctl status cpolar
22e5adfaf290a17fc3384bb296055259
22e5adfaf290a17fc3384bb296055259

Cpolar安装和成功启动服务后,在浏览器上输入虚拟机主机IP加9200端口即:【http://ip:9200】访问Cpolar管理界面,使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可:

打开浏览器访问本地9200端口,使用cpolar账户密码登录即可,登录后即可对隧道进行管理。

8a6698b1bf26d64ba3645827fbfb1c29
8a6698b1bf26d64ba3645827fbfb1c29

7.配置公网地址

登录cpolar web UI管理界面后,点击左侧仪表盘的隧道管理——创建隧道:

  • 隧道名称:可自定义,本例使用了:mongodb_exporter,注意不要与已有的隧道名称重复
  • 协议:http
  • 本地地址:9216
  • 域名类型:随机域名
  • 地区:选择China Top
image-20260422161312423
image-20260422161312423

创建成功后,打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址,接下来就可以在其他电脑或者移动端设备(异地)上,使用地址访问。

image-20260422161458537
image-20260422161458537

访问成功。

image-20260422161525768
image-20260422161525768

8.将本MongoDB_exporter暴露给Prometheus进行远程抓取

Prometheus可以通过这个公网地址23c13f8d.r6.cpolar.top访问到运行在本地9216端口的MongoDB_exporter服务,从而抓取系统指标。

代码语言:javascript
复制
      - targets: ["23c13f8d.r6.cpolar.top"]
        labels:
          app: "mongodb_exporter"
image-20260422161656272
image-20260422161656272

重启prometheus服务:

代码语言:javascript
复制
systemctl restart prometheus

使用浏览器Ip+9090打开promethues的页面:

image-20260416163025314
image-20260416163025314

我们可以看到成功的抓取服务啦!

image-20260422161817182
image-20260422161817182

9.保留固定公网地址

使用cpolar为其配置二级子域名,该地址为固定地址,不会随机变化。

image-20251125141035399
image-20251125141035399

点击左侧的预留,选择保留二级子域名,地区选择china Top,然后设置一个二级子域名名称,我这里演示使用的是mongodb,大家可以自定义。填写备注信息,点击保留。

image-20260422161920580
image-20260422161920580

登录cpolar web UI管理界面,点击左侧仪表盘的隧道管理——隧道列表,找到所要配置的隧道postgres,点击右侧的编辑

image-20260422161936880
image-20260422161936880

修改隧道信息,将保留成功的二级子域名配置到隧道中

  • 域名类型:选择二级子域名
  • Sub Domain:填写保留成功的二级子域名
  • 地区: China Top

点击更新

image-20260422162011490
image-20260422162011490

更新完成后,打开在线隧道列表,此时可以看到随机的公网地址已经发生变化,地址名称也变成了保留和固定的二级子域名名称。

image-20260422162023971
image-20260422162023971

最后,我们使用固定的公网地址在任意设备的浏览器中访问,可以看到成功访问本地部署的页面,这样一个永久不会变化的二级子域名公网网址即设置好了。

image-20260422162045833
image-20260422162045833

结尾

完成配置以后,MongoDB Exporter负责读取数据库内部状态,Prometheus负责持续采集和保存指标,告警规则则可以针对实例不可达、主节点变化、复制延迟和缓存压力等情况进行判断。

监控账号不应使用管理员权限。通常只需要授予clusterMonitor以及读取local数据库等必要权限,并限制账号的连接来源,避免为了采集方便而扩大数据库访问范围。

连接URI中包含的用户名和密码属于敏感凭据,不应直接写入公开文章、截图或代码仓库。正式环境应使用受限配置文件、环境变量或其他密钥管理方式,并避免以root用户长期运行Exporter。

告警表达式也需要根据实际导出的指标名称进行验证。不同MongoDB Exporter版本、兼容模式和数据库架构可能产生不同指标,副本集相关规则在单机环境中也不会具备相同意义。

通过 cpolar 映射9216端口后,远程Prometheus可以跨网络抓取指标。固定二级子域名适合长期采集,但Exporter接口可能暴露数据库版本、节点角色、连接数量和性能状态,因此公网地址不应公开传播。

MongoDB Exporter负责把数据库状态转换成可观测指标,Prometheus负责分析和判断,Alertmanager负责处理告警,cpolar负责补上跨网络采集通道。整套方案真正解决的,是让数据库风险在影响业务之前被持续看见,而不是等到服务变慢后再依靠日志追查。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 前言
  • 1.什么是MongoDB Exporter?
  • 2.Centos7安装MongoDB_Exporter实时监控MongoDB数据
  • 3.设置MongoDB监控专属用户
  • 4.配置prometheus监控MongoDB_exporter
  • 5.配置MongoDB告警
  • 6.安装cpolar实现随时随地开发
    • 6.1 什么是cpolar?
    • 6.2 部署cpolar
  • 7.配置公网地址
  • 8.将本MongoDB_exporter暴露给Prometheus进行远程抓取
  • 9.保留固定公网地址
  • 结尾
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档