MongoDB Linux 运行状态监控实操指南
一 快速巡检命令
mongostat --host **localhost** --port **27017** --username **admin** --password **yourpassword** --authenticationDatabase **admin**mongotop --host **localhost** --port **27017** --username **admin** --password **yourpassword** --authenticationDatabase **admin**db.serverStatus()(返回 JSON,含 connections、mem、network、opcounters、wiredTiger 等)use yourdb; db.yourCollection.stats()(含 count、size、storageSize、totalIndexSize、avgObjSize 等)。二 图形化与可视化监控
三 系统层面监控
top -p $(cat **/var/run/mongodb/mongod.pid**) 或 htop 观察 CPU、内存 占用。iostat -x 1 检查 磁盘 I/O 与 await/rrqm/s 等指标。vmstat 1 观察 swap、上下文切换、CPU 等待。tail -f **/var/log/mongodb/mongod.log** 实时查看 启动信息、慢查询、复制与分片状态、错误告警。四 关键指标与告警阈值示例
| 维度 | 关键指标 | 建议告警阈值 | 说明 |
|---|---|---|---|
| 连接 | connections.current / connections.available | current 持续接近 available | 连接池紧张,可能拒绝新连接 |
| 操作吞吐 | opcounters.insert/query/update/delete per sec | 突增或骤降 | 业务异常或阻塞征兆 |
| 延迟与队列 | qr/qw、locked、globalLock.totalTime | qr/qw 长期大于 0 或 locked 高 | 读写被阻塞,需查锁与慢查询 |
| 内存与页面错误 | mem.resident、mem.virtual、faults | faults 持续大于 0 | 频繁缺页,磁盘 I/O 压力或内存不足 |
| 存储引擎 | wiredTiger.cache.、wiredTiger.concurrentTransactions.、wiredTiger.checkpoint | cache 使用率长期高、checkpoint 频繁 | 可能需调优 WT 缓存或检查磁盘 |
| 复制与分片 | replSetGetStatus、replication lag、sharding | replication lag 持续增长 | 主从延迟或分片不均衡 |
| 磁盘 | iostat await、svctm、util | await 高、util 接近 100% | 磁盘成为瓶颈,影响写入与查询 |
| 日志 | mongod.log 错误/慢查询 | 出现错误日志或慢查询增多 | 及时优化查询与索引、修复错误 |
五 一键巡检脚本示例
#!/usr/bin/env bash
set -e
HOST="localhost"
PORT="27017"
USER="admin"
PASS="yourpassword"
AUTH_DB="admin"
LOG="/var/log/mongodb/mongod.log"
PID_FILE="/var/run/mongodb/mongod.pid"
echo "=== MongoDB 快速巡检 $(date) ==="
# 1) mongostat
echo -e "\n[1/5] mongostat (10秒采样):"
mongostat --host "$HOST" --port "$PORT" -u "$USER" -p "$PASS" --authenticationDatabase "$AUTH_DB" --rowcount 10
# 2) mongotop
echo -e "\n[2/5] mongotop (10秒采样):"
mongotop --host "$HOST" --port "$PORT" -u "$USER" -p "$PASS" --authenticationDatabase "$AUTH_DB" --rowcount 10
# 3) 连接数与内存
echo -e "\n[3/5] 连接与内存:"
mongo --host "$HOST" --port "$PORT" -u "$USER" -p "$PASS" --authenticationDatabase "$AUTH_DB" --quiet <<'EOF'
db.serverStatus().connections
db.serverStatus().mem
EOF
# 4) 复制状态
echo -e "\n[4/5] 复制状态:"
mongo --host "$HOST" --port "$PORT" -u "$USER" -p "$PASS" --authenticationDatabase "$AUTH_DB" --quiet <<'EOF'
rs.status().members.forEach(function(m){print(m.name,m.stateStr,m.optimeDate,JSON.stringify(m.lastHeartbeatMessage||""))})
EOF
# 5) 错误与慢查询日志尾部
echo -e "\n[5/5] 最近错误与慢查询日志尾部 (20行):"
tail -n 20 "$LOG" | egrep -i "error|fail|warning|slow query"
echo -e "\n=== 巡检完成 ==="
mongo_check.sh,执行 chmod +x mongo_check.sh && ./mongo_check.sh。