這個系列大致想跟大家分享以下篇章(我會持續更新的↖(^ω^)↗): 1、mongo 3.4分片集群系列之一:淺談分片集群 2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3、mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全 4、mongo 3.4分片集群系列之 ...
這個系列大致想跟大家分享以下篇章(我會持續更新的↖(^ω^)↗):
2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片
3、mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全
4、mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 + 安全 + 區域
6、mongo 3.4分片集群系列之六:詳解配置資料庫
7、mongo 3.4分片集群系列之七:配置資料庫管理
8、mongo 3.4分片集群系列之八:分片管理
這篇為理論篇
這篇章主要講一下以下幾個點:
1) 簡要說說平衡器是啥吧
2) 平衡器在分片集群中是乾什麼的,也就是平衡器的作用
3) 這裡還會仔細說明分片集群中遷移塊的過程
4) 平衡器的定時啟用和關閉
5) 怎麼減少平衡器對分片集群的性能影響
6) 關於平衡器的一些命令
1、 簡要說說平衡器是啥
MongoDB的平衡器是一個後臺進程,監視每個分片上塊的數目。當給定分片上的塊數達到特定的遷移閾值時,平衡器會嘗試在分片之間自動遷移塊,使得每個分片達到相等數量的塊。平衡器將比較多塊的分片中的塊遷移到塊數量較少的分片中。平衡器遷移塊,直到集合在分片之間的塊均勻分佈。
平衡器具有以下閾值:
塊數 |
遷移閾值 |
少於20 |
2 |
20-79 |
4 |
多於80 |
8 |
分片集群的平衡過程對用戶和應用層完全透明,儘管在執行過程中可能會有一些性能影響。
2、 平衡器在分片集群中是乾什麼的,也就是平衡器的作用
其中,上面已經介紹了,說得直白點,就是用來在分片集群中遷移塊的。
3、 分片集群中遷移塊的過程
所有塊遷移使用以下過程:
- 平衡器進程將moveChunk命令發送到源分片。
- 源分片使用內部moveChunk 命令啟動移動。在遷移過程中,塊的操作路由到源分片。源分片負責塊的寫入操作。
- 目標分片生成目標分片所不存在的源分片所需的所有索引。
- 目標分片開始在塊中請求文檔,並開始接收數據的副本。
- 在塊中收到最終文檔後,目標分片將啟動同步過程,以確保它具有對遷移過程中發生的已遷移文檔的更改。
- 當完全同步時,源分片連接到 配置資料庫,並使用塊的新位置更新集群元數據。
- 源分片完成元數據的更新後,一旦塊上沒有打開游標,源分片將刪除其文檔副本。
註意: 如果平衡器需要從源分片執行其他的塊遷移,則平衡器可以啟動下一個塊遷移,而不必等待當前的遷移過程來完成此刪除步驟。
註意:不能移動的塊:如果塊中的文檔數超過了250000個文檔,或者配置的塊大小除以平均文檔大小的1.3倍,則MongoDB不能移動塊 。 db.collection.stats() 的avgObjSize欄位,表示集合中平均文檔的大小。
在大多數情況下,應該讓平衡器在分片之間 自動遷移塊。但是,mongoDB也允許手動遷移塊:
遷移單個塊
下麵的示例假定在一個myapp 資料庫有users集合,分片鍵是欄位username
為smith的塊 。在mongoshell中使用以下命令遷移該塊 。
db.adminCommand( { moveChunk : "myapp.users",
find : {username : "smith"},
to : "mongodb-shard3.example.net" } )
此命令將包含分片鍵值“smith”的塊遷移到分片名為mongodb-shard3.example.net。
4、 平衡器的定時啟用和關閉
利用計劃平衡視窗,可以達到讓平衡器定時啟用和關閉。
4.1. 啟用一個計劃平衡視窗
以下過程指定了activeWindow,使得平衡器能夠在特定的時間範圍遷移塊:
1) 使用mongo shell連接到群集中的任何一個mongos。
2) 切換到配置資料庫。
use config
3) 確保平衡器的狀態不是stopped。
sh.setBalancerState( true )
如果在activeWindow時間範圍之外,平衡器將無法啟動。
4) 修改平衡器的視窗。
使用update()設置activeWindow,如下所示:
db.settings.update(
{ _id: "balancer" },
{ $set: { activeWindow : { start : "<start-time>", stop : "<stop-time>" } } },
{ upsert: true }
)
使用兩位數小時和分鐘值(即HH:MM)指定平衡視窗的開始和結束邊界時間來替換<start-time>和<end-time>。
-
- 對於HH值,使用小時值範圍00- 23。
- 對於MM值,使用分鐘值範圍00- 59。
註意:平衡器視窗必須足以完成上次禁用平衡器時插入的所有數據的遷移。
以上過程設置之後,平衡器則會在平衡視窗規定的時間start—stop之間運行,在這段時間之外平衡器是被禁用的。
4.2. 移除一個平衡計劃視窗
那麼當這個平衡視窗不用時,怎麼移除它呢?
如果設置了平衡視窗並希望刪除計劃,以使平衡器始終運行,請使用$unset以清除activeWindow,如下所示:
use config
db.settings.update({ _id : "balancer" }, { $unset : { activeWindow : true } })
5、 怎麼減少平衡器對分片集群的性能影響
5.1. 系統自帶機制減少平衡器對分片集群性能的影響
塊的遷移在帶寬和工作負載方面帶來一些開銷,這兩者都可能影響資料庫性能。平衡器 試圖最小化的該影響:
-
- 在任何給定的時間將分片限制在最多一個遷移; 即分片不能同時參與多個塊遷移。要從分片中遷移多個塊,平衡器一次移動一個塊。
版本3.4更改:從MongoDB 3.4開始,MongoDB可以執行並行塊遷移。觀察分片一次可以參與多達一個遷移的限制,對於具有n個分 片的分片集群,MongoDB可以同時執行最多n / 2(四捨五入)進行的塊遷移。
-
- 只有當分片數量最多的分片和分片數量最少的分片之間的塊數差異達到遷移閾值時才開始平衡。
5.2. 我們可以採取的措施
臨時禁用平衡器進行維護(可以看第6點)。
可以設置計劃平衡視窗(可以看第4點),以限制平衡器運行的視窗,以防止其影響生產流量。平衡視窗的規範是相對於配置伺服器副本集的主節點本地時區。
6、 關於平衡器的一些命令
檢查平衡器是否啟用(即平衡器被允許運行) sh.getBalancerState()
檢查平衡器是否在運行 sh.isBalancerRunning()
禁用平衡器 sh.stopBalancer()
啟用平衡器 sh.startBalancer()或sh.setBalancerState(true)
在一個集合禁用平衡器 sh.disableBalancing("databaseName.collectionName")
sh.disableBalancing()方法接收集合的完整命名空間作為其參數。
在一個集合啟用平衡器 sh.enableBalancing("students.grades")
sh.enableBalancing()方法接收集合的完整命名空間作為其參數。
--------------------------------------- over ------------------------------------------------------
以上資料,大部分是參考官網的資料,在此表示感謝。
https://docs.mongodb.com/manual/core/sharding-balancer-administration/