8

シャーディングコレクションの1つですべてのチャンクのサイズを見つけようとしています。

私は実際の サイズを知りたいのですが、私が見つけることができる設定としてモンゴに与えられたヒントではありません:

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

私はいくつかの解決策を試しましたが、カウント操作が非常に遅いため、これは簡単ではありません。あなたは解決策を知っていますか?(シェル、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})のインデックスを使用していないという印象を受けています。

また、運が悪ければ、カウント説明に置き換えました。また、カウントをjavascript forEachに置き換えて、手動でカウントしました(ディスクにヒットしないindexOnlyクエリを作成しようとしています)。

ヒントとして指定されたチャンクサイズ(64Mbではなく2Gb)をはるかに超えるチャンクをいくつか見たので、実際のサイズを見つけようとしています。

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 に答える