mongoDB--操作的管理和监控

mongoDB–操作的管理

一:db.currentOp()查看正在进行的操作

查看正在执行的操作
db.currentOp()
 
查看系统执行的操作
db.currentOp(True)
 
kill正在执行的操作
db.killOp(<operation id>)
db.killOp(9842)

二:使用系统分析器(慢查询日志)

可以利用系统分析器来查找耗时过长的操作。系统分析器可以记录特殊集合system.profile中的操作,并且提供大量有关耗时过长的操作信息,但是相应的mongod整体的性能会下降。注意:不能在mongos中开始,会报错

db.setProfilingLevel(2)
//开启分析器,level有三种级别
1:Profiling级别说明
0:关闭,不收集任何数据。
1:收集慢查询数据,默认是100毫秒。
2:收集所有数据
2:开启Profiling和设置
1:通过mongo shell:
#查看状态:级别和时间
drug:PRIMARY> db.getProfilingStatus()   
{ "was" : 1, "slowms" : 100 }
#查看级别
drug:PRIMARY> db.getProfilingLevel()    
1
#设置级别
drug:PRIMARY> db.setProfilingLevel(2)
{ "was" : 1, "slowms" : 100, "ok" : 1 }
#设置级别和时间
drug:PRIMARY> db.setProfilingLevel(1,200)
{ "was" : 2, "slowms" : 100, "ok" : 1 }

以上要操作要是在test集合下面的话,只对该集合里的操作有效,要是需要对整个实例有效,则需要在所有的集合下设置或则在开启的时候开启参数:
2:不通过mongo shell:
mongod --profile=1 --slowms=15
或则在配置文件里添加2行:
profile = 1
slowms = 300
3:关闭Profiling
# 关闭
drug:PRIMARY> db.setProfilingLevel(0)
{ "was" : 1, "slowms" : 200, "ok" : 1 }
4:修改“慢查询日志”的大小
#关闭Profiling
drug:PRIMARY> db.setProfilingLevel(0)
{ "was" : 0, "slowms" : 200, "ok" : 1 }
#删除system.profile集合
drug:PRIMARY> db.system.profile.drop()
true
#创建一个新的system.profile集合
drug:PRIMARY> db.createCollection( "system.profile", { capped: true, size:4000000 } )
{ "ok" : 1 }
#重新开启Profiling
drug:PRIMARY> db.setProfilingLevel(1)
{ "was" : 0, "slowms" : 200, "ok" : 1 }

注意:要改变Secondary的system.profile的大小,你必须停止Secondary,运行它作为一个独立的,然后再执行上述步骤。完成后,重新启动加入副本集。

5:慢查询(system.profile)说明

通过下面的例子说明,更多信息见:http://docs.mongodb.org/manual/reference/database-profiler/

1:参数含义

drug:PRIMARY> db.system.profile.find().pretty()
{
    "op" : "query",    #操作类型,有insert、query、update、remove、getmore、command   
    "ns" : "mc.user",  #操作的集合
    "query" : {        #查询语句
        "mp_id" : 5,
        "is_fans" : 1,
        "latestTime" : {
            "$ne" : 0
        },
        "latestMsgId" : {
            "$gt" : 0
        },
        "$where" : "new Date(this.latestNormalTime)>new Date(this.replyTime)"
    },
    "cursorid" : NumberLong("1475423943124458998"),
    "ntoreturn" : 0,   #返回的记录数。例如,profile命令将返回一个文档(一个结果文件),因此ntoreturn值将为1。limit(5)命令将返回五个文件,因此ntoreturn值是5。如果ntoreturn值为0,则该命令没有指定一些文件返回,因为会是这样一个简单的find()命令没有指定的限制。
    "ntoskip" : 0,     #skip()方法指定的跳跃数
    "nscanned" : 304,  #扫描数量
    "keyUpdates" : 0,  #索引更新的数量,改变一个索引键带有一个小的性能开销,因为数据库必须删除旧的key,并插入一个新的key到B-树索引
    "numYield" : 0,    #该查询为其他查询让出锁的次数
    "lockStats" : {    #锁信息,R:全局读锁;W:全局写锁;r:特定数据库的读锁;w:特定数据库的写锁
        "timeLockedMicros" : {     #锁
            "r" : NumberLong(19467),
            "w" : NumberLong(0)
        },
        "timeAcquiringMicros" : {  #锁等待
            "r" : NumberLong(7),
            "w" : NumberLong(9)
        }
    },
    "nreturned" : 101,        #返回的数量
    "responseLength" : 74659, #响应字节长度
    "millis" : 19,            #消耗的时间(毫秒)
    "ts" : ISODate("2014-02-25T02:13:54.899Z"), #语句执行的时间
    "client" : "127.0.0.1",   #链接ip或则主机
    "allUsers" : [ ],     
    "user" : ""               #用户
}

除上面外还有:

scanAndOrder:
scanAndOrder是一个布尔值,是True当一个查询不能使用的文件的顺序在索引中的排序返回结果:MongoDB中必须将其接收到的文件从一个游标后的文件进行排序。
如果scanAndOrder是False,MongoDB的可使用这些文件的顺序索引返回排序的结果。即:True:文档进行排序,False:使用索引。

moved
更新操作在磁盘上移动一个或多个文件到新的位置。表明本次update是否移动了硬盘上的数据,如果新记录比原记录短,通常不会移动当前记录,如果新记录比原记录长,那么可能会移动记录到其它位置,这时候会导致相关索引的更新.磁盘操作更多,加上索引
更新,会使得这样的操作比较慢.
nmoved:
文件在磁盘上操作。

