外观
MongoDB mongostat 工具使用
命令语法
基本语法
bash
mongostat [options] [--host <hostname:port>] [--username <username>] [--password <password>] [--authenticationDatabase <dbname>]常用选项
| 选项 | 描述 |
|---|---|
--host <hostname:port> | 指定 MongoDB 实例地址和端口 |
--username <username> | 用户名,用于认证 |
--password <password> | 密码,用于认证 |
--authenticationDatabase <dbname> | 认证数据库,默认为 admin |
--ssl | 启用 SSL 连接 |
--tls | 启用 TLS 连接 |
--discover | 自动发现分片集群中的所有节点 |
--rowcount <n> | 输出指定行数后退出 |
--json | 以 JSON 格式输出 |
--fields <fields> | 指定要显示的字段,用逗号分隔 |
--noheaders | 不显示表头 |
--http | 使用 HTTP 协议连接 |
<interval> | 采样间隔,单位为秒,默认为 1 秒 |
输出解读
输出示例
insert query update delete getmore command dirty used flushes vsize res qrw arw net_in net_out conn time
*0 *0 *0 *0 0 1|0 0.0% 0.0% 0 160M 1.1M 0|0 0|0 112b 10.7k 2 Apr 13 14:30:01.454
*0 *0 *0 *0 0 1|0 0.0% 0.0% 0 160M 1.1M 0|0 0|0 112b 10.7k 2 Apr 13 14:30:02.454
*0 *0 *0 *0 0 1|0 0.0% 0.0% 0 160M 1.1M 0|0 0|0 112b 10.7k 2 Apr 13 14:30:03.454输出字段解读
操作计数字段
| 字段 | 描述 |
|---|---|
insert | 每秒插入操作数 |
query | 每秒查询操作数 |
update | 每秒更新操作数 |
delete | 每秒删除操作数 |
getmore | 每秒 getMore 操作数(用于游标) |
command | 每秒命令操作数,格式为 `本地命令数 |
特殊符号:
*:表示该值被截断,实际值大于显示值-:表示该值为 0 或不可用
存储引擎字段
| 字段 | 描述 |
|---|---|
dirty | WiredTiger 缓存中脏数据的百分比 |
used | WiredTiger 缓存的使用率百分比 |
flushes | 每秒写入磁盘的检查点数量 |
内存使用字段
| 字段 | 描述 |
|---|---|
vsize | MongoDB 进程使用的虚拟内存大小 |
res | MongoDB 进程使用的物理内存大小 |
锁定和队列字段
| 字段 | 描述 |
|---|---|
qr | 等待读锁的队列长度 |
qw | 等待写锁的队列长度 |
ar | 活跃读客户端数量 |
aw | 活跃写客户端数量 |
网络字段
| 字段 | 描述 |
|---|---|
net_in | 每秒网络输入字节数 |
net_out | 每秒网络输出字节数 |
连接和时间字段
| 字段 | 描述 |
|---|---|
conn | 当前连接数 |
time | 采样时间戳 |
常用命令示例
监控本地实例
命令:
bash
mongostat输出:
- 每秒显示一次本地 MongoDB 实例(默认端口 27017)的性能指标
监控指定实例
命令:
bash
mongostat --host 192.168.1.100:27017输出:
- 监控指定 IP 和端口的 MongoDB 实例
使用认证
命令:
bash
mongostat --host 192.168.1.100:27017 --username admin --password password --authenticationDatabase admin输出:
- 使用用户名和密码认证,监控指定实例
调整采样间隔
命令:
bash
mongostat --host 192.168.1.100:27017 5输出:
- 每 5 秒采样一次,显示监控结果
监控分片集群
命令:
bash
mongostat --host mongos-host:27017 --discover输出:
- 自动发现并监控分片集群中的所有节点
自定义输出字段
命令:
bash
mongostat --fields insert,query,update,delete,conn,time 2输出:
- 仅显示指定字段,每 2 秒采样一次
JSON 格式输出
命令:
bash
mongostat --json --host 192.168.1.100:27017 1输出:
- 以 JSON 格式输出监控结果,便于自动化处理
限制输出行数
命令:
bash
mongostat --rowcount 10 --host 192.168.1.100:27017输出:
- 输出 10 行后退出
输出解读与分析
正常状态指标
操作计数:
- 稳定的操作计数,没有突然的峰值或下降
- 读操作数与写操作数比例符合业务预期
内存使用:
res大小稳定,没有持续增长vsize与res比例合理(通常 2-3 倍)
锁定和队列:
qr和qw接近 0ar和aw与系统资源匹配
存储引擎:
dirty百分比 < 20%used百分比 < 90%flushes频率稳定
连接数:
- 连接数稳定,远低于最大连接数
异常状态分析
高锁等待
现象:qr 或 qw 持续增长
可能原因:
- 慢查询导致锁持有时间过长
- 索引设计不合理
- 写操作过于频繁
- 系统资源不足
解决方案:
- 分析慢查询日志,优化查询
- 优化索引设计
- 考虑读写分离或分片
- 增加系统资源
高内存使用率
现象:res 接近或超过系统内存
可能原因:
- 数据量过大,超过内存容量
- 索引过多
- 内存泄漏
解决方案:
- 增加系统内存
- 优化索引,删除不使用的索引
- 考虑使用分片集群
- 升级 MongoDB 版本,修复内存泄漏
高连接数
现象:conn 接近或达到最大连接数
可能原因:
- 应用连接池配置不合理
- 连接泄漏
- 业务流量突增
解决方案:
- 优化应用连接池配置
- 检查应用代码,修复连接泄漏
- 考虑增加 MongoDB 实例或分片
- 临时增加最大连接数
高网络流量
现象:net_in 或 net_out 持续过高
可能原因:
- 业务流量突增
- 大文档传输
- 不合理的查询(如返回过多数据)
解决方案:
- 优化查询,限制返回字段
- 使用分页查询
- 考虑使用缓存
- 增加网络带宽
最佳实践
1. 监控策略
实时监控:
- 生产环境建议 24/7 实时监控
- 关键业务高峰期增加监控频率
- 结合其他监控工具(如 Prometheus、Grafana)
历史数据存储:
- 将监控数据存储到时间序列数据库
- 保留足够长的历史数据,用于趋势分析
- 定期生成性能报告
2. 告警配置
告警指标:
- 连接数 > 70% 最大连接数
- 锁等待队列长度 > 10
- 内存使用率 > 90%
- 复制延迟 > 30s
- 操作数异常波动(如突然增长或下降)
告警方式:
- 邮件告警
- 短信告警
- 即时通讯工具告警(如 Slack、微信)
- 电话告警(严重情况)
3. 性能基线建立
基线定义:
- 在系统正常运行时收集监控数据
- 建立各项指标的正常范围
- 定期更新基线,适应业务变化
基线使用:
- 对比当前指标与基线,识别异常
- 用于容量规划和性能优化
4. 自动化监控
脚本示例:
bash
#!/bin/bash
# 监控 MongoDB 实例
mongostat --json --host 192.168.1.100:27017 1 | while read line; do
# 解析 JSON 数据
conn=$(echo $line | jq -r '.conn')
qr=$(echo $line | jq -r '.qr')
qw=$(echo $line | jq -r '.qw')
time=$(echo $line | jq -r '.time')
# 检查连接数
if [ "$conn" -gt 5000 ]; then
echo "[$time] WARNING: Connection count is high: $conn" >> /var/log/mongodb/alerts.log
fi
# 检查锁等待
if [ "$qr" -gt 10 ] || [ "$qw" -gt 10 ]; then
echo "[$time] WARNING: Lock queue is high - qr: $qr, qw: $qw" >> /var/log/mongodb/alerts.log
fi
done自动化集成:
- 与监控系统集成(如 Prometheus + Alertmanager)
- 与自动化运维平台集成
- 实现自动扩缩容
5. 注意事项
性能影响:
- mongostat 本身对数据库性能影响很小,但高频采样可能会增加开销
- 生产环境建议采样间隔不小于 1 秒
权限要求:
- 监控分片集群需要 clusterMonitor 角色
- 监控单个实例需要 read 角色
版本兼容性:
- 不同 MongoDB 版本的 mongostat 输出可能略有差异
- 建议使用与数据库版本匹配的 mongostat 版本
输出解读:
- 单一指标异常可能不代表问题,需要综合分析
- 结合业务场景解读监控数据
与其他监控工具比较
mongostat vs mongotop
| 特性 | mongostat | mongotop |
|---|---|---|
| 监控粒度 | 实例级 | 集合级 |
| 主要指标 | 操作计数、连接数、内存使用等 | 集合读写耗时 |
| 适用场景 | 整体性能监控 | 集合级性能分析 |
| 输出频率 | 秒级 | 秒级 |
mongostat vs db.serverStatus()
| 特性 | mongostat | db.serverStatus() |
|---|---|---|
| 输出方式 | 命令行实时输出 | MongoDB Shell 命令,单次输出 |
| 监控频率 | 可自定义,默认 1 秒 | 手动执行,无实时监控 |
| 输出格式 | 表格或 JSON | JSON |
| 适用场景 | 实时监控、自动化脚本 | 详细状态查询、一次性分析 |
mongostat vs MongoDB Atlas/Ops Manager
| 特性 | mongostat | MongoDB Atlas/Ops Manager |
|---|---|---|
| 部署方式 | 命令行工具 | 云服务或本地部署 |
| 监控范围 | 单个实例或集群 | 完整的集群监控 |
| 功能丰富度 | 基础监控 | 全面的监控、告警、备份等 |
| 成本 | 免费 | 付费或企业版 |
| 易用性 | 需要手动操作 | 可视化界面,易于使用 |
常见问题(FAQ)
Q1: mongostat 输出中的 * 符号是什么意思?
A1: * 符号表示该值被截断,实际值大于显示值。例如,*1000 表示实际插入操作数超过 1000 次/秒。
Q2: 如何使用 mongostat 监控分片集群?
A2: 使用 --discover 选项,mongostat 会自动发现分片集群中的所有节点并监控。命令示例:
bash
mongostat --host mongos-host:27017 --discoverQ3: mongostat 可以监控副本集吗?
A3: 是的,mongostat 可以监控副本集。它会显示所有副本集成员的状态,包括主节点和副本节点。
Q4: 如何将 mongostat 输出保存到文件?
A4: 使用重定向符号 > 将输出保存到文件:
bash
mongostat --json 1 > mongostat_output.jsonQ5: mongostat 对数据库性能有影响吗?
A5: mongostat 本身对数据库性能影响很小,因为它只读取状态信息,不执行写操作。但高频采样(如 < 1 秒)可能会增加少量开销,建议生产环境使用 1-5 秒的采样间隔。
Q6: 如何解读 mongostat 输出中的 command 字段?
A6: command 字段显示每秒执行的命令数,格式为 本地命令数|复制命令数。本地命令是指直接发送到该实例的命令,复制命令是指从主节点复制到副本节点的命令。
Q7: mongostat 支持 TLS/SSL 连接吗?
A7: 是的,mongostat 支持 TLS/SSL 连接。使用 --ssl 或 --tls 选项启用 TLS/SSL 连接,例如:
bash
mongostat --host 192.168.1.100:27017 --tls --tlsCAFile /path/to/ca.pemQ8: 如何只显示特定的监控字段?
A8: 使用 --fields 选项指定要显示的字段,用逗号分隔。例如:
bash
mongostat --fields insert,query,update,delete,conn,time