2013-07-24 38 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塊,這有點奇怪?你有什麼設置塊大小?塊大小太小肯定會減慢塊到其他碎片的遷移。