1. MongoDB的监控
- 为什么要监控?
监控及时获得应用的运行状态信息,在问题出现时及时发现。 - 监控什么?
CPU、内存、磁盘I/O、应用程序(MongoDB)、进程监控(ps -aux)、错误日志监控
2. MongoDB集群监控方式
1> 查看实例运行状态命令(内存使用、锁、用户连接等信息)
db.serverStatus()
通过比对前后快照进行性能分析
"connections" # 当前连接到本机处于活动状态的连接数
"activeClients" # 连接到当前实例处于活动状态的客户端数量
"locks" # 锁相关参数
"opcounters" # 启动之后的参数
"opcountersRepl" # 复制想关
"storageEngine" # 查看数据库的存储引擎
"mem" # 内存相关
2> 查看状态命令:
db.stats()
显示信息说明:
"db" : "test" ,表示当前是针对"test"这个数据库的描述。想要查看其他数据库,可以先运行$ use databasename(e.g $use admiin).
"collections" : 3,表示当前数据库有多少个collections.可以通过运行show collections查看当前数据库具体有哪些collection.
"objects" : 13,表示当前数据库所有collection总共有多少行数据。显示的数据是一个估计值,并不是非常精确。
"avgObjSize" : 36,表示每行数据是大小,也是估计值,单位是bytes
"dataSize" : 468,表示当前数据库所有数据的总大小,不是指占有磁盘大小。单位是bytes
"storageSize" : 13312,表示当前数据库占有磁盘大小,单位是bytes,因为mongodb有预分配空间机制,为了防止当有大量数据插入时对磁盘的压力,因此会事先多分配磁盘空间。
"numExtents" : 3,似乎没有什么真实意义。我弄明白之后再详细补充说明。
"indexes" : 1 ,表示system.indexes表数据行数。
"indexSize" : 8192,表示索引占有磁盘大小。单位是bytes
"fileSize" : 201326592,表示当前数据库预分配的文件大小,例如test.0,test.1,不包括test.ns。
3> mongostat实时数据库状态
读写、加锁、索引命中、缺页中断、读写等待队列等情况。每秒刷新一次状态值,并能提供良好的可读性,通过这些参数可以观察到MongoDB系统整体性能情况。
参数 | 参数说明 |
insert | 每秒插入量 |
query | 每秒查询量 |
update | 每秒更新 |
delete | 每秒删除 |
conn | 当前连接数 |
qr/qw | 客户端查询排队长度(读/写)最好为0,若有堆积数据库处理慢 |
ar/aw | 活跃客户端数量(读/写) |
time | 当前时间 |
4> mongotop命令说明:
ns:数据库命名空间,后者结合了数据库名称和集合。
total:mongod在这个命令空间上花费的总时间。
read:在这个命令空间上mongod执行读操作花费的时间。
write:在这个命名空间上mongod进行写操作花费的时间。
5> db级别命令
- 查看数据库当前执行什么操作。
db.currentOp()
用于查看长时间运行进程。
通过(执行时长、操作、锁、等待锁时长)等条件过滤。
如果发现一个操作太长,把数据库卡死的话,可以用这个命令杀死他:> db.killOp(608605)
- 设置server级别慢日志
优化数据库的方式,Mysql也通过设置慢日志方式优化
db.setProfilingLevel()
打开profiling:
0:不保存
1:保存慢查询日志
2:保存所有查询日志
注意:
级别是对应当前的数据库,而阈值是全局的。
查看profiling状态
查看慢查询:system.profile
关闭profiling
3. MongoDB集群性能优化方案
1> 优化方向
- 硬件(内存、SSD)
- 收缩数据
- 增加新的机器、新的副本集
- 集群分片键选择
- chunk大小设置
- 预分片(预先分配存储空间)
2> 存储引擎方面
WiredTiger是3.0以后的默认存储引擎,细粒度的并发控制和数据压缩提供了更高的性能和存储效率。3.0以前默认的MMAPv1也提高了性能。
在MongoDB复制集中可以组合多钟存储引擎,各个实例实现不同的应用需求。
3> 其他优化建议
- 收缩数据
- 预分片
- 增加新的机器、新的副本集
- 集群分片键选择
- chunk大小设置