2013-07-24 45 views
2

我正在测试MongoDB实现,我试图将1,000,000个记录批量插入到一个集合中并让它在两个分片之间均匀分布。我最初的试验看到一个包含995760条记录的碎片,另一个碎片只包含4251条记录。我试图预先拆分,但没有任何改变。我对分片的概念很陌生,希望对这个主题有所帮助。MongoDB分片没有最佳分配

UPDATE:

在字段 “号码”,这是我的范围的整数我的片键从1 - 999999

状态:

{ 
"sharded" : true, 
"ns" : "test.test_collection", 
"count" : 999999, 
"numExtents" : 21, 
"size" : 43982976, 
"storageSize" : 210247680, 
"totalIndexSize" : 60396112, 
"indexSizes" : { 
    "_id_" : 32466896, 
    "number_1" : 27929216 
}, 
"avgObjSize" : 43.983019983019986, 
"nindexes" : 2, 
"nchunks" : 239, 
"shards" : { 
    "firstset" : { 
     "ns" : "test.test_collection", 
     "count" : 995754, 
     "size" : 43813176, 
     "avgObjSize" : 44, 
     "storageSize" : 123936768, 
     "numExtents" : 11, 
     "nindexes" : 2, 
     "lastExtentSize" : 37625856, 
     "paddingFactor" : 1, 
     "systemFlags" : 1, 
     "userFlags" : 0, 
     "totalIndexSize" : 60118128, 
     "indexSizes" : { 
      "_id_" : 32319728, 
      "number_1" : 27798400 
     }, 
     "ok" : 1 
    }, 
    "secondset" : { 
     "ns" : "test.test_collection", 
     "count" : 4245, 
     "size" : 169800, 
     "avgObjSize" : 40, 
     "storageSize" : 86310912, 
     "numExtents" : 10, 
     "nindexes" : 2, 
     "lastExtentSize" : 27869184, 
     "paddingFactor" : 1, 
     "systemFlags" : 1, 
     "userFlags" : 0, 
     "totalIndexSize" : 277984, 
     "indexSizes" : { 
      "_id_" : 147168, 
      "number_1" : 130816 
     }, 
     "ok" : 1 
    } 
}, 
"ok" : 1 
} 

更新2:

感谢@Sammaye的建议。这个问题与我的分片键有关。当我对密钥进行散列处理时,批量插入操作均匀地分割记录。感谢所有的帮助!

+0

我们在这里需要大量的信息,你可以通过'status()'进行编辑吗?同时告诉我们你的分片密钥是什么 – Sammaye

+0

我曾经提过的一件事是你的分片密钥是montonic,这意味着它从1-999,999,这可能意味着分片正在按照它的意思去工作,分片1已经变满了,因为这样已经溢出到碎片2.如果你尝试了散列键,它会改变你的数据分布吗? – Sammaye

+0

当你说散列分片密钥时,我假设你是指为了获得均匀散布而散列的散列密钥哈希。或者你的意思是在分片设置上有一个标志可以让你激活哈希? – Rich

回答

1

集群通常需要一段时间才能达到平衡。如果您在一个大插入中输入了所有这些文档,那么它们将首先全部写入主分片,并且一旦它达到最大块大小,它将以块分割。然后块会逐个迁移到其他碎片,这可能需要一些时间。

从我可以看到你有大约100MB的数据,但429块,这有点奇怪?你有什么设置块大小?块大小太小肯定会减慢块到其他碎片的迁移。