MongoDB balancer的使用詳解
在MongoDB中,balancer(平衡器)是一個後臺進程,它監控每個shard上的chunk數量,一旦chunk的數量差異超過瞭閾值,balancer會自動遷移數據塊,從而保證每個分片上chunk數量的相對平衡。
整個搬遷的過程對於用戶來說是透明的,但是搬遷的過程中會對用戶產生一些影響。
01 balancer簡介
從MongoDB3.4開始,balancer運行在config server的主節點上。
在3.4版本中,balancer進程活躍期間,config server的主節點通過修改locks集合中的一個_id為balancer的文檔,來持有”balancer lock”;
3.6版本中,balancer不再持有鎖
默認的情況下,balancer始終處於開啟狀態,可以使用下面的命令來查看balancer的運行情況:
mongos> sh.getBalancerState() true
同樣的,我們可以使用下面幾個命令來簡單的管理balancer:
查看banlancer是否正在工作 sh.isBalancerRunning() 停止balancer sh.stopBalancer() 啟動balancer sh.setBalancerState( true )
02 balancer工作中可能對業務造成的影響?
1、磁盤占用:
從MongoDB2.6開始,MongoDB會自動歸檔遷移的chunk文檔,以方便在chunk搬遷過程中出現問題後的文檔恢復。
我們可以通過配置文件中的參數:sharding.archiveMovedChunks
來控制是否開啟遷移過程中chunk的自動歸檔,該參數在MongoDB2.6和3.0版本是默認開啟的,其他版本都是默認關閉的。
2、帶寬和負載占用:
balancer再對chunk遷移過程中,會造成帶寬和負載方面的開銷。為瞭減輕這些影響,平衡器做瞭如下的工作:
a、一次遷移隻能遷一個chunk,
b、一個shard同一時間隻能執行一個遷移任務
c、從MongoDB3.4開始,引入瞭並行的chunk遷移,對於一個有n個shard的集群,每次最多並行遷移n/2(向下取整)個數據塊
d、隻有當chunk數量最多的shard和chunk數量最少的shard的差異達到閾值的時候,才開始遷移chunk
e、支持用戶設置balancer的窗口時間,在業務低峰窗口時間內進行chunk的遷移工作,從而最大程度減輕對業務的影響。
03 設置balancer的執行時間窗口
1、通過mongo shell連接到mongos上
2、切換到config數據庫
use config
3、確保當前balancer是開啟的
sh.getBalancerState() 返回true
4、設置窗口時間
db.settings.update( { _id: "balancer" }, { $set: { activeWindow : { start : "<start-time>", stop : "<stop-time>" } } }, { upsert: true } )
其中,start-time和stop-time的取值如下:
- For HH values, use hour values ranging from 00 – 23.
- For MM value, use minute values ranging from 00 – 59.
MongoDb會以config數據庫的primary節點的時間為參考,開始執行相關chunk的搬遷操作。
要確保設置的時間范圍內,所有的chunk能夠搬遷完畢,否則會出現數據庫搬遷過後,依舊不均衡的現象。
移除chunk搬遷時間窗口的命令如下:
use config db.settings.update({ _id : "balancer" }, { $unset : { activeWindow : true } })
04 備份和balancer
MongoDB中,不要在備份的時候啟用balancer,否則,備份的數據將會不一致。通常情況下,備份的時間窗口要和balancer的時間窗口錯開,如果balancer沒有設置時間窗口,則在備份的時候,關閉balancer
時間關系,就先到這裡吧,其他內容後面再說
以上就是MongoDB balancer的使用詳解的詳細內容,更多關於MongoDB balancer的使用的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- 詳解MongoDB范圍片鍵和哈希片鍵
- mongos崩潰後無法重啟問題的解決方法
- MongoDB卸載安裝的詳細安裝教程
- MongoDB 主分片(primary shard)相關總結
- postgresql無則插入,有則更新問題