在云數據庫 MongoDB 版分片集群實例增刪Shard節點、數據遷移等場景下,您可能需要修改均衡器Balancer的活動窗口期或開啟關閉均衡器Balancer。本文介紹如何管理均衡器Balancer。
功能簡介
均衡器Balancer用于均衡分片集群實例中各Shard節點中的數據,不同版本的MongoDB實例工作原理存在區別:
MongoDB 5.0及以前版本:
Balancer會監控分片集群實例中各個Shard節點上的Chunk(塊)數量,當某個Shard節點上的Chunk數量達到遷移閾值時,Balancer會對Shard節點上的Chunk進行遷移(moveChunk),盡量保證每個Shard節點上的Chunk數量相同。不同版本的遷移閾值存在差異,具體信息如下。
數據庫版本
遷移閾值
MongoDB 3.2(已停售)
Chunk總數<20,遷移閾值為2。
20≤Chunk總數≤80,遷移閾值為4。
80≤Chunk總數,遷移閾值為8。
MongoDB 3.4(已停售)
MongoDB 4.0
默認遷移閾值為2。
如果Chunk總數小于20個,或者上次遷移的Chunk數量小于20個,遷移閾值為1。
MongoDB 4.2
MongoDB 4.4
MongoDB 5.0
遷移閾值為1。
MongoDB 6.0:
由于Jumbo Chunk的存在,根據Chunk數量均衡數據可能會出現各Shard節點上Chunk數量相同,但是磁盤空間使用大小卻不同的情況。為解決上述問題,自云數據庫 MongoDB 版6.0版本起,Balancer變為監控分片集群實例中各個Shard節點上同一集合的數據大小情況,當集合在各Shard節點上的數據大小差異超過384 MB時(三倍的Chunk Size),Balancer會根據Shard Tag分割數據再遷移(moveRange)至其他Shard節點。
如果您需要判斷數據是否均衡,可以通過
getShardDistribution()
命令查看集合的數據分布情況,無需再關注Chunk這個邏輯概念,只需專注于集合數據大小即可。
注意事項
僅分片集群實例支持Balancer功能。
Balancer默認處于開啟狀態。如未開啟,請參見開啟Balancer功能。
Balancer的活動窗口期默認為全天,當Balancer執行塊遷移時,可能會影響數據庫性能。為避免塊遷移給您的業務帶來影響,建議您將Balancer的活動窗口期修改為業務低峰期。設置活動窗口期的方法,請參見設置Balancer的活動窗口。
本文的示例均通過Mongo Shell進行操作,其他客戶端工具管理Balancer的方法以及返回信息可能與本文示例存在差異。
設置Balancer的活動窗口
在mongos節點命令窗口中,切換至config數據庫。
use config
執行如下命令設置Balancer的活動窗口。
db.settings.update( { _id: "balancer" }, { $set: { activeWindow : { start : "<start-time>", stop : "<stop-time>" } } }, { upsert: true } )
說明<start-time>
:開始時間,時間格式為HH:MM(實例所在地域的當地時間),HH取值范圍為00~23,MM取值范圍為00~59。<stop-time>
:結束時間,時間格式為HH:MM(實例所在地域的當地時間),HH取值范圍為00~23,MM取值范圍為00~59。
例如,您需要將Balancer活躍窗口期修改為每天凌晨的1點到3點,示例如下:
db.settings.update( { _id: "balancer" }, { $set: { activeWindow : { start : "01:00", stop : "03:00" } } }, { upsert: true } )
設置成功后,您可以執行
sh.status()
命令查看Balancer的活動窗口。返回示例如下。
相關操作:如您需要Balancer始終處于運行狀態,您可以執行如下命令去除活動窗口的設置。
db.settings.update({ _id : "balancer" }, { $unset : { activeWindow : true } })
開啟Balancer功能
如果您設置了數據分片,開啟Balancer功能后可能會立即觸發均衡任務。這將占用實例的資源,請在業務低峰期執行該操作。
在mongos節點命令窗口中,切換至config數據庫。
use config
執行如下命令開啟Balancer功能。
sh.setBalancerState(true)
關閉Balancer功能
均衡器Balancer默認處于開啟狀態。如果需臨時關閉,請參見以下步驟進行操作。
關閉Balancer功能后,Balancer將不會再均衡各Shard節點中的數據,可能會導致數據傾斜。
在mongos節點命令窗口中,切換至config數據庫。
use config
執行
sh.isBalancerRunning()
命令查看Balancer運行狀態。sh.isBalancerRunning()
命令會依據Mongo Shell客戶端的版本返回不同的結果,返回結果目前有布爾值和Map兩種:布爾值
返回值為false,表示Balancer沒有處于執行任務的狀態,此時可執行關閉Balancer操作。
返回值為true,表示Balancer正在執行塊遷移,此時不能執行關閉Balancer的命令,否則可能引起數據不一致。
Map
{ mode: 'full', inBalancerRound: false, numBalancerRounds: Long("1143"), ok: 1, '$clusterTime': { clusterTime: Timestamp({ t: 1639753724, i: 3 }), signature: { hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0), keyId: Long("0") } }, operationTime: Timestamp({ t: 1639753724, i: 3 }) }
如果inBalancerRound為false,表示Balancer沒有處于執行任務的狀態,此時可執行關閉Balancer操作。
如果inBalancerRound為true,表示Balancer正在執行塊遷移,此時不能執行關閉Balancer的命令,否則可能引起數據不一致。
更多關于
sh.isBalancerRunning()
的介紹,請參見sh.isBalancerRunning()。確認執行第3步的命令后返回的值為空,可執行關閉Balancer命令。
sh.stopBalancer()