运维必备!用MongoDB Exporter让数据库指标“看得见、告得准”

前言

在当今云原生与微服务架构盛行的时代,数据库的可观测性已成为保障系统稳定性和性能的关键一环。作为广受欢迎的NoSQL数据库,MongoDB被广泛应用于各类高并发、高可用场景中。然而,面对日益复杂的业务需求和动态变化的负载压力,仅靠日志和手动排查已远远无法满足高效运维的要求。如何将MongoDB的运行状态“可视化”?如何在性能瓶颈或异常发生前及时预警?答案之一便是引入专业的监控工具——MongoDB Exporter。作为Prometheus生态中的重要组件,MongoDB Exporter能够实时采集数据库的关键指标(如连接数、操作延迟、复制状态、内存使用等),并通过Grafana等可视化平台呈现,真正做到“看得见、告得准”。本文将深入介绍MongoDB Exporter的部署方法、核心指标解读以及与Prometheus + Alertmanager的集成实践,帮助运维工程师构建一套高效、可靠的MongoDB监控告警体系,让数据库运维从“被动救火”走向“主动预防”。

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方式下载:

# 进入目标目录
cd /app/
wget https://github.com/percona/mongodb_exporter/releases/download/v0.43.1/mongodb_exporter-0.43.1.linux-amd64.tar.gz

img

解压:

tar -vxzf mongodb_exporter-0.43.1.linux-amd64.tar.gz
mv mongodb_exporter-0.43.1.linux-amd64 mongodb_exporter

启动Exporter服务:

/app/mongodb_exporter/mongodb_exporter \
  --mongodb.uri=mongodb://mongodb_exporter:shanjixin520@192.168.42.140:27017/admin \
  --web.listen-address=:9216 \
  --compatible-mode

配置Systemd服务:

vim /usr/lib/systemd/system/mongodb_exporter.service
[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

服务管理命令:

# 重载systemd配置
systemctl daemon-reload
# 设置开机自启
systemctl enable mongodb_exporter
# 服务控制
systemctl stop mongodb_exporter
systemctl restart mongodb_exporter
systemctl status mongodb_exporter

image-20260422154008980

3.设置MongoDB监控专属用户

以管理员身份登录MongoDB:

 mongo -u admin -p --authenticationDatabase admin

切换至admin数据库:

use admin

创建监控用户:

db.createUser({
  user: "mongodb_expo",
  pwd: "shanjixin520",
  roles: [
    { role: "clusterMonitor", db: "admin" },
    { role: "read", db: "local" }
  ]
});

验证用户创建:

db.getUser("mongodb_exporter")

image-20260422153046518

4.配置prometheus监控MongoDB_exporter

没有prometheus的小伙伴可以参考这篇文章:监控不再局域网!Cpolar 让 Prometheus 走出内网限制! – cpolar 极点云官网

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

vi prometheus.yml
      - targets: ["localhost:9216"]
        labels:
          app: "mongodb_exporter"

image-20260422154703339

重启prometheus服务:

systemctl restart prometheus

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

image-20260416163025314

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

image-20260422154843208

5.配置MongoDB告警

进入到prometheus配置目录下:

cd /app/prometheus

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

vi mongodb_alerts.yml
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

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

rule_files:
  - "/app/prometheus//mongodb_alerts.yml"

image-20260422155700329

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

# prometheus.yml
alerting:
  alertmanagers:
    - static_configs:
        - targets: ['localhost:9093']

image-20260422160217745

重启prometheus服务:

systemctl restart prometheus

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

image-20260416163025314

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

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步骤:

官网在此:https://www.cpolar.com

使用一键脚本安装命令:

sudo curl https://get.cpolar.sh | sh

image-20250725104019896

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

sudo systemctl status cpolar

22e5adfaf290a17fc3384bb296055259

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

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

8a6698b1bf26d64ba3645827fbfb1c29

7.配置公网地址

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

  • 隧道名称:可自定义,本例使用了:mongodb_exporter,注意不要与已有的隧道名称重复

  • 协议:http

  • 本地地址:9216

  • 域名类型:随机域名

  • 地区:选择China Top

image-20260422161312423

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

image-20260422161458537

访问成功。

image-20260422161525768

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

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

      - targets: ["23c13f8d.r6.cpolar.top"]
        labels:
          app: "mongodb_exporter"

image-20260422161656272

重启prometheus服务:

systemctl restart prometheus

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

image-20260416163025314

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

image-20260422161817182

9.保留固定公网地址

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

image-20251125141035399

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

image-20260422161920580

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

image-20260422161936880

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

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

点击更新

image-20260422162011490

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

image-20260422162023971

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

image-20260422162045833

结尾

数据库可观测性不再是“锦上添花”,而是运维工作的“基础设施”。MongoDB Exporter作为连接MongoDB与云原生监控生态的桥梁,是每一位DBA和SRE的必备利器。唯有让指标“看得见”,才能让风险“防得住”;唯有让告警“告得准”,才能让系统“稳得住”。在迈向智能运维的道路上,从部署一个Exporter开始,为你的MongoDB装上“眼睛”和“哨兵”。

感谢您对本篇文章的喜爱,有任何问题欢迎留言交流。cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站

Share:

发表回复

目录

On Key

推荐文章