MongoDB 在 Ubuntu 上的监控实践
一 快速上手 内置与命令行工具
- 服务与日志
- 检查运行状态:sudo systemctl status mongod
- 实时查看日志:journalctl -u mongod -f
- 实时性能
- 吞吐与锁:mongostat --host localhost --port 27017 --username admin --password --authenticationDatabase admin
- 关注:insert/query/update/delete、getmore、command、flushes、mapped、faults、locked、qr/qw、ar/aw
- 集合热点:mongotop --host localhost --port 27017 --username admin --password --authenticationDatabase admin
- 关注:按 ns(库.集合) 的 read/write 时间占比
- Shell 诊断
- 全局状态:db.serverStatus()(含 connections、mem、metrics、opcounters、wiredTiger、repl 等)
- 集合统计:db.collection.stats()(含 count、size、storageSize、totalIndexSize、indexSizes)
- 查询诊断:db.collection.find({…}).explain(“executionStats”)(看 executionTimeMillis、totalKeysExamined、totalDocsExamined、stage)
- 当前操作:db.currentOp() 定位长事务/慢操作
二 图形化与托管监控
- 官方 GUI:MongoDB Compass
- 安装示例:wget https://downloads.mongodb.com/compass/mongodb-compass_1.26.0_amd64.deb && sudo dpkg -i mongodb-compass_1.26.0_amd64.deb
- 连接实例后可查看 性能指标、索引、查询分析,适合日常巡检与开发排障
- 官方托管:MongoDB Cloud Manager
- 提供 监控、告警、备份、性能顾问 等,适合生产环境的持续观测与合规
- 企业/传统平台
- Zabbix:通过模板/自定义键值采集并做阈值告警,适合已有 Zabbix 体系的团队
三 自建可观测性平台 Prometheus Grafana
- 组件与端口
- mongodb_exporter(Percona):默认 9216
- Prometheus:默认 9090
- Alertmanager:默认 9093
- Grafana:默认 3000
- 部署示例(Docker)
- 启动 exporter:docker run -d --name mongodb_exporter -p 9216:9216 -e MONGODB_URI=mongodb://:@:27017 percona/mongodb_exporter:latest
- Prometheus 抓取配置片段
- scrape_configs:
- job_name: ‘mongodb’
static_configs:
- targets: [‘<exporter_host>:9216’]
- Grafana
- 添加 Prometheus 数据源,导入社区仪表盘(如 ID 2583 或 Percona 提供的 MongoDB Exporter 仪表盘)
- 告警规则示例(rules.yml)
- groups:
- name: mongodb-alerts
rules:
- alert: MongodbDown
expr: mongodb_up == 0
for: 0m
labels: { severity: critical }
annotations:
summary: “MongoDB Down on {{ $labels.instance }}”
description: “MongoDB 实例不可达,当前值:{{ $value }}”
- alert: MongodbTooManyConnections
expr: avg by(instance) (rate(mongodb_ss_connections{conn_type=“current”}[1m])) / avg by(instance) (sum by(instance)(mongodb_ss_connections)) * 100 > 80
for: 2m
labels: { severity: warning }
annotations:
summary: “MongoDB 连接数超过 80%({{ $labels.instance }})”
description: “当前连接占用率:{{ $value | humanizePercentage }}”
- alert: MongodbCursorsTimeouts
expr: increase(mongodb_ss_metrics_cursor_timedout[1m]) > 100
for: 2m
labels: { severity: warning }
annotations:
summary: “MongoDB 游标超时过多({{ $labels.instance }})”
description: “1 分钟内超时游标数:{{ $value }}”
- alert: MongodbVirtualMemoryUsage
expr: (sum by(instance)(mongodb_ss_mem_virtual)) / (sum by(instance)(mongodb_ss_mem_resident)) > 3
for: 2m
labels: { severity: warning }
annotations:
summary: “MongoDB 虚拟内存倍数过高({{ $labels.instance }})”
description: “虚拟/常驻内存比:{{ $value | humanizePercentage }}”
- 生效与验证
- 配置检查:docker exec -it prometheus promtool check config /etc/prometheus/prometheus.yml
- 热加载:curl -X POST http://localhost:9090/-/reload
- 在 Prometheus:Status → Targets 确认 UP;Alerts 页面查看规则与触发状态
四 关键指标与告警建议
- 连接与队列
- 关注:connections.current/available、qr/qw
- 判定:持续接近上限或队列增长,可能预示阻塞或并发不足
- 操作与错误
- 关注:opcounters.insert/query/update/delete 的突增;asserts.regular/warning 异常
- 内存与页面错误
- 关注:mem.resident、mem.virtual、faults
- 判定:缺页升高常提示工作集超过内存或索引/数据未充分缓存
- 落盘与 WiredTiger
- 关注:flushes(落盘次数)、wiredTiger.cache.*(bytes currently in cache、pages read/write)
- 判定:评估 缓存命中 与 I/O 压力
- 复制健康(副本集)
- 关注:replSetGetStatus 中的 optimeDate、health、lastHeartbeat
- 判定:设置 复制延迟阈值告警
- 慢查询
- 开启并分析 profiling,结合 db.currentOp() 与 explain(“executionStats”) 定位高成本查询与缺失/低效索引
五 安全与连通性配置要点
- 启用鉴权
- 配置 /etc/mongod.conf:security.authorization: enabled
- 监控采集使用具备只读/监控所需角色的专用账户
- 网络与防火墙
- 如需远程采集,配置 net.bindIp(如 0.0.0.0 或白名单),并放行 27017
- 仅开放必要来源 IP
- 最小权限
- 避免使用高权限账户进行日常采集,遵循 最小权限原则