nupdated:
更新文档的数目

getmore是一个getmore 操作,getmore通常发生在结果集比较大的查询时,第一个query返回了部分结果,后续的结果是通过getmore来获取的。

如果nscanned(扫描的记录数)远大于nreturned(返回结果的记录数)的话,要考虑通过加索引来优化记录定位了。responseLength 如果过大,说明返回的结果集太大了,这时要看是否只需要必要的字段。

6:日常使用的查询
#返回最近的10条记录
db.system.profile.find().limit(10).sort({ ts : -1 }).pretty()

#返回所有的操作,除command类型的
db.system.profile.find( { op: { $ne : 'command' } } ).pretty()

#返回特定集合
db.system.profile.find( { ns : 'mydb.test' } ).pretty()

#返回大于5毫秒慢的操作
db.system.profile.find( { millis : { $gt : 5 } } ).pretty()

#从一个特定的时间范围内返回信息
db.system.profile.find(
                       {
                        ts : {
                              $gt : new ISODate("2012-12-09T03:00:00Z") ,
                              $lt : new ISODate("2012-12-09T03:40:00Z")
                             }
                       }
                      ).pretty()

#特定时间,限制用户,按照消耗时间排序
db.system.profile.find(
                       {
                         ts : {
                               $gt : new ISODate("2011-07-12T03:00:00Z") ,
                               $lt : new ISODate("2011-07-12T03:40:00Z")
                              }
                       },
                       { user : 0 }
                      ).sort( { millis : -1 } )

总结:

​ Profiling 功能肯定是会影响效率的,但是不太严重,原因是他使用的是system.profile 来记录,而system.profile 是一个capped collection 这种collection 在操作上有一些限制和特点,但是效率更高,所以在使用的时候可以打开该功能,不需要一直打开。

三:计算空间消耗

1. 文档
cqsm>Object.bsonsize(db.mongo.findOne())
36
2. 集合

执行db.stats()函数,返回的size值相当于集合中所有的文档执行Object.bsonsize()再将得到的结果相加

cqsm>db.mongo.stats(1024)  //kb:1024,MB:1024*1024....
{
        "ns" : "cqsm.mongo",
        "size" : 3784,  //实际占用的大小
        "count" : 102,
        "avgObjSize" : 37,
        "storageSize" : 36864,  //还包含集合两端预留的未经使用的空间
        "capped" : false,
        "nindexes":1,  //表示集合中索引的数量,
  .......

目前集合的比较小,只有一个“桶”大小(8kb),通常来说索引比存储的数据量大很多,含有很多空闲空间。右平衡索引可以将空闲空间降低最小,而随机分布的索引通常会有50%左右的空闲空间,升序索引则有10%的空闲空间。

3. 数据库
}
cqsm>db.stats(1024)
{
        "db" : "cqsm",
        "collections" : 2,
        "views" : 0,
        "objects" : 108,
        "avgObjSize" : 80.29629629629629, 
        "dataSize" : 8.46875,  //数据占用的空间大小
        "storageSize" : 72, //数据库正在使用的总空间大小
        "numExtents" : 0,
        "indexes" : 1,
        "indexSize" : 36,
        "fsUsedSize" : 7113196,
        "fsTotalSize" : 37818020,
        "ok" : 1,
        "operationTime" : Timestamp(1576208354, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1576208354, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

四:mongotop和mongostat

mongotop可以概述那个集合最为繁忙,提供每个集合的统计数据,默认情况下,mongotop每一秒刷新一次;mongostat提供有关服务器的消息。

1)mongotop

mongotop可以概述那个集合最为繁忙

[hadoop@hadoop03 ~]$ mongotop 1
2019-12-13T16:38:28.909+0800    connected to: 127.0.0.1

                    ns    total    read    write    2019-12-13T16:38:30+08:00
        local.oplog.rs      5ms     5ms      0ms                             
  admin.$cmd.aggregate      0ms     0ms      0ms                             
     admin.system.keys      0ms     0ms      0ms                             
    admin.system.roles      0ms     0ms      0ms                             
  admin.system.version      0ms     0ms      0ms                             
config.system.sessions      0ms     0ms      0ms                             
   config.transactions      0ms     0ms      0ms                             
            cqsm.mongo      0ms     0ms      0ms                             
   cqsm.system.profile      0ms     0ms      0ms                             
            cqsm.users      0ms     0ms      0ms                   

输出字段说明:
ns:数据库命名空间,后者结合了数据库名称和集合。
db:数据库的名称。名为 . 的数据库针对全局锁定,而非特定数据库。
total:mongod在这个命令空间上花费的总时间。
read:在这个命令空间上mongod执行读操作花费的时间。
write:在这个命名空间上mongod进行写操作花费的时间。

2)mongostat

mongostat是mongodb自带的状态检测工具,在命令行下使用。它会间隔固定时间获取mongodb的当前运行状态,并输出。如果你发现数据库突然变慢或者有其他问题的话,你第一手的操作就考虑采用mongostat来查看mongo的状态

在这里插入图片描述

字段说明:

insert: 每秒插入量

query: 每秒查询量

update: 每秒更新量

delete: 每秒删除量

locked: 锁定量

qr | qw: 客户端查询排队长度(读|写)

ar | aw: 活跃客户端量(读|写)

conn: 连接数 time: 当前时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值