列舉mongodb監控的常用命令
1.監控統計
mongostat 可用於查看當前QPS/內存使用/連接數,以及多個shard的壓力分布
命令參考
./mongostat --port 27071 -u admin -p xxx --authenticationDatabase=admin --discover -n 30 3
參數說明
-discover 提供集群中所有節點的狀態
-n 30 3 表示輸出30次,每次休眠3秒鍾
輸出示例
insert query update delete getmore command %dirty %used flushes mapped vsize res faults qr|qw ar|aw netIn netOut conn set repl time
185.1.12.101:10001 499 4886 2042 1612 237 756|0 3.8 80.1 0 28.5G 19.1G n/a 3|0 1|1 4m 7m 5545 shard0 PRI 2017-03-06T11:48:17+08:00
指標說明
指標名 | 說明 |
---|---|
inserts/s | 每秒插入數 |
query/s | 每秒查詢數 |
update/s | 每秒更新數 |
delete/s | 每秒刪除數 |
getmore/s | 每秒getmore數 |
command/s | 每秒命令數,涵蓋了增刪改查和其他操作 |
dirty/% | WriedTiger引擎參數,緩存中無效數據百分比 |
used/% | WriedTiger引擎參數,正在使用的緩存百分比 |
flushs/s | 每秒執行fsync將數據寫入硬盤次數 |
mapped/MB | 所有的被mmap的數據量 |
vsize/MB | 虛擬內存使用量 |
res/MB | 物理內存使用量 |
faults/s | 每秒訪問失敗數,與內存swap有關 |
qrqw | 客戶端讀寫等待隊列數量,高並發時,一般隊列值會升高 |
araw | 客戶端讀寫活躍個數 |
netIn | 網絡接收數據量 |
netOut | 網絡發送數據量 |
conn | 當前連接數 |
set | 所屬集合(分片) |
repl | 復制狀態(主節點/二級節點..) |
time | 時間戳 |
官方說明
https://docs.mongodb.com/manual/reference/program/mongostat/
2.熱點操作
mongotop 用於查看當前占用比例較高的DB操作,即熱點操作。
命令參考
./mongotop --port 10001 -u admin -p xxx --authenticationDatabase=admin
輸出示例
ns total read write 2017-03-20T15:22:36+08:00
nscl.T_De**ata 407ms 266ms 140ms
nscl.T_OAUT**EN 251ms 242ms 8ms
nscl.T_Subs**tion 180ms 180ms 0ms
nscl.T_De**istory 61ms 0ms 61ms
官方說明
https://docs.mongodb.com/manual/reference/program/mongotop/
3.慢操作檢測
profile是mongodb實現慢操作檢測的模塊,官方說明
連接shell(使用root)
./mongo --port 10001 -u root -p xxx --authenticationDatabase=admin
use admin
注意
profile操作必須連接mongod進程,而mongos無法執行此類操作
profile設置
db.setProfilingLevel(0) 不輸出慢查詢
db.setProfilingLevel(1,100) 統計慢查詢,100ms是閾值
db.setProfilingLevel(2) 統計所有操作
db.getProfilingLevel()
查詢慢查詢
db.system.profile.find().limit(10).sort( { ts : -1 } ).pretty()
db.system.profile.find().limit(10).sort( { millis : -1 } ).pretty()
查詢當前操作
db.currentOp()
- 樣例-查詢等待鎖的增刪改查
db.currentOp(
{
"waitingForLock" : true,
$or: [
{ "op" : { "$in" : [ "insert", "update", "remove" ] } },
{ "query.findandmodify": { $exists: true } }
]
}
)
- 樣例-查詢活躍query操作
db.currentOp(true).inprog.forEach(
function(opDoc){
if(!opDoc.active && opDoc.op=='query')
printjson(d)
}
)
4. 集合狀態分析
數據庫狀態
db.stats()
->
{
"db" : "test", //當前數據庫
"collections" : 3, //集合數量
"objects" : 165606718, //對象數量
"avgObjSize" : 381, //對象平均大小
"dataSize" : 63142130610, //所有數據總大小
"storageSize" : 16384, //數據占磁盤大小
"numExtents" : 3,
"indexes" : 479, //索引數
"indexSize" : 8011636736, //索引大小
"fileSize" : 201326592 //預分配給數據庫的文件大小
}
集合狀態
db.xxx.stats()
->
...
"sharded" : true, //是否分片
"capped" : false, //是否限制大小
"ns" : "nscl.T_BUSINESS_LOG",
"count" : 26541837, //表數量
"size" : 14991828070, //表大小
"storageSize" : 3615076352, //占磁盤大小
"totalIndexSize" : 2640109568, //索引大小
"avgObjSize" : 564.8376210734773,
"nindexes" : 6,
"nchunks" : 374 //chunk數量
...
5. 分片均衡
利用sh.status或db.printShardingStatus()查看當前分片均衡狀態
輸出樣例
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5aa8dea3102264450d128285")
}
shards:
{ "_id" : "shard0", "host" : "shard0/135.177.126.24:10001,135.177.126.25:10001", "state" : 1 }
most recently active mongoses:
"3.4.10" : 3
autosplit:
Currently enabled: yes
balancer:
Currently enabled: yes
Currently running: no
Balancer lock taken at Sun Mar 25 2018 12:12:57 GMT+0800 by ConfigServer:Balancer
Balancer active window is set between 01:00 and 06:00 server local time
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
No recent migrations
databases:
{ "_id" : "app1", "primary" : "shard0", "partitioned" : true }
{ "_id" : "app2", "primary" : "shard0", "partitioned" : true }
app2.T_APIStat
shard key: { "recordTime" : "hashed" }
unique: false
balancing: true
chunks:
分段 | 說明 |
---|---|
shards | 分片列表信息,包含主備節點 |
active mongose | 當前活躍的mongos進程 |
autosplit | 自動切分chunk開關 |
balancer | 當前均衡器狀態信息,包括最近均衡的統計 |
databases | 數據庫分庫信息,包括每個集合的分片信息、chunks分布 |
6. 副本集同步
利用sh.status查看當前副本集狀態
{
"set" : "shard0",
"date" : ISODate("2018-04-10T06:56:37.674Z"),
"myState" : 2,
"term" : NumberLong(11),
"syncingTo" : "135.177.126.25:10001",
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1523343395, 1),
"t" : NumberLong(11)
},
"appliedOpTime" : {
"ts" : Timestamp(1523343395, 1),
"t" : NumberLong(11)
},
"durableOpTime" : {
"ts" : Timestamp(1523343395, 1),
"t" : NumberLong(11)
}
},
"members" : [
{
"_id" : 0,
"name" : "135.177.126.24:10001",
"health" : 1.0,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 276079,
"optime" : {
"ts" : Timestamp(1523343395, 1),
"t" : NumberLong(11)
},
"optimeDate" : ISODate("2018-04-10T06:56:35.000Z"),
"syncingTo" : "135.177.126.25:10001",
"configVersion" : 1,
"self" : true
},
{
"_id" : 1,
"name" : "135.177.126.25:10001",
"health" : 1.0,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 276057,
"optime" : {
"ts" : Timestamp(1523343395, 1),
"t" : NumberLong(11)
},
"optimeDurable" : {
"ts" : Timestamp(1523343395, 1),
"t" : NumberLong(11)
},
"optimeDate" : ISODate("2018-04-10T06:56:35.000Z"),
"optimeDurableDate" : ISODate("2018-04-10T06:56:35.000Z"),
"lastHeartbeat" : ISODate("2018-04-10T06:56:37.320Z"),
"lastHeartbeatRecv" : ISODate("2018-04-10T06:56:36.007Z"),
"pingMs" : NumberLong(0),
"electionTime" : Timestamp(1523067325, 1),
"electionDate" : ISODate("2018-04-07T02:15:25.000Z"),
"configVersion" : 1
},
{
"_id" : 2,
"name" : "135.177.126.26:10001",
"health" : 1.0,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 276057,
"lastHeartbeat" : ISODate("2018-04-10T06:56:35.890Z"),
"lastHeartbeatRecv" : ISODate("2018-04-10T06:56:35.020Z"),
"pingMs" : NumberLong(0),
"configVersion" : 1
}
],
"ok" : 1.0
}
分段 | 說明 |
---|---|
set | 當前副本集名稱 |
date | 執行命令時間 |
myState | 當前節點的狀態(角色) |
syncingTo | 同步源 |
heartbeatIntervalMillis | 心跳間隔 |
members | 節點成員 |
members.id | 成員編號 |
members.name | 成員名稱 |
members.heath | 健康狀態,1-true,0-false |
members.state | 成員狀態(角色)1-主節點 2-備節點 7-仲裁節點 |
members.stateStr | 成員狀態名 |
members.uptime | 成員啟動運行時長 |
members.optime | 成員oplog時間戳(字段ts) |
members.optimeDate | 成員oplog時間(格式化) |
members.lastHeartbeat | 當前節點對成員的最后一個心跳 |
members.lastHeartbeatRecv | 當前節點收到該成員的最后一個心跳 |
members.pingMs | 當前節點到該成員的回路時長 |
members.syncingTo | 成員同步源 |
members.electionTime | 主節點選舉時間戳(ms) |
members.electionDate | 主節點選舉時間(格式化) |
- 檢查每個成員的state/stateStr確認是否正常;
關於state狀態值參考 - 檢查每個成員的optimeDate差異,查看復制延遲;
- 檢查lastHeartbeat、pingMs值排查網絡延遲問題
使用db.printReplicationInfo()輸出節點oplog信息,可在主備節點輸出對比
configured oplog size: 20480MB
log length start to end: 589911secs (163.86hrs)
oplog first event time: Tue Apr 03 2018 19:37:14 GMT+0800
oplog last event time: Tue Apr 10 2018 15:29:05 GMT+0800
now: Tue Apr 10 2018 15:30:18 GMT+0800
主節點使用db.printSlaveReplicationInfo()可輸出備節點的同步信息
source: 135.177.126.24:10001
syncedTo: Tue Apr 10 2018 15:32:45 GMT+0800
0 secs (0 hrs) behind the primary