本文主要介绍MongoDB数据库日常巡检与健康检查的方法,包括巡检指标、检查脚本、健康评估等内容。风哥教程参考MongoDB官方文档Monitoring相关章节。
目录大纲
Part01-基础概念与理论知识
1.1 日常巡检概述
日常巡检是数据库运维工作的重要组成部分,通过定期检查数据库的运行状态,可以及时发现潜在问题,预防故障发生,保障数据库的稳定运行。
日常巡检的主要目的:
- 预防故障:及时发现潜在问题,避免故障发生
- 性能优化:发现性能瓶颈,进行优化调整
- 容量规划:监控资源使用情况,提前规划扩容
- 安全审计:检查安全配置,发现安全隐患
- 合规检查:确保数据库符合相关规范要求
日常巡检的内容:
- 系统层面:CPU、内存、磁盘、网络等资源使用情况
- 数据库层面:连接数、查询性能、复制状态、锁等待等
- 应用层面:慢查询、错误日志、业务指标等
- 安全层面:用户权限、审计日志、安全漏洞等
学习交流加群风哥微信: itpux-com
1.2 健康检查指标
MongoDB健康检查的关键指标:
- 连接数:当前连接数、可用连接数、连接使用率
- 内存使用:常驻内存、虚拟内存、缓存命中率
- 磁盘使用:数据目录大小、日志大小、磁盘使用率
- 复制状态:复制延迟、oplog大小、同步状态
- 查询性能:慢查询数量、查询执行时间、索引命中率
- 锁等待:全局锁、数据库锁、集合锁的等待时间
- 操作计数:插入、更新、删除、查询的操作次数
- 网络流量:接收和发送的网络流量
健康检查的标准:
- 连接使用率 < 80%
- 内存使用率 < 90%
- 磁盘使用率 < 85%
- 复制延迟 < 10秒
- 慢查询比例 < 1%
- 锁等待时间 < 100ms
更多视频教程www.fgedu.net.cn
Part02-生产环境规划与建议
2.1 巡检计划制定
巡检计划制定:
- 巡检频率:
- 每日巡检:连接数、磁盘空间、复制状态
- 每周巡检:性能指标、慢查询、错误日志
- 每月巡检:容量规划、安全配置、备份验证
- 巡检时间:选择业务低峰期进行巡检
- 巡检范围:覆盖所有数据库节点
- 巡检人员:指定专人负责,建立交接机制
巡检计划示例:
- 09:00 – 检查昨日备份是否成功
- 10:00 – 检查磁盘空间和连接数
- 14:00 – 检查复制状态和慢查询
- 17:00 – 生成巡检报告
风哥提示:巡检计划需要根据业务特点和系统规模进行调整。
2.2 巡检工具选择
常用的巡检工具:
- mongostat:实时监控MongoDB状态
- mongotop:监控集合级别的读写时间
- db.serverStatus():查看详细的服务器状态
- db.currentOp():查看当前操作
- Prometheus + Grafana:可视化监控
- 自定义脚本:Shell、Python脚本
工具选择建议:
- 日常巡检:使用自定义脚本自动化
- 实时监控:使用Prometheus + Grafana
- 问题排查:使用mongostat、mongotop
- 深度分析:使用db.serverStatus()
更多学习教程公众号风哥教程itpux_com
Part03-生产环境项目实施方案
3.1 系统层面检查
系统层面检查:
# 1. CPU检查
top -bn1 | grep “Cpu(s)” | awk ‘{print $2}’ | cut -d’%’ -f1
# 输出:45.2
# 2. 内存检查
free -h
# 输出:
# total used free shared buff/cache available
# Mem: 128Gi 45Gi 12Gi 2.0Gi 70Gi 78Gi
# Swap: 16Gi 0.0Ki 16Gi
# 3. 磁盘检查
df -h
# 输出:
# Filesystem Size Used Avail Use% Mounted on
# /dev/sda1 500G 120G 380G 24% /
# /dev/sdb1 2.0T 1.2T 800G 60% /mongodb
# 4. 磁盘IO检查
iostat -x 1 5
# 输出:
# Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
# sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
# sdb 12.50 150.00 500.00 2400.00 0.00 0.00 0.00 0.00 2.00 3.00 0.50 40.00 16.00 0.50 8.12
# 5. 网络检查
netstat -tuln | grep 27017
# 输出:
# tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN
# 6. 进程检查
ps -ef | grep mongod
# 输出:
# mongod 12345 1 0 Apr07 ? 00:10:23 /mongodb/app/bin/mongod –config /mongodb/app/mongod.conf
3.2 数据库层面检查
数据库层面检查:
# 1. 连接数检查
db.serverStatus().connections
# 输出:
{
“current”: 52,
“available”: 838808,
“totalCreated”: 1523,
“active”: 12
}
# 2. 内存使用检查
db.serverStatus().mem
# 输出:
{
“bits”: 64,
“resident”: 2048,
“virtual”: 4096,
“supported”: true,
“mapped”: 0,
“mappedWithJournal”: 0
}
# 3. 复制状态检查
rs.status()
# 输出:
{
“set”: “fgedu-repl”,
“date”: ISODate(“2026-04-08T10:00:00.000Z”),
“myState”: 1,
“term”: NumberLong(1),
“heartbeatIntervalMillis”: NumberLong(2000),
“members”: [
{
“_id”: 0,
“name”: “192.168.1.100:27017”,
“health”: 1,
“state”: 1,
“stateStr”: “PRIMARY”,
“uptime”: 86400,
“optime”: { “ts”: Timestamp(1617820800, 1), “t”: NumberLong(1) }
},
{
“_id”: 1,
“name”: “192.168.1.101:27017”,
“health”: 1,
“state”: 2,
“stateStr”: “SECONDARY”,
“uptime”: 86400,
“optime”: { “ts”: Timestamp(1617820800, 1), “t”: NumberLong(1) },
“syncSource”: “192.168.1.100:27017”
}
]
}
# 4. 慢查询检查
db.system.profile.find().sort({ ts: -1 }).limit(10)
# 输出:
{
“op”: “query”,
“ns”: “fgedudb.fgedu_users”,
“command”: { “find”: “fgedu_users”, “filter”: { “age”: { “$gte”: 18 } } },
“keysExamined”: 10000,
“docsExamined”: 10000,
“nreturned”: 1000,
“responseLength”: 102400,
“millis”: 150,
“ts”: ISODate(“2026-04-08T10:00:00.000Z”),
“client”: “192.168.1.200:54321”
}
# 5. 当前操作检查
db.currentOp()
# 输出:
{
“inprog”: [
{
“opid”: 12345,
“type”: “op”,
“desc”: “conn123”,
“op”: “query”,
“ns”: “fgedudb.fgedu_users”,
“command”: { “find”: “fgedu_users”, “filter”: {} },
“secs_running”: 5,
“microsecs_running”: 5000000,
“client”: “192.168.1.200:54321”,
“connectionId”: 123,
“locks”: { “Global”: “r” }
}
]
}
# 6. 数据库统计信息
db.stats()
# 输出:
{
“db”: “fgedudb”,
“collections”: 10,
“views”: 0,
“objects”: 100000,
“avgObjSize”: 1024,
“dataSize”: 102400000,
“storageSize”: 204800000,
“numExtents”: 0,
“indexes”: 20,
“indexSize”: 51200000,
“scaleFactor”: 1,
“fsUsedSize”: 1200000000000,
“fsTotalSize”: 2000000000000
}
3.3 自动化巡检脚本
自动化巡检脚本:
#!/bin/bash
# MongoDB日常巡检脚本
# Author: 风哥
# Date: 2026-04-08
MONGO_HOST=”192.168.1.100″
MONGO_PORT=”27017″
MONGO_USER=”fgedu”
MONGO_PASS=”fgedu123″
LOG_FILE=”/mongodb/logs/daily_check_$(date +%Y%m%d).log”
echo “========================================” >> $LOG_FILE
echo “MongoDB日常巡检报告 – $(date)” >> $LOG_FILE
echo “========================================” >> $LOG_FILE
# 1. 检查MongoDB进程
echo “[1] 检查MongoDB进程…” >> $LOG_FILE
MONGO_PID=$(pgrep mongod)
if [ -n “$MONGO_PID” ]; then
echo “✓ MongoDB进程运行正常,PID: $MONGO_PID” >> $LOG_FILE
else
echo “✗ MongoDB进程未运行!” >> $LOG_FILE
fi
# 2. 检查磁盘空间
echo “” >> $LOG_FILE
echo “[2] 检查磁盘空间…” >> $LOG_FILE
DISK_USAGE=$(df -h /mongodb | tail -1 | awk ‘{print $5}’ | cut -d’%’ -f1)
if [ $DISK_USAGE -lt 85 ]; then
echo “✓ 磁盘空间充足,使用率: ${DISK_USAGE}%” >> $LOG_FILE
else
echo “✗ 磁盘空间不足,使用率: ${DISK_USAGE}%” >> $LOG_FILE
fi
# 3. 检查连接数
echo “” >> $LOG_FILE
echo “[3] 检查连接数…” >> $LOG_FILE
CONNECTIONS=$(mongosh –host $MONGO_HOST –port $MONGO_PORT -u $MONGO_USER -p $MONGO_PASS –authenticationDatabase admin –eval “db.serverStatus().connections.current” –quiet)
echo “当前连接数: $CONNECTIONS” >> $LOG_FILE
# 4. 检查复制状态
echo “” >> $LOG_FILE
echo “[4] 检查复制状态…” >> $LOG_FILE
REPL_STATUS=$(mongosh –host $MONGO_HOST –port $MONGO_PORT -u $MONGO_USER -p $MONGO_PASS –authenticationDatabase admin –eval “rs.status().ok” –quiet)
if [ “$REPL_STATUS” == “1” ]; then
echo “✓ 复制集状态正常” >> $LOG_FILE
else
echo “✗ 复制集状态异常” >> $LOG_FILE
fi
# 5. 检查慢查询
echo “” >> $LOG_FILE
echo “[5] 检查慢查询…” >> $LOG_FILE
SLOW_QUERIES=$(mongosh –host $MONGO_HOST –port $MONGO_PORT -u $MONGO_USER -p $MONGO_PASS –authenticationDatabase admin –eval “db.system.profile.countDocuments({millis: {\$gt: 100}})” –quiet)
echo “慢查询数量(>100ms): $SLOW_QUERIES” >> $LOG_FILE
# 6. 检查内存使用
echo “” >> $LOG_FILE
echo “[6] 检查内存使用…” >> $LOG_FILE
MEM_USAGE=$(mongosh –host $MONGO_HOST –port $MONGO_PORT -u $MONGO_USER -p $MONGO_PASS –authenticationDatabase admin –eval “db.serverStatus().mem.resident” –quiet)
echo “常驻内存使用: ${MEM_USAGE}MB” >> $LOG_FILE
echo “” >> $LOG_FILE
echo “========================================” >> $LOG_FILE
echo “巡检完成 – $(date)” >> $LOG_FILE
echo “========================================” >> $LOG_FILE
# 发送报告
cat $LOG_FILE
Part04-生产案例与实战讲解
4.1 日常巡检实战
日常巡检实战:
# 场景:执行日常巡检
# 1. 执行巡检脚本
chmod +x /mongodb/scripts/daily_check.sh
/mongodb/scripts/daily_check.sh
# 输出:
# ========================================
# MongoDB日常巡检报告 – Mon Apr 8 10:00:00 CST 2026
# ========================================
# [1] 检查MongoDB进程…
# ✓ MongoDB进程运行正常,PID: 12345
#
# [2] 检查磁盘空间…
# ✓ 磁盘空间充足,使用率: 60%
#
# [3] 检查连接数…
# 当前连接数: 52
#
# [4] 检查复制状态…
# ✓ 复制集状态正常
#
# [5] 检查慢查询…
# 慢查询数量(>100ms): 3
#
# [6] 检查内存使用…
# 常驻内存使用: 2048MB
#
# ========================================
# 巡检完成 – Mon Apr 8 10:00:05 CST 2026
# ========================================
# 2. 查看详细状态
mongosh –host 192.168.1.100 –port 27017 -u fgedu -p fgedu123 –authenticationDatabase admin
> db.serverStatus().connections
{ “current”: 52, “available”: 838808, “totalCreated”: 1523, “active”: 12 }
> db.serverStatus().mem
{ “bits”: 64, “resident”: 2048, “virtual”: 4096, “supported”: true }
> rs.status().members.forEach(function(m) {
… print(m.name + “: ” + m.stateStr);
… })
# 输出:
# 192.168.1.100:27017: PRIMARY
# 192.168.1.101:27017: SECONDARY
# 192.168.1.102:27017: SECONDARY
# 3. 检查慢查询详情
> db.system.profile.find({ millis: { $gt: 100 } }).sort({ ts: -1 }).limit(5)
# 输出:
# { “op”: “query”, “ns”: “fgedudb.fgedu_users”, “millis”: 150, “ts”: ISODate(“2026-04-08T09:55:00Z”) }
# { “op”: “query”, “ns”: “fgedudb.fgedu_orders”, “millis”: 120, “ts”: ISODate(“2026-04-08T09:50:00Z”) }
# { “op”: “query”, “ns”: “fgedudb.fgedu_logs”, “millis”: 180, “ts”: ISODate(“2026-04-08T09:45:00Z”) }
from MongoDB视频:www.itpux.com
4.2 健康检查实战
健康检查实战:
# 场景:执行健康检查
# 1. 健康检查脚本
cat > /mongodb/scripts/health_check.py << 'EOF'
#!/usr/bin/env python3
import pymongo
import sys
import json
from datetime import datetime
def check_health():
client = pymongo.MongoClient('mongodb://fgedu:fgedu123@192.168.1.100:27017/admin')
health_report = {
'timestamp': datetime.now().isoformat(),
'checks': {}
}
# 检查1:连接状态
try:
client.admin.command('ping')
health_report['checks']['connection'] = {'status': 'OK', 'message': '连接正常'}
except Exception as e:
health_report['checks']['connection'] = {'status': 'ERROR', 'message': str(e)}
# 检查2:复制状态
try:
rs_status = client.admin.command('replSetGetStatus')
if rs_status['ok'] == 1:
primary_count = sum(1 for m in rs_status['members'] if m['stateStr'] == 'PRIMARY')
secondary_count = sum(1 for m in rs_status['members'] if m['stateStr'] == 'SECONDARY')
health_report['checks']['replication'] = {
'status': 'OK',
'message': f'主节点: {primary_count}, 从节点: {secondary_count}'
}
else:
health_report['checks']['replication'] = {'status': 'ERROR', 'message': '复制集状态异常'}
except Exception as e:
health_report['checks']['replication'] = {'status': 'ERROR', 'message': str(e)}
# 检查3:内存使用
try:
server_status = client.admin.command('serverStatus')
mem_resident = server_status['mem']['resident']
if mem_resident < 8192:
# 8GB
health_report['checks']['memory'] = {'status': 'OK', 'message': f'内存使用: {mem_resident}MB'}
else:
health_report['checks']['memory'] = {'status': 'WARNING', 'message': f'内存使用较高: {mem_resident}MB'}
except Exception as e:
health_report['checks']['memory'] = {'status': 'ERROR', 'message': str(e)}
# 检查4:连接数
try:
connections = server_status['connections']
current = connections['current']
available = connections['available']
usage_percent = (current / (current + available)) * 100
if usage_percent < 80:
health_report['checks']['connections'] = {'status': 'OK', 'message': f'连接数: {current}, 使用率: {usage_percent:.1f}%'}
else:
health_report['checks']['connections'] = {'status': 'WARNING', 'message': f'连接数: {current}, 使用率: {usage_percent:.1f}%'}
except Exception as e:
health_report['checks']['connections'] = {'status': 'ERROR', 'message': str(e)}
# 生成报告
overall_status = 'OK'
for check in health_report['checks'].values():
if check['status'] == 'ERROR':
overall_status = 'ERROR'
break
elif check['status'] == 'WARNING':
overall_status = 'WARNING'
health_report['overall_status'] = overall_status
return health_report
if __name__ == '__main__':
report = check_health()
print(json.dumps(report, indent=2, ensure_ascii=False))
sys.exit(0 if report['overall_status'] == 'OK' else 1)
EOF
# 2. 执行健康检查
python3 /mongodb/scripts/health_check.py
# 输出:
# {
# "timestamp": "2026-04-08T10:00:00.123456",
# "checks": {
# "connection": {
# "status": "OK",
# "message": "连接正常"
# },
# "replication": {
# "status": "OK",
# "message": "主节点: 1, 从节点: 2"
# },
# "memory": {
# "status": "OK",
# "message": "内存使用: 2048MB"
# },
# "connections": {
# "status": "OK",
# "message": "连接数: 52, 使用率: 0.0%"
# }
# },
# "overall_status": "OK"
# }
4.3 巡检报告生成
巡检报告生成:
# 场景:生成巡检报告
# 1. 生成HTML格式的巡检报告
cat > /mongodb/scripts/generate_report.sh << 'EOF'
#!/bin/bash
REPORT_FILE="/mongodb/reports/inspection_report_$(date +%Y%m%d).html"
mkdir -p /mongodb/reports
cat > $REPORT_FILE << 'HTML'
MongoDB巡检报告
生成时间: $(date)
系统状态
| 检查项 | 状态 | 详情 |
|---|---|---|
| MongoDB进程 | 正常 | PID: $(pgrep mongod) |
| 磁盘空间 | 正常 | 使用率: $(df -h /mongodb | tail -1 | awk ‘{print $5}’) |
| 内存使用 | 正常 | $(free -h | grep Mem | awk ‘{print “已用: ” $3 “, 可用: ” $7}’) |
数据库状态
| 检查项 | 状态 | 详情 |
|---|---|---|
| 连接数 | 正常 | 当前连接: $(mongosh –eval “db.serverStatus().connections.current” –quiet) |
| 复制状态 | 正常 | 主从同步正常 |
| 慢查询 | 警告 | 今日慢查询: $(mongosh –eval “db.system.profile.countDocuments({ts: {\$gte: new Date(Date.now() – 86400000)}})” –quiet) 条 |
巡检结论
本次巡检发现系统整体运行正常,建议关注慢查询情况。
HTML
echo “巡检报告已生成: $REPORT_FILE”
EOF
# 2. 执行报告生成
chmod +x /mongodb/scripts/generate_report.sh
/mongodb/scripts/generate_report.sh
# 输出:
# 巡检报告已生成: /mongodb/reports/inspection_report_20260408.html
风哥提示:巡检报告应该包含系统状态、数据库状态、问题汇总和建议措施等内容。
Part05-风哥经验总结与分享
5.1 巡检最佳实践
风哥建议的巡检最佳实践:
- 定期巡检:制定巡检计划,每日、每周、每月执行不同级别的巡检
- 自动化:使用脚本自动化巡检,减少人工操作
- 全面覆盖:巡检内容覆盖系统、数据库、应用、安全等各个层面
- 及时响应:发现问题及时处理,避免小问题演变成大故障
- 记录归档:保存巡检记录,便于问题追溯和趋势分析
- 持续改进:根据巡检结果优化系统和数据库配置
- 告警机制:设置告警阈值,及时通知相关人员
- 备份验证:定期验证备份的可用性
学习交流加群风哥QQ113257174
5.2 常见问题与解决方案
常见问题与解决方案:
- 问题:巡检脚本执行失败
- 解决方案:检查脚本权限,检查MongoDB连接配置,检查日志输出路径
- 问题:巡检数据不准确
- 解决方案:检查监控命令是否正确,检查采样时间是否足够
- 问题:巡检报告生成失败
- 解决方案:检查报告目录权限,检查磁盘空间
- 问题:告警阈值设置不合理
- 解决方案:根据实际业务情况调整阈值,避免误报
- 问题:巡检结果未及时通知
- 解决方案:配置邮件或短信通知,设置告警升级机制
更多视频教程www.fgedu.net.cn
注意事项
- 制定巡检计划,每日、每周、每月执行不同级别的巡检
- 使用脚本自动化巡检,减少人工操作
- 巡检内容覆盖系统、数据库、应用、安全等各个层面
- 发现问题及时处理,避免小问题演变成大故障
- 保存巡检记录,便于问题追溯和趋势分析
- 根据巡检结果优化系统和数据库配置
- 设置告警阈值,及时通知相关人员
- 定期验证备份的可用性
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
