前言
在当今云原生与微服务架构盛行的时代,数据库的可观测性已成为保障系统稳定性和性能的关键一环。作为广受欢迎的NoSQL数据库,MongoDB被广泛应用于各类高并发、高可用场景中。然而,面对日益复杂的业务需求和动态变化的负载压力,仅靠日志和手动排查已远远无法满足高效运维的要求。如何将MongoDB的运行状态“可视化”?如何在性能瓶颈或异常发生前及时预警?答案之一便是引入专业的监控工具——MongoDB Exporter。作为Prometheus生态中的重要组件,MongoDB Exporter能够实时采集数据库的关键指标(如连接数、操作延迟、复制状态、内存使用等),并通过Grafana等可视化平台呈现,真正做到“看得见、告得准”。本文将深入介绍MongoDB Exporter的部署方法、核心指标解读以及与Prometheus + Alertmanager的集成实践,帮助运维工程师构建一套高效、可靠的MongoDB监控告警体系,让数据库运维从“被动救火”走向“主动预防”。
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
解压:
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
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")
4.配置prometheus监控MongoDB_exporter
没有prometheus的小伙伴可以参考这篇文章:监控不再局域网!Cpolar 让 Prometheus 走出内网限制! – cpolar 极点云官网
找到prometheus的配置文件,编辑添加如下内容:
vi prometheus.yml
- targets: ["localhost:9216"]
labels:
app: "mongodb_exporter"
重启prometheus服务:
systemctl restart prometheus
使用浏览器Ip+9090打开promethues的页面:
我们可以看到成功的检测到了mongodb_exporter服务啦!
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 }}."
在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实例的监控数据,从而在不依赖复杂网络配置或无需直接暴露数据库本身的前提下,完成跨网络的安全监控集成。
6.安装cpolar实现随时随地开发
6.1 什么是cpolar?
cpolar是一款安全高效的内网穿透工具,无需公网IP或复杂配置,只需一条命令,即可将本地服务器、Web服务或任意端口映射到公网,让你随时随地远程访问内网应用,特别适合开发调试、远程运维和应急部署等场景。
6.2 部署cpolar
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账户密码登录即可,登录后即可对隧道进行管理。
7.配置公网地址
登录cpolar web UI管理界面后,点击左侧仪表盘的隧道管理——创建隧道:
- 隧道名称:可自定义,本例使用了:mongodb_exporter,注意不要与已有的隧道名称重复
-
协议:http
-
本地地址:9216
-
域名类型:随机域名
-
地区:选择China Top
创建成功后,打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址,接下来就可以在其他电脑或者移动端设备(异地)上,使用地址访问。
访问成功。
8.将本MongoDB_exporter暴露给Prometheus进行远程抓取
Prometheus可以通过这个公网地址23c13f8d.r6.cpolar.top访问到运行在本地9216端口的MongoDB_exporter服务,从而抓取系统指标。
- targets: ["23c13f8d.r6.cpolar.top"]
labels:
app: "mongodb_exporter"
重启prometheus服务:
systemctl restart prometheus
使用浏览器Ip+9090打开promethues的页面:
我们可以看到成功的抓取服务啦!
9.保留固定公网地址
使用cpolar为其配置二级子域名,该地址为固定地址,不会随机变化。
点击左侧的预留,选择保留二级子域名,地区选择china Top,然后设置一个二级子域名名称,我这里演示使用的是mongodb,大家可以自定义。填写备注信息,点击保留。
登录cpolar web UI管理界面,点击左侧仪表盘的隧道管理——隧道列表,找到所要配置的隧道postgres,点击右侧的编辑。
修改隧道信息,将保留成功的二级子域名配置到隧道中
- 域名类型:选择二级子域名
- Sub Domain:填写保留成功的二级子域名
- 地区: China Top
点击更新
更新完成后,打开在线隧道列表,此时可以看到随机的公网地址已经发生变化,地址名称也变成了保留和固定的二级子域名名称。
最后,我们使用固定的公网地址在任意设备的浏览器中访问,可以看到成功访问本地部署的页面,这样一个永久不会变化的二级子域名公网网址即设置好了。
结尾
数据库可观测性不再是“锦上添花”,而是运维工作的“基础设施”。MongoDB Exporter作为连接MongoDB与云原生监控生态的桥梁,是每一位DBA和SRE的必备利器。唯有让指标“看得见”,才能让风险“防得住”;唯有让告警“告得准”,才能让系统“稳得住”。在迈向智能运维的道路上,从部署一个Exporter开始,为你的MongoDB装上“眼睛”和“哨兵”。
感谢您对本篇文章的喜爱,有任何问题欢迎留言交流。cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站































