MongoDB的监控

1、使用管理接口 

1、Web控制台

   MongoDB在老版本中默认情况下会启动基本的http服务,但是 新版本中已经关闭该选项,要是想用此功能,重启mongod,并加入--httpinterface选项。   

[root@gflinux102 bin]# mongod -f /opt/mongo/data/mongod.conf --httpinterface

2015-02-10T15:55:10.423+0800 

2015-02-10T15:55:10.424+0800 warning: 32-bit servers don‘t have journaling enabled by default. Please use --journal if you want durability.

2015-02-10T15:55:10.425+0800 

about to fork child process, waiting until server is ready for connections.

forked process: 4062

child process started successfully, parent exiting

    该服务器监听的端口号比主服务器的端口号大1000。可以查看MongoDB的一些基本信息。比如端口号是10001,则监听的端口号是11001。如果要关闭管理接口,可以在启动时使用--nohttpinterface参数

http://10.100.11.102:11001/

mongod gflinux102:10001

List all commands | Replica set status

CommandsbuildInfo cursorInfo features hostInfo isMaster listDatabases replSetGetStatus serverStatus top

db version v2.6.6
git hash: 608e8bc319627693b04cc7da29ecc300a5f45a1f
sys info: Linux ip-10-123-131-43 2.6.18-194.el5xen #1 SMP Tue Mar 16 22:08:06 EDT 2010 i686 BOOST_LIB_VERSION=1_49
uptime: 41 seconds

overview (only reported if can acquire read lock quickly)

time to get readlock: 0ms
# databases: 2
# Cursors: 0
replication: 
master: 0
slave:  0

clients 

ClientOpIdLockingWaitingSecsRunningOpNamespaceQueryclientmsgprogress
DataFileSync1
{ waitingForLock: false }
0

:27017

signalProcessingThread0
{ waitingForLock: false }
0

:27017

initandlisten8
{ waitingForLock: false }
2002local.startup_log
0.0.0.0:0

TTLMonitor6
{ waitingForLock: false }
0

:27017

snapshotthread4
{ waitingForLock: false }
0

:27017

clientcursormon5
{ waitingForLock: false }
0

:27017

RangeDeleter9
{ waitingForLock: false }
0

:27017

websvr11
{ waitingForLock: false }
0admin.system.users
:27017


dbtop (occurrences|percent of elapsed)

NStotalReadsWritesQueriesGetMoresInsertsUpdatesRemoves
TOTAL30.0%30.0%00%00%00%00%00%00%

30.0%30.0%00%00%00%00%00%00%

write lock % time in write lock, by 4 sec periods

0 0 0 0 0 0 0 0 0 0

write locked now: false


Log 

2015-02-10T15:55:10.453+0800 [initandlisten] MongoDB starting : pid=4062 port=10001 dbpath=/opt/mongo/data 32-bit host=gflinux102
           15:55:10.454+0800 [initandlisten] 
           15:55:10.454+0800 [initandlisten] ** NOTE: This is a 32 bit MongoDB binary.
           15:55:10.454+0800 [initandlisten] **       32 bit builds are limited to less than 2GB of data (or less with --journal).
           15:55:10.454+0800 [initandlisten] **       Note that journaling defaults to off for 32 bit and is currently off.
           15:55:10.454+0800 [initandlisten] **       See http://dochub.mongodb.org/core/32bit
           15:55:10.454+0800 [initandlisten] 
           15:55:10.454+0800 [initandlisten] db version v2.6.6
           15:55:10.454+0800 [initandlisten] git version: 608e8bc319627693b04cc7da29ecc300a5f45a1f
           15:55:10.454+0800 [initandlisten] build info: Linux ip-10-123-131-43 2.6.18-194.el5xen #1 SMP Tue Mar 16 22:08:06 EDT 2010 i686 BOOST_LIB_VERSION=1_49
           15:55:10.454+0800 [initandlisten] allocator: system
           15:55:10.454+0800 [initandlisten] options: { config: "/opt/mongo/data/mongod.conf", net: { http: { enabled: true }, port: 10001 }, processManagement: { fork: true }, storage: { dbPath: "/opt/mongo/data" }, systemLog: { destination: "file", logAppend: true, path: "/opt/mongo/logs/mongodb.log" } }
           15:55:10.524+0800 [initandlisten] waiting for connections on port 10001
           15:55:10.549+0800 [websvr] admin web console waiting for connections on port 11001
           15:55:31.814+0800 [initandlisten] connection accepted from 10.100.11.1:60455 #1 (1 connection now open)
           15:55:47.013+0800 [conn1] end connection 10.100.11.1:60455 (0 connections now open)

