Mongodb 性能监控工具FreeMonitoring,mongostat,mongotop,Profiler,索引,分片,事务超时,MongoDB调优
db.users.createIndex({username : 'hashed'})
1 # 创建唯一索引
db.values.createIndex({title:1},{unique:true})
2 # 复合索引支持唯一性约束
db.values.createIndex({title:1,type:1},{unique:true})
3 #多键索引支持唯一性约束
db.inventory.createIndex( { ratings: 1 },{unique:true} )
使用分片集群
1.为了使集合支持分片,需要先开启database的分片功能
sh.enableSharding("shop")
2.执行shardCollection命令,对集合执行分片初始化,分片键必须有索引支持。除非集合为空,否则索引必须在
sh.shardCollection(namespace, key, unique, options)
sh.shardCollection("records.people", { zipcode: 1 } ) //1 范围分配
sh.shardCollection("shop.product",{productId:"hashed"},false,{numInitialChunks:4})
sh.shardCollection("shop.product",{productId:"hashed"},false)
3.shop.product集合将productId作为分片键,并采用了哈希分片策略,除此以外,
“numInitialChunks:4”表示将初始化4个chunk。 numInitialChunks必须和哈希分片策略配合使
用。而且,这个选项只能用于空的集合,如果已经存在数据则会返回错误。
4.查询数据的分布
db.product.getShardDistribution()
5.分片键(ShardKey)的约束
ShardKey 必须是一个索引。非空集合须在 ShardCollection 前创建索引;空集合 ShardCollection自动创建索引
- 4.4 版本之前:
ShardKey 大小不能超过 512 Bytes;
仅支持单字段的哈希分片键;
Document 中必须包含 ShardKey;
ShardKey 包含的 Field 不可以修改。 分片键必须有索引支持。除非集合为空,否则索引必须在
4.4 版本之后:
ShardKey 大小无限制;
支持复合哈希分片键;
Document 中可以不包含 ShardKey,插入时被当 做 Null 处理;
为 ShardKey 添加后缀 refineCollectionShardKey 命令,可以修改 ShardKey 包含的 Field;
而在 4.2 版本之前,ShardKey 对应的值不可以修改;4.2 版本之后,如果 ShardKey 为非_id 字段,
那么可以修改 ShardKey 对应的值。
7.checkpoint 60秒写一次数据到磁盘,或100M,减少i/o压力
8.事务超时
默认情况下MongoDB会为每个事务设置1分钟的超时时间,如果在该时间内没有提交,就会强制将其终止。
9.MongoDB调优
三大导致MongoDB性能不佳的原因
1) 慢查询
2) 阻塞等待
3)硬件资源不足
1,2通常是因为模型/索引设计不佳导致的,排查思路:按1-2-3依次排查
链接池链接数设置maxpoolsize:默认100
timeout设置:
https://www.processon.com/view/link/6239daa307912906f511b348
- mongodb性能检测工具:FreeMonitoring
1 # 启用监控
db.enableFreeMonitoring()
db.getFreeMonitoringStatus()
2 # 禁止监控
db.disableFreeMonitoring()
https://cloud.mongodb.com/freemonitoring/cluster
- mongodb性能检测工具:mongostat是MongoDB自带的监控工具,其可以提供数据库节点或者整个集群当前的状态视图,需要clusterMonitor角色权限
mongostat -h 192.168.65.174 --port 28017 -user -pwd --authenticationDatabase=admin --discover --interactive -n 2
mongostat:关注的主要指标:
插入、删除、修改、查询的速率是否产生较大波动,是否超出预期。
qrw、arw:队列是否较高,若长时间大于0则说明此时读写速度较慢。
conn:连接数是否太多。
dirty:百分比是否较高,若持续高于10%则说明磁盘I/O存在瓶颈。
netIn、netOut:是否超过网络带宽阈值。
repl:状态是否异常,如PRI、SEC、RTR为正常,若出现REC等异常值则需要修复。
- mongodb性能检测工具:mongotop命令可用于查看数据库的热点表,通过观察mongotop的输出,可以判定是哪些集合占用
了大部分读写时间,需要clusterMonitor角色权限
mongotop -h 192.168.65.174 --port=28017 -user -pwd --authenticationDatabase=admin
指标名 说明
ns 集合名称空间
total 花费在该集合上的时长
read 花费在该集合上的读操作时长
write 花费在该集合上的写操作时长
检测:
操作执行次数
内存使用情况
CPU使用率
操作数
- mongodb性能检测工具:Profiler模块可以用来记录、分析MongoDB的详细操作日志。默认情况下该功能是关闭的,对某个业
务库开启Profiler模块之后,符合条件的慢操作日志会被写入该库的system.profile集合中.
级别 说明
0 日志关闭,无任何输出
1 部分开启,仅符合条件(时长大于slowms)的操作日志会被记录
2 日志全开,所有的操作日志都被记录
将level设置为2,此时所有的操作会被记录下来。
db.setProfilingLevel(2)
db.setProfilingLevel(1,500) //只记录大于500毫米的慢日志
检查是否生效
db.getProfilingStatus()
开启Profiler模块之后,可以通过system.profile集合查看最近发生的操作日志
db.system.profile.find().limit(5).sort({ts:-1}).pretty()
db.system.profile.find({op:"update",ns:"shop.user"}) 查看某个集合中的update操作日志
https://www.mongodb.com/zh-cn/docs/v5.0/reference/method/sh.shardCollection/