2012-07-05 48 views
0

我已經建立了分片集羣一臺機器上,按照這裏提到的步驟:

http://www.mongodb.org/display/DOCS/A+Sample+Configuration+Session

但我不明白「--chunkSize」選項:

$ ./mongos --configdb localhost:20000 --chunkSize 1 > /tmp/mongos.log &

隨氮素碎片,每個碎片應該有1/N數量的文檔,將所述分片密鑰的範圍分成N幾乎相等的部分,是嗎?這會自動修復塊大小/分片大小。上面的命令然後處理哪個塊?

此外,還可以手動分割集合中的某個特定值的密鑰,然後將塊遷移到您需要的任何其他分片。這可以手動完成,甚至可以通過「平衡器」自動處理。它是否與分片設置衝突並混淆了配置服務器,或者它們是否立即被報告有關此類移動?拆分鍵,CHUNKSIZE和預裂

感謝您的任何幫助。

回答

2

你可能會混淆一些東西。 --chunkSize參數設置執行拆分的塊大小。使用_id「chunksize」的「config」數據庫中的「settings」集合可以查看當前值(如果已設置)。 --chunkSize選項只會設置該值,或者對系統進行更改(如果沒有設置值),否則將被忽略。

塊大小是以兆字節爲單位的大小,系統將保持塊大小。這在兩個地方完成,1)當寫入通過mongos實例時,以及2)在平衡期間將塊移動到另一個碎片之前。因此,它不符合「數據大小/分片計數」公式。你每個塊的1Mb的例子幾乎總是一個壞主意。

您確實可以手動拆分和移動塊,儘管這可能會導致不理想的塊分佈,但它永遠不會混淆或破壞配置元數據和平衡器。原因相對簡單;平衡器使用相同的命令並遵循相同的代碼路徑。從MongoDB的角度來看,平衡器流程拆分和移動塊之間沒有顯着差異,並且您正在執行該操作。

雖然有一些有效的用例可以手動分割和移動塊。例如,您可能需要手動執行此操作,以便從冷啓動(預分割)開始準備羣集以實現非常高的峯值負載。通常情況下,您將編寫一個腳本來執行此操作,或者從性能測試中加載已經運行良好的分割。此外,您可以監視熱塊,以便根據應用程序監視的「加載」分割/移動這些塊,以均勻分佈。

希望有所幫助。

0

太好了,謝謝!我想我現在得到它..如果我錯了,請糾正我:

我在想,如果有N臺服務器,那麼集合的第一/第N部分(= chunk1)將轉到shard1,第二個1 /第n(= chunk2)會去shard2等等。當你說有沒有這樣的「公式」,我搜索了一點,發現這些鏈接

MongoDB sharding, how does it rebalance when adding new nodes?

How to define sharding range for each shard in Mongo?

從「塊」的定義文檔,我認爲它被認爲僅僅是數據遷移的一個單元。當我們在N個服務器之間分割一個集合時,總共沒有。大塊不一定是N.而且它們不需要具有相同的大小。

一個組塊的最大大小或者已經設置爲在配置數據庫中的設置集合的默認(通常64MB),或者可以通過指定使用--chunkSize參數如圖中上面的代碼的值手動設置。根據分片鍵的值,一個分片可能比另一個分片更多。但是MongoDB使用平衡器進程,試圖在碎片之間均勻分佈這些塊。通過均勻分佈,我的意思是,如果它們的長度超過極限,或者某個特定的碎片負載過重,那麼它往往會分割塊並將它們遷移到其他碎片。這也可以手動完成,方法是遵循平衡器進程使用的同一組命令。

+1

好,techincally來講它並不試圖平衡塊,它試圖跨越碎片平衡碎片鍵。但最終結果通常是相同的。 – 2012-07-06 09:16:13

+0

好吧,你是指當節點進入或退出時,平衡器遷移塊,以使關鍵分配均勻。 – 2012-07-06 09:31:35

+0

那麼我的意思是它基於分片鍵而不是塊數量進行平衡。那是什麼讓當有碎片密鑰分發熱點它正確地平衡(例如很多關於碎片鍵值的有限範圍的數據),基於塊分佈 – 2012-07-06 10:37:46