知道mongodb中的实际块大小

时间:2012-09-11 15:45:01

标签: mongodb sharding

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

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

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

我尝试了几种解决方案,但 count 操作非常慢,所以这并不容易。 你知道解决方案吗? (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()
})

但这太慢了,我觉得它不会在我的分片键上使用索引(在{partnerId : 1, id : 1}上)。

我还用 explain 替换了 count 而没有任何运气。我还将 count 替换为javascript forEach 以手动计数(尝试使用 indexOnly 查询不会访问磁盘)。

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

2 个答案:

答案 0 :(得分: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)")
    }
)

答案 1 :(得分: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))
  })