一 定義
1 基本單位為chunk,chunk中包含數條doc記錄.chunk默認大小是64M,寫滿后就生成新的chunk,我們可以打個比方.mongodb是一所學校,chunk是班級,初始時候只有一個班級,doc記錄則相當於學生,片鍵是指根據什么樣的規則分配學生到班級,初始只有一個班級,隨着入學的學生越來越多,會演變成越來越多的班級.每個辦公樓就相當於分片成員,move chunk就相當於調度班級的成員在辦公樓之間移動,對於mongo而言,chunk就是基本單位
二 負責進程
1 3.2 版本 balancer 在 mongos 4.0 版本 balancer 在 config moveChunk 過程和刪除數據的邏輯基本沒有差
2 一個分片不能同時參與多個塊的遷移。要從一個分片遷移多個塊,平衡器一次遷移一個塊。。最后,本次檢測出的遷移任務完成以后才開始下次 balancer 過程。
3 balancer 過程中,會對集合做一次隨機排序,當有多個集合的數據需要均衡時,遷移時也是隨機的,並不是遷移完一個集合開始下一個集合。
三 拆分閾值
4.0 以上版本,chunks 數量差距大於 2 的時候就會發生遷移, balance 認為是不均衡的,會發生遷移.我們可以發現,高版本mongo會產生更加頻繁的遷移,可能消耗更多的資源
四 拆分流程
1 原分片開始啟動moveChunk命令,在移動的過程中,所有的操作還會指向原來的分片
2 目標分片開始創建所需要的索引,在3.0以后,moveChunk需要在移動之前,目標分片中存在所有的索引,可以理解為先在目標分片中創建這個索引。
3 目標分片開始向原分片請求數據,並復制數據
4 當數據全部寫入到目標分片中,目標分片連接並更新config數據庫對應的塊信息
5 原分片將這部分塊數據進行異步刪除。
五 遷移-性能影響
1 moveChunk 可能對系統的負載產生影響,主要是刪除數據階段的影響,一般遷移中的插入數據影響較小;
六 平衡器設置
創建窗口期,平時關閉balance,在業務低峰期開啟(move chunk的消耗資源很大,建議這樣做)
use config
db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "23:00", stop : "6:00" } } }, true )
取消時間窗口設置:
db.settings.update({ _id : "balancer" }, { $unset : { activeWindow : true } })