MongoDB 监控

MongoDB 监控(Monitoring)全面指南

目标提前发现问题容量规划性能调优故障告警


一、监控核心维度(6 大类)

维度关键指标阈值建议
1. 系统资源CPU、内存、磁盘 IO、网络>80% 告警
2. MongoDB 进程mongod / mongos 状态、连接数连接 > 90% 最大值
3. 复制(Replica Set)复制延迟(repl lag)、oplog 窗口lag > 5s 告警
4. 分片(Sharding)chunk 分布、balancer、jumbo chunks分布不均 > 20%
5. 数据库操作QPS、慢查询、锁、页面错误慢查询 > 100ms
6. 存储索引大小、数据压缩、磁盘空间磁盘 > 85%

二、原生监控命令(实时查看)

命令用途
db.serverStatus()全量状态(最重要)
rs.status()副本集健康
sh.status()分片集群状态
db.currentOp()当前操作(杀慢查询)
db.stats()数据库统计
db.collection.stats()集合详情
// 一键查看关键指标
db.serverStatus({
  metrics: 1,
  locks: 1,
  tcmalloc: 1,
  wiredTiger: 1,
  repl: 1
})

三、关键指标详解(必看)

1. 连接数

db.serverStatus().connections
// current / available / totalCreated
  • 阈值current > 80% of maxIncomingConnections
  • 默认最大连接:取决于 ulimit -n,约 64k

2. 复制延迟(Replication Lag)

rs.status().members.forEach(m => {
  if (m.stateStr === "SECONDARY") {
    print(`${m.name}: ${m.optimeDate} (lag: ${(new Date() - m.optimeDate)/1000}s)`)
  }
})

告警:lag > 5 秒(生产),> 60 秒(严重)


3. Oplog 窗口(可回滚时间)

rs.printReplicationInfo()
// 例如:configured oplog size: 5% of disk → 48 hours

建议:至少保留 24 小时 oplog


4. 页面错误(Page Faults)

db.serverStatus().extra_info.page_faults
  • 硬页面错误(读磁盘)→ 工作集 > 内存
  • 解决:加内存、优化索引、减少扫描

5. 慢查询(Slow Queries)

db.getLog('global')  // 查看日志
db.setProfilingLevel(1, { slowms: 100 })  // 记录 >100ms 查询
db.system.profile.find().sort({ ts: -1 }).limit(10)

6. 锁与队列

db.serverStatus().globalLock
// activeClients, currentQueue
  • currentQueue > 0 → 写阻塞
  • activeClients.readers/writers 高 → 并发压力

7. 缓存命中率(WiredTiger)

db.serverStatus().wiredTiger.cache
// "bytes currently in the cache" / "maximum bytes configured"

健康值:> 70%
低命中 → 索引/查询不优


8. 分片均衡度

sh.status()
// 查看 chunks per shard
db.collection.getShardDistribution()

告警:最大/最小 shard 差 > 20%


四、监控系统推荐

工具类型特点推荐场景
MongoDB Atlas云原生自动告警、可视化、PITRAtlas 用户
MongoDB Ops Manager自托管企业级、自动化备份自建集群
Percona Monitoring and Management (PMM)开源免费、Grafana 集成推荐
Prometheus + mongodb_exporter开源灵活、云原生K8s 环境
Datadog / New Relic商业集成 APM企业级
Zabbix开源通用监控传统运维

五、Prometheus + Grafana 监控方案(推荐)

1. 部署 mongodb_exporter

# docker-compose.yml
version: '3.8'
services:
  mongodb_exporter:
    image: percona/mongodb_exporter:0.40
    command:
      - --mongodb.uri=mongodb://user:pass@mongo:27017
      - --collect-all
    ports: ["9216:9216"]

2. Prometheus 配置

scrape_configs:
  - job_name: 'mongodb'
    static_configs:
      - targets: ['exporter:9216']

3. Grafana 导入仪表盘

ID名称
2589MongoDB Overview
1551MongoDB Replica Set
13615MongoDB Sharded Cluster

六、告警规则(Prometheus 示例)

groups:
  - name: mongodb.alerts
    rules:
      - alert: MongoDBHighReplicationLag
        expr: mongodb_replset_member_optime_date - mongodb_replset_member_last_applied_optime_date > 5
        for: 1m
        labels: { severity: critical }
        annotations:
          summary: "副本延迟 > 5s"

      - alert: MongoDBHighConnections
        expr: mongodb_connections_current / mongodb_connections_max > 0.8
        for: 2m
        labels: { severity: warning }

      - alert: MongoDBDiskFull
        expr: (node_filesystem_free_bytes{mountpoint="/data/db"} / node_filesystem_size_bytes{mountpoint="/data/db"}) < 0.15
        for: 5m
        labels: { severity: critical }

七、自动化健康检查脚本(每日巡检)

#!/bin/bash
# health_check.sh

echo "=== MongoDB Health Check $(date) ==="

echo -e "\n1. 连接数"
mongosh --quiet --eval "db.serverStatus().connections" | jq

echo -e "\n2. 复制延迟"
mongosh --quiet --eval "rs.status().members.forEach(m=>{if(m.stateStr=='SECONDARY')print(m.name + ': ' + (new Date() - m.optimeDate)/1000 + 's')})"

echo -e "\n3. Oplog 窗口"
mongosh --quiet --eval "rs.printReplicationInfo()"

echo -e "\n4. 磁盘使用"
df -h /data/db

echo -e "\n5. 慢查询(最近10条)"
mongosh --quiet --eval "db.system.profile.find().sort({ts:-1}).limit(10).pretty()"
# cron 每天 6 AM 执行
0 6 * * * /opt/mongo_health_check.sh >> /var/log/mongo_health.log 2>&1

八、生产环境监控最佳实践

实践说明
所有节点部署 exporter避免单点
设置基线(Baseline)正常 QPS、内存使用
慢查询日志 + 采样slowms: 100 + sampleRate: 0.1
告警收敛避免告警风暴
定期演练模拟主节点宕机、磁盘满
结合 APM追踪慢查询来源

九、慢查询分析流程

graph TD
    A[发现慢查询] --> B{db.currentOp() + system.profile}
    B --> C{是否命中索引?}
    C -->|否| D[创建索引]
    C -->|是| E[检查扫描文档数]
    E --> F{是否可优化查询}
    F -->|是| G[重写查询 / 聚合]
    F -->|否| H[加硬件 / 分片]

十、学习资源


你想监控什么?

场景我可以提供
单节点开发环境简单 serverStatus 脚本
生产副本集PMM + 告警配置
分片集群均衡度 + Balancer 监控
K8s 部署Helm Chart + Prometheus Operator
成本优化工作集分析 + 索引精简

请告诉我:

  1. 部署方式(单机/副本集/分片/K8s)
  2. 是否已使用监控工具
  3. 最关心的指标(延迟?磁盘?QPS?)

我可以为你交付 完整监控方案 + 仪表盘 JSON + 告警规则

文章已创建 2371

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部