2、获取MongoDB服务器的统计信息(serverStatus)

    要获取运行中的MongoDB服务器的统计信息,最基本工具就是serverStatus命令:

> db.runCommand({"serverStatus":1})

或者

> db.serverStatus()

{

"host" : "gflinux102:10001",

"version" : "2.6.6",

"process" : "mongod",

"pid" : NumberLong(4062),

"uptime" : 2898,

"uptimeMillis" : NumberLong(2898078),

"uptimeEstimate" : 2883,

"localTime" : ISODate("2015-02-10T08:43:28.491Z"),

"asserts" : {

"regular" : 0,

"warning" : 0,

"msg" : 0,

"user" : 0,

"rollovers" : 0

},

"backgroundFlushing" : {

"flushes" : 48,

"total_ms" : 0,

"average_ms" : 0,

"last_ms" : 0,

"last_finished" : ISODate("2015-02-10T08:43:10.526Z")

},

"connections" : {

"current" : 1,

"available" : 818,

"totalCreated" : NumberLong(14)

},

"cursors" : {

"note" : "deprecated, use server status metrics",

"clientCursors_size" : 0,

"totalOpen" : 0,

"pinned" : 0,

"totalNoTimeout" : 0,

"timedOut" : 0

},

"extra_info" : {

"note" : "fields vary by platform",

"heap_usage_bytes" : 23439096,

"page_faults" : 0

},

"globalLock" : {

"totalTime" : NumberLong("2898079000"),

"lockTime" : NumberLong(19959),

"currentQueue" : {

"total" : 0,

"readers" : 0,

"writers" : 0

},

"activeClients" : {

"total" : 0,

"readers" : 0,

"writers" : 0

}

},

"indexCounters" : {

"accesses" : 2,

"hits" : 2,

"misses" : 0,

"resets" : 0,

"missRatio" : 0

},

"locks" : {

"." : {

"timeLockedMicros" : {

"R" : NumberLong(132),

"W" : NumberLong(19959)

},

"timeAcquiringMicros" : {

"R" : NumberLong(45),

"W" : NumberLong(70)

}

},

"admin" : {

"timeLockedMicros" : {

"r" : NumberLong(7286),

"w" : NumberLong(0)

},

"timeAcquiringMicros" : {

"r" : NumberLong(1503),

"w" : NumberLong(0)

}

},

"local" : {

"timeLockedMicros" : {

"r" : NumberLong(109992),

"w" : NumberLong(94)

},

"timeAcquiringMicros" : {

"r" : NumberLong(15939),

"w" : NumberLong(11)

}

}

},

"network" : {

"bytesIn" : 9622,

"bytesOut" : 355275,

"numRequests" : 150

},

"opcounters" : {

"insert" : 1,

"query" : 97,

"update" : 0,

"delete" : 0,

"getmore" : 0,

"command" : 151

},

"opcountersRepl" : {

"insert" : 0,

"query" : 0,

"update" : 0,

"delete" : 0,

"getmore" : 0,

"command" : 0

},

"recordStats" : {

"accessesNotInMemory" : 0,

"pageFaultExceptionsThrown" : 0,

"admin" : {

"accessesNotInMemory" : 0,

"pageFaultExceptionsThrown" : 0

},

"local" : {

"accessesNotInMemory" : 0,

"pageFaultExceptionsThrown" : 0

}

},

"writeBacksQueued" : false,

"mem" : {

"bits" : 32,

"resident" : 39,

"virtual" : 241,

"supported" : true,

"mapped" : 80

},

"metrics" : {

"cursor" : {

"timedOut" : NumberLong(0),

"open" : {

"noTimeout" : NumberLong(0),

"pinned" : NumberLong(0),

"total" : NumberLong(0)

}

},

"document" : {

"deleted" : NumberLong(0),

"inserted" : NumberLong(1),

"returned" : NumberLong(0),

"updated" : NumberLong(0)

},

"getLastError" : {

"wtime" : {

"num" : 0,

"totalMillis" : 0

},

"wtimeouts" : NumberLong(0)

},

"operation" : {

"fastmod" : NumberLong(0),

"idhack" : NumberLong(0),

"scanAndOrder" : NumberLong(0)

},

"queryExecutor" : {

"scanned" : NumberLong(0),

"scannedObjects" : NumberLong(0)

},

"record" : {

"moves" : NumberLong(0)

},

"repl" : {

"apply" : {

"batches" : {

"num" : 0,

"totalMillis" : 0

},

"ops" : NumberLong(0)

},

"buffer" : {

"count" : NumberLong(0),

"maxSizeBytes" : 268435456,

"sizeBytes" : NumberLong(0)

},

"network" : {

"bytes" : NumberLong(0),

"getmores" : {

"num" : 0,

"totalMillis" : 0

},

"ops" : NumberLong(0),

"readersCreated" : NumberLong(0)

},

"preload" : {

"docs" : {

"num" : 0,

"totalMillis" : 0

},

"indexes" : {

"num" : 0,

"totalMillis" : 0

}

}

},

"storage" : {

"freelist" : {

"search" : {

"bucketExhausted" : NumberLong(0),

"requests" : NumberLong(0),

"scanned" : NumberLong(0)

}

}

},

"ttl" : {

"deletedDocuments" : NumberLong(0),

"passes" : NumberLong(48)

}

},

"ok" : 1

}

 

    原始的统计信息同样可以有http接口以Json的形式得到,位置在/_status(http://10.100.11.102:11001/_status)。

    serverStatus呈现了MongoDB内部的详细信息,比如当前服务器版本、运行时间、当前连接数等。

    "globalLock"的值表示全局写入锁占用了服务器多少时间(单位微秒)

    "mem"包含服务器内存映射了多少数据,服务器进程的虚拟内存和常驻内存的占用情况(单位MB)

    "indexCounters"表示B树在磁盘检索("misses")和内存检索("hits")的次数.如果这个比值开始上升,就要考虑加内存了.

    "backgroundFlushing"表示后台做了多少次fsync以及用了多少时间

    "opcounters"文档包含了每种主要操作的次数

    "asserts"统计了断言的次数

3、获取当前数据库的信息,比如obj总数、数据库总大小和平均obj

> use test;

switched to db test

> db.stats()

{

"db" : "test",

"collections" : 0,

"objects" : 0,

"avgObjSize" : 0,

"dataSize" : 0,

"storageSize" : 0,

"numExtents" : 0,

"indexes" : 0,

"indexSize" : 0,

"fileSize" : 0,

"dataFileVersion" : {

},

"ok" : 1

}

>

4、获取当前正在执行的操作

> db.currentOp()

{ "inprog" : [ ] }

    Mongodb 的命令一般很快就完成,但是在一台繁忙的机器或者有比较慢的命令时,你可以通过db.currentOp()获取当前正在执行的操作。

    在没有负载的机器上,该命令基本上都是返回空的

    以下是一个有负载的机器上得到的返回值样例:

> db.currentOp()

{ "opid" : "shard3:466404288", "active" : false, "waitingForLock" : false, "op" : "query", "ns" : "sd.usersEmails", "query" : { }, "client_s" : "10.121.13.8:34473", "desc" : "conn" },

    如果你发现一个操作太长,把数据库卡死的话,可以用这个命令杀死他

> db.killOp("shard3:466404288")

5、使用profiling

    似于MySQL的slow log, MongoDB可以监控所有慢的以及不慢的查询。Profiler默认是关闭的,你可以选择全部开启,或者有慢查询的时候开启。

> use test

switched to db test

> db.setProfilingLevel(2)

{ "was" : 0, "slowms" : 100, "ok" : 1 }

> db.getProfilingLevel()

2

    查看Profile日志

> db.system.profile.find().sort({$natural:-1})

{"ts" : "Thu Jan 29 2009 15:19:32 GMT-0500 (EST)" , "info" :

"query test.$cmd ntoreturn:1 reslen:66 nscanned:0 query: { profile: 2 } nreturned:1 bytes:50" ,

"millis" : 0} ...

3个字段的意义

ts:时间戳

info:具体的操作

millis:操作所花时间,毫秒

注意,造成满查询可能是索引的问题,也可能是数据不在内存造成因此磁盘读入造成。

http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/

6、mongostat

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

它的输出有以下几列:

  • inserts/s 每秒插入次数

  • query/s 每秒查询次数

  • update/s 每秒更新次数

  • delete/s 每秒删除次数

  • getmore/s 每秒执行getmore次数

  • command/s 每秒的命令数,比以上插入、查找、更新、删除的综合还多,还统计了别的命令

  • flushs/s 每秒执行fsync将数据写入硬盘的次数。

  • mapped/s 所有的被mmap的数据量,单位是MB,

  • vsize 虚拟内存使用量,单位MB

  • res 物理内存使用量,单位MB

  • faults/s 每秒访问失败数(只有Linux有),数据被交换出物理内存,放到swap。不要超过100,否则就是机器内存太小,造成频繁swap写入。此时要升级内存或者扩展

  • locked % 被锁的时间百分比,尽量控制在50%以下吧

  • idx miss % 索引不命中所占百分比。如果太高的话就要考虑索引是不是少了

  • q t|r|w 当Mongodb接收到太多的命令而数据库被锁住无法执行完成,它会将命令加入队列。这一栏显示了总共、读、写3个队列的长度,都为0的话表示mongo毫无压力。高并发时,一般队列值会升高。

  • conn 当前连接数

  • time 时间戳

[root@gflinux102 bin]# ./mongostat --port 10001

connected to: 127.0.0.1:10001

insert  query update delete getmore command flushes mapped  vsize    res faults  locked db idx miss %     qr|qw   ar|aw  netIn netOut  conn       time 

    *0     *0     *0     *0       0     1|0       0   160m   322m    41m      0  test:0.0%          0       0|0     0|0    62b     2k     2   17:41:41 

    *0     *0     *0     *0       0     1|0       0   160m   322m    41m      0 admin:0.0%          0       0|0     0|0    62b     2k     2   17:41:42 

    *0     *0     *0     *0       0     1|0       0   160m   322m    41m      0  test:0.0%          0       0|0     0|0    62b     2k     2   17:41:43 

    *0     *0     *0     *0       0     1|0       0   160m   322m    41m      0  test:0.0%          0       0|0     0|0    62b     2k     2   17:41:44 

    *0     *0     *0     *0       0     1|0       0   160m   322m    41m      0  test:0.0%          0       0|0     0|0    62b     2k     2   17:41:45 

    *0     *0     *0     *0       0     1|0       0   160m   322m    41m      0  test:0.0%          0       0|0     0|0    62b     2k     2   17:41:46 

    *0     *0     *0     *0       0     1|0       0   160m   322m    41m      0  test:0.0%          0       0|0     0|0    62b     2k     2   17:41:47 

    *0     *0     *0     *0       0     1|0       0   160m   322m    41m      0  test:0.0%          0       0|0     0|0    62b     2k     2   17:41:48 

    *0     *0     *0     *0       0     1|0       0   160m   322m    41m      0  test:0.0%          0       0|0     0|0    62b     2k     2   17:41:49 

    *0     *0     *0     *0       0     1|0       0   160m   322m    41m      0  test:0.0%          0       0|0     0|0    62b     2k     2   17:41:50 

7、MMS

    MongoDB Monitoring Service(MMS)是Mongodb厂商提供的监控服务,可以在网页和Android客户端上监控你的MongoDB状况。 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。