如何统计MongoDB副本集单日CRUD操作总数?日志提取不可行
嘿,这个问题我在日常运维中碰到过好多次——因为慢查询日志只捕获超过slowms阈值的操作,确实没法用来统计全量CRUD总数。给你几个实用的解决办法,按需选用:
1. 用
mongostat快速临时统计 mongostat是MongoDB自带的命令行监控工具,能实时输出实例的核心操作指标,包括insert、query、update、delete这些CRUD项。你可以把它的输出持久化到文件,之后统计单日总和:
- 启动采集的命令(以每10分钟输出一行,持续一天为例):
解释:mongostat --host <你的副本集主节点地址> --username <用户名> --password <密码> --authenticationDatabase admin --rowcount 144 600 > crud_daily.log--rowcount 144对应一天24小时×6个10分钟,600是每10分钟(600秒)采样一次。 - 统计总和的awk命令:
awk '{sum_ins+=$2; sum_qry+=$3; sum_upd+=$4; sum_del+=$5} END { print "单日Insert总数: " sum_ins print "单日Query总数: " sum_qry print "单日Update总数: " sum_upd print "单日Delete总数: " sum_del }' crud_daily.log
2. 用
db.serverStatus()做定时采集 db.serverStatus()返回的opcounters字段,记录了实例启动以来的累计CRUD操作数。你可以写个简单脚本,定期采集这个数值,通过计算单日首尾的差值得到总数:
- 示例Shell脚本(每小时采集一次):
#!/bin/bash MONGO_HOST="你的主节点地址" MONGO_USER="用户名" MONGO_PASS="密码" LOG_FILE="./daily_crud_tracking.log" while true; do # 获取当前时间戳 ts=$(date +"%Y-%m-%d %H:%M:%S") # 采集opcounters的四个核心指标 counters=$(mongo --host $MONGO_HOST --username $MONGO_USER --password $MONGO_PASS --authenticationDatabase admin --eval ' var stats = db.serverStatus().opcounters; print(stats.insert, stats.query, stats.update, stats.delete); ') # 写入日志 echo "$ts $counters" >> $LOG_FILE # 每小时执行一次 sleep 3600 done - 统计时,提取当天最早和最晚的两组数值,分别相减就能得到单日各操作的总数。
3. 临时启用数据库Profiler(需注意性能)
如果需要不仅是总数,还要更详细的操作明细,可以临时开启数据库Profiler。但要注意,Profiler会带来一定性能开销,建议只在需要时启用,用完及时关闭:
- 开启全量记录(级别2):
db.setProfilingLevel(2) - 统计单日CRUD总数:
db.system.profile.aggregate([ { $match: { ts: { $gte: ISODate("2024-05-20T00:00:00Z"), $lt: ISODate("2024-05-21T00:00:00Z") } }}, { $group: { _id: "$op", total: { $sum: 1 } } } ]) - 用完记得关闭Profiler:
db.setProfilingLevel(0)
4. 部署长期监控工具(适合持续统计)
如果需要长期追踪CRUD指标,推荐用专业监控方案:
- Prometheus + MongoDB Exporter:MongoDB Exporter会自动采集
opcounters等核心指标,Prometheus存储时序数据后,用Grafana就能轻松生成单日CRUD统计的可视化面板。 - MongoDB Atlas:如果用的是Atlas云服务,自带的监控控制台里直接有操作数的趋势图,一键就能查看单日CRUD总数,无需额外配置。
注意:副本集的CRUD操作都在主节点执行,所以只需要统计主节点的指标即可,副本节点的同步操作不需要纳入统计。
内容的提问来源于stack exchange,提问作者Telen
相关产品推荐
相关产品推荐

