我正试图在我的一个分片集中找到所有块的大小。
我想知道真实的大小,而不是作为我知道可以找到的设置的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)。
答案 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))
})