MongoDB Exporter部署实践:接入Prometheus监控与告警体系!

MongoDB Exporter部署实践:接入Prometheus监控与告警体系!
文章目录前言1.什么是MongoDB Exporter2.Centos7安装MongoDB_Exporter实时监控MongoDB数据3.设置MongoDB监控专属用户4.配置prometheus监控MongoDB_exporter5.配置MongoDB告警6.实现随时随地开发6.1 什么是cpolar6.2 部署7.配置公网地址8.将本MongoDB_exporter暴露给Prometheus进行远程抓取9.保留固定公网地址结尾前言MongoDB服务能够正常启动并不代表数据库一直处于健康状态。连接数持续增长、复制延迟扩大、WiredTiger缓存接近上限或者查询队列开始积压都可能在业务明显变慢之前出现仅靠日志和人工检查很难持续发现这些变化。MongoDB Exporter负责使用专用监控账号读取数据库运行状态并将连接数、操作计数、复制集状态、缓存使用和内存消耗等数据转换为Prometheus能够识别的指标。Prometheus定时抓取后可以保存历史趋势、执行PromQL查询并配合Alertmanager对实例不可达、复制异常和资源使用过高等情况发送告警。这套方案适合单机MongoDB、副本集和需要集中监控的多实例环境。当Exporter与Prometheus位于不同网络时可以映射9216指标端口让远端监控服务器继续抓取数据。由于指标接口可能暴露数据库结构和运行状态公网地址不应随意公开监控账号也应只授予采集所需的最低权限。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.实现随时随地开发6.1 什么是cpolar它是一款安全高效的内网穿透工具无需公网IP或复杂配置只需一条命令即可将本地服务器、Web服务或任意端口映射到公网让你随时随地远程访问内网应用特别适合开发调试、远程运维和应急部署等场景。6.2 部署它可以将你本地电脑中的服务如 SSH、Web、数据库映射到公网。即使你在家里或外出时也可以通过公网地址连接回本地运行的开发环境。❤️以下是安装cpolar步骤使用一键脚本安装命令sudocurlhttps://get.cpolar.sh|sh安装完成后执行下方命令查看服务状态如图所示即为正常启动sudosystemctl status cpolar安装和成功启动服务后在浏览器上输入虚拟机主机IP加9200端口即:【http://ip:9200】访问管理界面使用官网注册的账号登录,登录后即可看到web 配置界面,接下来在web 界面配置即可打开浏览器访问本地9200端口使用账户密码登录即可,登录后即可对隧道进行管理。7.配置公网地址登录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.保留固定公网地址为其配置二级子域名该地址为固定地址不会随机变化。点击左侧的预留选择保留二级子域名地区选择china Top然后设置一个二级子域名名称我这里演示使用的是mongodb大家可以自定义。填写备注信息点击保留。登录web UI管理界面点击左侧仪表盘的隧道管理——隧道列表找到所要配置的隧道postgres点击右侧的编辑。修改隧道信息将保留成功的二级子域名配置到隧道中域名类型选择二级子域名Sub Domain填写保留成功的二级子域名地区: China Top点击更新更新完成后打开在线隧道列表此时可以看到随机的公网地址已经发生变化地址名称也变成了保留和固定的二级子域名名称。最后我们使用固定的公网地址在任意设备的浏览器中访问可以看到成功访问本地部署的页面这样一个永久不会变化的二级子域名公网网址即设置好了。结尾MongoDB Exporter打通了MongoDB与Prometheus之间的指标链路让数据库运行状态从依赖日志排查转变为可以持续采集、查询和告警的数据。结合合理的规则后实例离线、复制延迟、连接数异常和缓存压力都能更早被发现。它补充了跨网络采集能力适合异地MongoDB和没有公网IP的环境。长期使用时应配置固定地址、限制指标接口访问并妥善保护数据库监控账号。告警阈值还需要根据真实负载持续调整避免直接照搬示例产生误报或遗漏。