鍍金池/ 問答/數(shù)據(jù)庫/ 關(guān)于一個shard的從庫為什么要去統(tǒng)計另一個shard中的庫

關(guān)于一個shard的從庫為什么要去統(tǒng)計另一個shard中的庫

mongo集群

mongos> sh.status()
databases:
    {  "_id" : "foo",  "primary" : "shard1",  "partitioned" : false }
    {  "_id" : "bar",  "primary" : "shard0",  "partitioned" : false }

訪問shard1的從

mongo 127.0.0.1:28010

在mongo shell中執(zhí)行如下命令

shard1:SECONDARY> db.currentOp(    {      "active" : true,      "secs_running" : { "$gt" : 10 }    } )

    {
  "desc": "conn1041165",
  "threadId": "139624352057088",
  "connectionId": 1041165,
  "client": "192.168.0.1:54368",
  "active": true,
  "opid": 61729430,
  "secs_running": 42746,
  "microsecs_running": NumberLong("42746814047"),
  "op": "command",
  "ns": "bar",
  "query": {
    "dbstats": 1
  },
  "numYields": 0,
  "locks": {
    "Global": "r"
  },
  "waitingForLock": false,
  "lockStats": {
    "Global": {
      "acquireCount": {
        "r": NumberLong(1)
      }
    }
  }
}
],
"ok": 1
}
...

奇怪的是 發(fā)現(xiàn)有很多上述的查詢 shard1的從干嘛要去統(tǒng)計shard0的庫呢? 并且為什么執(zhí)行時間還這么久 差不多執(zhí)行了12個小時

"dbstats":1 是對應下面的命令嗎

> db.stats()
{
    "db" : "test",
    "collections" : 73,
    "objects" : 246794,
    "avgObjSize" : 2915.7151713574885,
    "dataSize" : 719581010,
    "storageSize" : 787140608,
    "numExtents" : 0,
    "indexes" : 85,
    "indexSize" : 11505664,
    "ok" : 1
}


回答
編輯回答
有你在

關(guān)于{dbstats: 1}意思:

  • 查詢條件是{dbstats: 1}({"query": {"dbstats": 1}})
  • 庫名是bar({ns: 'bar'})
  • 執(zhí)行的是command操作({op: 'command'})

因此執(zhí)行的語句是:

db.runCommand({dbstats: 1});

它實際上就是db.stats()方法的內(nèi)部操作:

rs0:PRIMARY> db.stats
function (scale) {
    return this.runCommand({dbstats: 1, scale: scale});
}

mongos> sh.status()
databases:
    {  "_id" : "foo",  "primary" : "shard1",  "partitioned" : false }
    {  "_id" : "bar",  "primary" : "shard0",  "partitioned" : false }

這個輸出的意思是現(xiàn)在有兩個集合,foo/bar,它們都沒有分片({"partitioned" : false}),因為沒有分片,所以實際承載它們的只是一個分片。分別們于shard1/shard0上({"primary" : "shard1"}/{"primary" : "shard0"}),不是你理解的統(tǒng)計另外一個shard中的庫。再者,這個命令是從mongos上執(zhí)行的,mongos本來就連接著所有的分片,也不存在所謂統(tǒng)計“另外一個shard”。


最后執(zhí)行時間太長的問題,確實db.stats()不應該執(zhí)行這么久。這個問題可能跟特定版本的bug有關(guān)系,或者跟你的環(huán)境有一些聯(lián)系,需要具體分析日志。建議去jira.mongodb.org開ticket詢問情況。

2017年9月7日 21:14