全部產品
Search
文件中心

ApsaraDB for MongoDB:管理MongoDB均衡器Balancer

更新時間:Jun 19, 2024

ApsaraDB for 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數量相同,但是磁碟空間使用大小卻不同的情況。為解決上述問題,自ApsaraDB for MongoDB6.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的使用中視窗

  1. 通過Mongo Shell串連MongoDB分區叢集執行個體

  2. 在mongos節點命令視窗中,切換至config資料庫。

    use config
  3. 執行如下命令設定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功能後可能會立即觸發均衡任務。這將佔用執行個體的資源,請在業務低峰期執行該操作。

  1. 通過Mongo Shell串連MongoDB分區叢集執行個體

  2. 在mongos節點命令視窗中,切換至config資料庫。

    use config
  3. 執行如下命令開啟Balancer功能。

    sh.setBalancerState(true)

關閉Balancer功能

均衡器Balancer預設處於開啟狀態。如果需臨時關閉,請參見以下步驟進行操作。

說明

關閉Balancer功能後,Balancer將不會再均衡各Shard節點中的資料,可能會導致資料扭曲。

  1. 通過Mongo Shell串連MongoDB分區叢集執行個體

  2. 在mongos節點命令視窗中,切換至config資料庫。

    use config
  3. 執行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()

  4. 確認執行第3步的命令後返回的值為空白,可執行關閉Balancer命令。

    sh.stopBalancer()