MongoDB Exporter监控实战:指标采集、Prometheus告警与远程抓取 前言MongoDB用在业务里时最怕的不是它报错而是问题已经开始积累运维却还没有察觉。连接数突然升高、复制延迟变大、查询队列堆积、缓存命中率下降这些变化如果只靠日志和人工巡检很容易发现得太晚。对数据库运维来说真正有价值的是提前看到趋势。服务还没完全不可用时就能知道当前负载是否异常业务还没反馈变慢前就能看到查询、连接、内存和复制状态是否已经偏离正常范围。MongoDB Exporter就是把MongoDB接入Prometheus监控体系的关键组件。它会连接MongoDB实例采集数据库运行指标并通过/metrics接口暴露成Prometheus可以抓取的格式。后续再配合Grafana和Alertmanager就能实现可视化和告警。本文将以CentOS 7环境为例演示MongoDB Exporter的下载、解压、启动、systemd服务配置以及MongoDB监控专属用户创建。随后再把Exporter接入Prometheus配置MongoDB不可达、主节点变化、复制延迟、连接数过高、慢操作和缓存使用率等告警规则。如果Prometheus和MongoDB Exporter不在同一个网络环境里本文还会继续通过 cpolar 将本地9216指标端口映射到公网让远程Prometheus也能安全抓取内网MongoDB指标而不需要直接暴露数据库端口。1.什么是MongoDB ExporterMongoDB 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/wgethttps://github.com/percona/mongodb_exporter/releases/download/v0.43.1/mongodb_exporter-0.43.1.linux-amd64.tar.gz解压tar-vxzfmongodb_exporter-0.43.1.linux-amd64.tar.gzmvmongodb_exporter-0.43.1.linux-amd64 mongodb_exporter启动Exporter服务:/app/mongodb_exporter/mongodb_exporter\--mongodb.urimongodb://mongodb_exporter:shanjixin520192.168.42.140:27017/admin\--web.listen-address:9216\--compatible-mode配置Systemd服务vim/usr/lib/systemd/system/mongodb_exporter.service[Unit]DescriptionMongoDB ExporterAfternetwork.target[Service]UserrootGrouprootTypesimpleExecStart/app/mongodb_exporter/mongodb_exporter\--mongodb.urimongodb://mongodb_exporter:shanjixin520192.168.42.140:27017/admin\--web.listen-address:9216\--compatible-modeRestartalwaysRestartSec3[Install]WantedBymulti-user.target服务管理命令# 重载systemd配置systemctl daemon-reload# 设置开机自启systemctlenablemongodb_exporter# 服务控制systemctl stop mongodb_exporter systemctl restart mongodb_exporter systemctl status mongodb_exporter3.设置MongoDB监控专属用户以管理员身份登录MongoDBmongo-uadmin-p--authenticationDatabaseadmin切换至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的配置文件编辑添加如下内容viprometheus.yml- targets:[localhost:9216]labels: app:mongodb_exporter重启prometheus服务:systemctl restart prometheus使用浏览器Ip9090打开promethues的页面我们可以看到成功的检测到了mongodb_exporter服务啦5.配置MongoDB告警进入到prometheus配置目录下cd/app/prometheus创建一个规则文件例如mongodb_alerts.ymlvimongodb_alerts.ymlgroups: - name: mongodb-alerts rules:# 1. MongoDB 实例不可达Exporter 挂了或 MongoDB 连不上- alert: MongoDBDown expr: up{jobmongodb}0for: 1m labels: severity: critical annotations: summary:MongoDB instance downdescription:MongoDB Exporter ({{$labels.instance }}) has been down for more than 1 minute.# 2. 主节点变更副本集主节点切换可能表示异常故障转移- alert: MongoDBPrimaryChanged expr: changes(mongodb_replset_member_state{name~.*PRIMARY.*}[5m])0for: 1m labels: severity: warning annotations: summary:MongoDB primary node changeddescription:MongoDB replica set primary has changed in the last 5 minutes on {{$labels.instance }}.# 3. 复制延迟过高仅适用于副本集- alert: MongoDBReplicationLagHigh expr: mongodb_replset_member_optime_date{statePRIMARY}- ignoring(state,name)mongodb_replset_member_optime_date{stateSECONDARY}30for: 2m labels: severity: warning annotations: summary:MongoDB replication lag too highdescription:Replication lag on {{$labels.instance }} is over 30 seconds.# 4. 连接数过高接近最大连接限制默认通常是 20000- alert: MongoDBTooManyConnections expr: mongodb_connections{statecurrent}15000for: 5m labels: severity: warning annotations: summary:High MongoDB connectionsdescription:{{$value}} current connections on {{$labels.instance }}, approaching limit.# 5. 查询延迟高可选需 exporter 支持 detailed metrics- alert: MongoDBSlowOperations expr: rate(mongodb_op_counters{typequery}[5m])0and rate(mongodb_mongod_global_lock_current_queue_total[5m])10for: 3m labels: severity: warning annotations: summary:MongoDB slow operations detecteddescription:High query queue or slow ops on {{$labels.instance }}.# 6. 内存使用过高WiredTiger 缓存接近上限- alert: MongoDBHighCacheUsage expr: mongodb_wt_cache_bytes_in_use / mongodb_wt_cache_max_bytes0.9for: 5m labels: severity: warning annotations: summary:MongoDB cache usage too highdescription:WiredTiger cache usage is over 90% on {{$labels.instance }}.在Prometheus中加载告警规则修改prometheus.yml加入rule_filesrule_files: -/app/prometheus//mongodb_alerts.yml配置Alertmanager确保Prometheus的alerting指向Alertmanager# prometheus.ymlalerting: alertmanagers: - static_configs: - targets:[localhost:9093]重启prometheus服务:systemctl restart prometheus使用浏览器Ip9090打开promethues的页面我们可以看到成功的检测到了mongodbd的告警啦为了实现Prometheus对位于公网或不同局域网中的MongoDB数据库的监控可在目标机器上部署mongodb_exporter以暴露数据库指标并通过内网穿透工具cpolar将其本地监听端口如9216安全地映射到公网。Prometheus服务器即可通过cpolar 提供的公网地址拉取远端MongoDB实例的监控数据从而在不依赖复杂网络配置或无需直接暴露数据库本身的前提下完成跨网络的安全监控集成。6.安装cpolar实现随时随地开发6.1 什么是cpolarcpolar是一款安全高效的内网穿透工具无需公网IP或复杂配置只需一条命令即可将本地服务器、Web服务或任意端口映射到公网让你随时随地远程访问内网应用特别适合开发调试、远程运维和应急部署等场景。6.2 部署cpolarcpolar 可以将你本地电脑中的服务如 SSH、Web、数据库映射到公网。即使你在家里或外出时也可以通过公网地址连接回本地运行的开发环境。❤️以下是安装cpolar步骤使用一键脚本安装命令sudocurlhttps://get.cpolar.sh|sh安装完成后执行下方命令查看cpolar服务状态如图所示即为正常启动sudosystemctl status cpolarCpolar安装和成功启动服务后在浏览器上输入虚拟机主机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使用浏览器Ip9090打开promethues的页面我们可以看到成功的抓取服务啦9.保留固定公网地址使用cpolar为其配置二级子域名该地址为固定地址不会随机变化。点击左侧的预留选择保留二级子域名地区选择china Top然后设置一个二级子域名名称我这里演示使用的是mongodb大家可以自定义。填写备注信息点击保留。登录cpolar web UI管理界面点击左侧仪表盘的隧道管理——隧道列表找到所要配置的隧道postgres点击右侧的编辑。修改隧道信息将保留成功的二级子域名配置到隧道中域名类型选择二级子域名Sub Domain填写保留成功的二级子域名地区: China Top点击更新更新完成后打开在线隧道列表此时可以看到随机的公网地址已经发生变化地址名称也变成了保留和固定的二级子域名名称。最后我们使用固定的公网地址在任意设备的浏览器中访问可以看到成功访问本地部署的页面这样一个永久不会变化的二级子域名公网网址即设置好了。结尾完成部署后MongoDB Exporter就可以作为MongoDB监控链路里的指标采集端运行。它负责把数据库内部状态转换成Prometheus可识别的指标让原本不直观的连接数、复制状态、缓存、操作计数和实例存活情况变得可观察。这套方案的价值不只是能在Prometheus里看到一个抓取目标而是让MongoDB从“出了问题再查日志”变成“指标异常提前预警”。当复制延迟升高、连接数逼近阈值、实例不可达或缓存使用异常时告警规则可以更早触发给运维留出处理时间。配置Alertmanager后告警可以进一步接入邮件、企业微信、飞书或其他通知渠道。这样一来MongoDB监控就不只是一个页面而是一套能够持续发现问题、提示风险、辅助定位的运维机制。配置 cpolar 后本地运行的MongoDB Exporter可以被远程Prometheus抓取。随机域名适合临时测试固定二级子域名更适合长期监控避免Prometheus配置中的抓取地址频繁变化。需要注意的是公网开放的应该是Exporter指标端口而不是MongoDB数据库端口本身。监控用户也应只授予必要的clusterMonitor和只读权限避免使用高权限账号。MongoDB Exporter负责采集指标Prometheus负责存储和告警cpolar负责补上跨网络抓取入口当这几部分组合起来以后MongoDB运维就能从被动排查逐步转向主动预警。