8

我试图在我的一个分片集合中找到所有块的大小。

我想知道真正的 大小,而不是作为我知道我可以找到的设置给 mongos 的提示:

use config
db.settings.find({_id : "chunksize"})

我尝试了几种解决方案,但计数操作非常慢,所以这并不容易。你知道解决方案吗?(shell、csharp、python、ruby、bash,我不在乎)

现在我已经测试了以下内容:

db.getSisterDB("config").chunks.find({ns : "mydb.mycollection"}).forEach(function(chunk) {
     db.getSisterDB("mydb").mycollection.find({},{_id : 0, partnerId , 1, id : 1}).min(chunk.min).max(chunk.max).count()
})

但这太慢了,我的印象是它不使用我的分片键上的索引(它是 on {partnerId : 1, id : 1})。

我也用解释代替了计数但没有任何运气。我还用javascript forEach替换了计数以手动计数(尝试使用不会命中磁盘的indexOnly查询)。

我试图找到真正的大小,因为我看到有几个块远远高于作为提示给出的块大小(2Gb 而不是 64Mb)。

4

2 回答 2

8

我认为最能帮助你的命令是datasize命令。这里仍然有一个警告,该命令将需要更长的时间才能在较大的集合中运行,因此您的里程可能会有所不同。

鉴于此,您可以尝试类似以下的操作:

var ns = "mydb.mycollection" //the full namespace of the collection
var key = {partnerId : 1, id : 1} //the shard key of the collection

db.getSiblingDB("config").chunks.find({ns : ns}).forEach(function(chunk) {
        var ds = db.getSiblingDB(ns.split(".")[0]).runCommand({datasize:chunk.ns,keyPattern:key,min:chunk.min,max:chunk.max});
        print("Chunk: "+chunk._id +" has a size of "+ds.size+", and includes "+ds.numObjects+" objects (took "+ds.millis+"ms)")
    }
)
于 2012-09-18T04:30:24.293 回答
1

经过一些尝试,没有比在 <2.2 版本中使用计数更简单的方法了以下是我与复合分片键 (partnerId, id) 一起使用的脚本。

var collection = "products";
var database = "products";
var ns =database+"."+collection;
rs.slaveOk(true)
db.getSiblingDB("config").chunks.find({ns : ns}).forEach(function(chunk) {
  pMin = chunk.min.partnerId
  pMax = chunk.max.partnerId
  midR = {partnerId : {$gt : pMin , $lt : pMax}}
  lowR = {partnerId  : pMin,  id : {$gte : chunk.min.id}}
  if (pMin == pMax) lowR.id = {$gte : chunk.min.id, $lt : chunk.max.id}
  upR  = {partnerId  : pMax,  id : {$lt : chunk.max.id}}
  a = db.getSiblingDB(database).runCommand({count : collection, query : lowR, fields :    {partnerId :1, _id : 0}}).n 
  b = db.getSiblingDB(database).runCommand({count : collection, query : midR, fields :    {partnerId :1, _id : 0}}).n 
  c=0
  if (pMin != pMax)
    c = db.getSiblingDB(database).runCommand({count : collection, query : upR, fields :    {partnerId :1, _id : 0}}).n 
  print(chunk.shard + "|"+tojson(chunk.min) +"|" +tojson(chunk.max)+"|"+a +"|"+b+"|"+ c     +"|"+(a+b+c))
  })
于 2012-09-27T08:03:03.333 回答