如果不了解 MongoDB Sharded Cluster 原理,請先閱讀
關於 sharding 遷移,會分3個部分來介紹,本文為第三部分
- 負載均衡及遷移策略
- chunk 遷移流程
- Balancer 運維管理
在前面2個部分里,介紹了 MongoDB sharding 的遷移策略以及 chunk 遷移的步驟,本文將主要介紹如何管理 Balancer,以更好的為業務服務。
關閉 Balancer
可能需要關閉 Balancer 場景包括
- 對 Sharded cluster 進行備份時,需要先關閉 Balancer,避免備份出來 shard、config server 數據出現不一致。
- 避免 chunk 遷移對線上服務造成影響
查看 Balancer 當前狀態
sh.getBalancerState()
關閉 Balancer
sh.stopBalancer()
開啟 Balancer
sh.startBalancer()
說明:本文中提到的命令,都是連接到 sharding cluster 的 mongos 上執行
針對某個集合關閉 Balancer
默認情況下,Balancer 會針對所有分片的集合做負載均衡,如果針對某些特殊集合,不想 Balancer 自動去遷移數據,可以僅針對該集合關閉。
針對 students.grades 集合關閉 Balancer
sh.disableBalancing("students.grades")
針對 students.grades 集合開啟 Balancer
sh.enableBalancing("students.grades")
設置 Balancer 時間窗口
為了盡量避免 chunk 遷移影響業務,可以將 Balancer 設置為只在某個時間窗口內工作,避開業務高峰期,如下命令設置 Balancer 只在凌晨2:00 – 6:00 工作。
-
use config
-
db.settings.update(
-
{ _id: "balancer" },
-
{ $ set: { activeWindow : { start : "02:00", stop : "06:00" } } },
-
{ upsert: true }
-
)
設置遷移選項
moveChunk 允許用戶自定義遷移數據時,數據寫到目標上的安全級別 (自由的在可靠性和遷移效率間做選擇),通過writeConcern 的方式來指定。
用戶可以修改_secondaryThrottle
以及 writeConcern
參數,這2個參數需要組合起來使用,意思是如果_secondaryThrottle
為 true,則使用 writeConcern
選項來指定遷移時寫數據的策略;如果_secondaryThrottle
為 false,則使用{w: 1}, 如下命令將 writeConcern 設置為 {w: majority}。
-
use config
-
db.settings.update(
-
{ "_id" : "balancer" },
-
{ $ set : { "_secondaryThrottle" : true ,
-
"writeConcern": { "w": "majority" } } },
-
{ upsert : true }
-
)
如果沒有設置,則默認使用 {w: 2} ,要求至少寫到目標2個節點(若目標 shard 是單節點,則退化為{w: 1})。
數據遷移完后,源 shard 需要將遷移完的 chunk 移除,默認情況下,源 shard 會將刪除 chunk 的任務加到一個后台隊列,在后台異步刪除,然后 Balancer 就可以啟動下一次的 chunk 遷移。用戶可以設置 _waitForDelete 為 true(默認為 false),讓源 shard 在 chunk 遷移完后同步刪除 chunk 數據。
-
use config
-
db.settings.update(
-
{ "_id" : "balancer" },
-
{ $ set : { "_waitForDelete" : true } },
-
{ upsert : true }
-
)
設置 chunkSize
MognoDB sharding 默認 chunkSize 為64MB,默認設置在絕大多數場景都是合適的,在某些場景下,用戶可能需要修改 chunkSize 配置,具體參考關於MongoDB Sharding,你應該知道的 文章里『關於jumbo chunk及 chunk size』部分,這里不再贅述。
如下命令將 chunkSize 修改為 100MB
-
use config
-
db.settings.save( { _id:"chunksize", value: 100 } )
注意事項
- 將 chunkSize 改小,后台需要一定時間來對原來 chunk 進行分裂,將大小降低至新 chunkSize 以下。(如果是jumbo chunk,則無法分裂)
- 將 chunkSize 改大,原來的小 chunk 不會自動進行合並,只有新的插入或更新操作才能導致 chunk 大小逐步增大。
- chunkSize 可修改的范圍為[1MB, 1024MB]之間。
參考資料
轉載自:https://blog.csdn.net/wangkai_123456/article/details/53353193