2012-03-14 79 views
1

當平衡器想要移動它時,數據如何從源分片移動到目標分片?這些數據是否會從源分片移動到monogoS然後插入到來自mongoS的目標分片中,或者源分片和目標分片是否會打開一個專用連接並在它們自己和mongoS之間移動數據來監視它?平衡器數據管道

如果這是第二種情況,這是否意味着每個分片上都有一個平衡器邏輯運行?

回答

2

平衡發生在mongos。 Mongos將每15秒觸發一次平衡運行。如果發現塊分佈不均勻,則會選擇一個塊進行遷移並啓動該遷移。一旦達到這一點,mongos /平衡器就完成了。從這裏開始,數據的實際遷移發生在兩個mongod實例/碎片之間。

因此,在分片上沒有運行平衡邏輯,但分片一旦由平衡器啓動就會在它們自己之間執行遷移。

+0

那麼它是運行遷移邏輯還是源碎片的目標碎片?什麼機制被使用?我的意思是遷移邏輯使用通用monogd API來加載塊,然後移動它?我基本上想了解遷移是如何發生的,因爲它在我的快速批插入過程中發生,並導致大量頁面錯誤並放慢我的批插入。 – iCode 2012-03-15 19:06:33

+0

源分片運行邏輯。目標碎片「盲目」信任源碎片指令。它不使用通用API,但使用內部多階段提交和重試系統來確保遷移安全完成,並且不會導致不一致的情況。正如你可以想象的那樣,有不少邊緣案例需要考慮。它會減慢批量插入的速度,因爲它必須將所有對寫入熱塊的寫入保持遷移到目標碎片上移動的版本。在某些時候,它會將寫入操作鎖定到源塊並拒絕寫入。 – 2012-03-16 16:06:01

+0

請注意,當我說「拒絕寫入」時,意味着mongos被通知嘗試寫入一個陳舊的塊,並且它會自動重試寫入接收塊/碎片。頁面錯誤等是接收方必須將適當的磁盤段/頁面交換到內存中的自然結果。如果有幫助,您可以將平衡配置爲僅在特定時間間隔發生。 – 2012-03-16 16:07:24