
MongoDB能够正常连接,并不代表数据库始终运行健康。连接数量持续上涨、副本集复制延迟扩大、WiredTiger缓存接近上限,或者查询队列逐渐积压,都可能在业务明显变慢之前出现。
只依靠日志和人工登录检查,很难持续观察这些变化。更实用的做法,是把MongoDB内部状态转换为Prometheus能够识别的指标,再统一保存、查询并设置告警条件。
MongoDB Exporter就是连接数据库与监控平台的中间组件。它使用专门的监控账号读取连接、操作计数、复制状态、缓存和内存等数据,并通过/metrics接口对外提供标准指标。
本文会以CentOS 7为例,完成Percona MongoDB Exporter的下载、解压和systemd服务配置,再创建具有clusterMonitor等必要权限的MongoDB监控用户,并验证本地9216端口能够正常输出数据。
本地采集链路运行正常后,还会将Exporter加入Prometheus配置,设置实例不可达、复制延迟、连接数和缓存使用率等告警,并借助 cpolar 建立公网入口,让远程Prometheus也能跨网络抓取指标。

MongoDB Exporter是一个开源的监控数据采集工具,专门用于从MongoDB数据库实例中提取运行时指标,并以Prometheus可识别的格式暴露这些指标,从而实现对MongoDB的可观测性与性能监控。
核心作用
MongoDB Exporter的主要功能包括:
工作原理简述
常用开源实现
目前最主流的MongoDB Exporter是由percona维护的版本(原为dcu/mongodb_exporter的社区分支),它功能完善、活跃更新,并广泛用于生产环境。
GitHub地址: https://github.com/percona/mongodb_exporter
为什么运维需要它?
简言之,MongoDB Exporter是连接MongoDB与现代监控体系(Prometheus + Grafana)的关键桥梁,是构建可观测性基础设施不可或缺的一环。对于任何依赖MongoDB的生产系统,部署Exporter几乎已成为运维标配。
本地下载后上传到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
解压:
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
服务管理命令:
# 重载systemd配置
systemctl daemon-reload
# 设置开机自启
systemctl enable mongodb_exporter
# 服务控制
systemctl stop mongodb_exporter
systemctl restart mongodb_exporter
systemctl status mongodb_exporter
以管理员身份登录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")
找到prometheus的配置文件,编辑添加如下内容:
vi prometheus.yml - targets: ["localhost:9216"]
labels:
app: "mongodb_exporter"
重启prometheus服务:
systemctl restart prometheus使用浏览器Ip+9090打开promethues的页面:

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

进入到prometheus配置目录下:
cd /app/prometheus创建一个规则文件,例如mongodb_alerts.yml:
vi mongodb_alerts.ymlgroups:
- 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 }}."
在Prometheus中加载告警规则,修改prometheus.yml,加入rule_files:
rule_files:
- "/app/prometheus//mongodb_alerts.yml"
配置Alertmanager确保Prometheus的alerting指向Alertmanager:
# prometheus.yml
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093']
重启prometheus服务:
systemctl restart prometheus使用浏览器Ip+9090打开promethues的页面:

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

为了实现Prometheus对位于公网或不同局域网中的MongoDB数据库的监控,可在目标机器上部署mongodb_exporter以暴露数据库指标,并通过内网穿透工具cpolar将其本地监听端口(如9216)安全地映射到公网。Prometheus服务器即可通过cpolar 提供的公网地址拉取远端MongoDB实例的监控数据,从而在不依赖复杂网络配置或无需直接暴露数据库本身的前提下,完成跨网络的安全监控集成。
cpolar是一款安全高效的内网穿透工具,无需公网IP或复杂配置,只需一条命令,即可将本地服务器、Web服务或任意端口映射到公网,让你随时随地远程访问内网应用,特别适合开发调试、远程运维和应急部署等场景。
cpolar 可以将你本地电脑中的服务(如 SSH、Web、数据库)映射到公网。即使你在家里或外出时,也可以通过公网地址连接回本地运行的开发环境。
❤️以下是安装cpolar步骤:
使用一键脚本安装命令:
sudo curl https://get.cpolar.sh | sh
安装完成后,执行下方命令查看cpolar服务状态:(如图所示即为正常启动)
sudo systemctl status cpolar
Cpolar安装和成功启动服务后,在浏览器上输入虚拟机主机IP加9200端口即:【http://ip:9200】访问Cpolar管理界面,使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可:
打开浏览器访问本地9200端口,使用cpolar账户密码登录即可,登录后即可对隧道进行管理。

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

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

访问成功。

Prometheus可以通过这个公网地址23c13f8d.r6.cpolar.top访问到运行在本地9216端口的MongoDB_exporter服务,从而抓取系统指标。
- targets: ["23c13f8d.r6.cpolar.top"]
labels:
app: "mongodb_exporter"
重启prometheus服务:
systemctl restart prometheus使用浏览器Ip+9090打开promethues的页面:

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

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

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

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

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

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

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

完成配置以后,MongoDB Exporter负责读取数据库内部状态,Prometheus负责持续采集和保存指标,告警规则则可以针对实例不可达、主节点变化、复制延迟和缓存压力等情况进行判断。
监控账号不应使用管理员权限。通常只需要授予clusterMonitor以及读取local数据库等必要权限,并限制账号的连接来源,避免为了采集方便而扩大数据库访问范围。
连接URI中包含的用户名和密码属于敏感凭据,不应直接写入公开文章、截图或代码仓库。正式环境应使用受限配置文件、环境变量或其他密钥管理方式,并避免以root用户长期运行Exporter。
告警表达式也需要根据实际导出的指标名称进行验证。不同MongoDB Exporter版本、兼容模式和数据库架构可能产生不同指标,副本集相关规则在单机环境中也不会具备相同意义。
通过 cpolar 映射9216端口后,远程Prometheus可以跨网络抓取指标。固定二级子域名适合长期采集,但Exporter接口可能暴露数据库版本、节点角色、连接数量和性能状态,因此公网地址不应公开传播。
MongoDB Exporter负责把数据库状态转换成可观测指标,Prometheus负责分析和判断,Alertmanager负责处理告警,cpolar负责补上跨网络采集通道。整套方案真正解决的,是让数据库风险在影响业务之前被持续看见,而不是等到服务变慢后再依靠日志追查。