Balancer

Disk Space Balancer

Disk Space Balancer是以Container為最小單位移動到各個Storage Pool(SP)達到平衡Cluster Disk 使用空間,因此在規劃叢集時Storage Pool 建議保持平衡。Disk Space Balancer在預設的情況下會每兩分鐘檢查一次,並根據每個Storage Pool使用率分配到不同的Bin中,在Bin分為儲存率較低與儲存率較高。

Disk Space Balancer會根據以下這兩個參數來作為資料搬移的依據。

Bin分組依據

搬移Container時選擇SP依據與限制。

範例:


(Storage Pool1) Disk 1TB * 3  (Utilization Level of a SP) => 0.33 = 1TB   / 3TB 
(Storage Pool2) Disk 1TB * 3  (Utilization Level of a SP) => 0.66 = 2TB   / 3TB
(Storage Pool3) Disk 1TB * 3  (Utilization Level of a SP) => 0.66 = 2TB   / 3TB
(Storage Pool4) Disk 1TB * 3  (Utilization Level of a SP) => 0.9  = 2.7TB / 3TB
(Storage Pool5) Disk 1TB * 3  (Utilization Level of a SP) => 0.8  = 2.4TB / 3TB
(Storage Pool6) Disk 1TB * 3  (Utilization Level of a SP) => 0.8  = 2.4TB / 3TB

Cluster Average => 0.69 = 12.5TB / 18TB 


Bin

Below Average => Storage Pool 1
Average       => Storage Pool 2-3
Above Average => Storage Pool 5-6
Overused      => Storage Pool 4


階段一:

'Overused' 與 'Above Average' 的Storage Pool 平衡

Storage Pool 4,5,6 平衡
(Storage Pool4) Disk 1TB * 3  (Utilization Level of a SP) => 0.83  = 2.5TB / 3TB
(Storage Pool5) Disk 1TB * 3  (Utilization Level of a SP) => 0.83  = 2.5TB / 3TB
(Storage Pool6) Disk 1TB * 3  (Utilization Level of a SP) => 0.83  = 2.5TB / 3TB

階段二:

'Below Average' 與 'Average' 的Storage Pool 平衡

Storage Pool 1,2,3 平衡
(Storage Pool1) Disk 1TB * 3  (Utilization Level of a SP) => 0.55 = 1.66TB / 3TB
(Storage Pool2) Disk 1TB * 3  (Utilization Level of a SP) => 0.55 = 1.66TB / 3TB
(Storage Pool3) Disk 1TB * 3  (Utilization Level of a SP) => 0.55 = 1.66TB / 3TB

階段三:

所有節點Storage Pool 1-6 平衡

(Storage Pool1) Disk 1TB * 3  (Utilization Level of a SP) => 0.694  = 2.08TB / 3TB
(Storage Pool2) Disk 1TB * 3  (Utilization Level of a SP) => 0.694  = 2.08TB / 3TB
(Storage Pool3) Disk 1TB * 3  (Utilization Level of a SP) => 0.694  = 2.08TB / 3TB
(Storage Pool4) Disk 1TB * 3  (Utilization Level of a SP) => 0.694  = 2.08TB / 3TB
(Storage Pool5) Disk 1TB * 3  (Utilization Level of a SP) => 0.694  = 2.08TB / 3TB
(Storage Pool6) Disk 1TB * 3  (Utilization Level of a SP) => 0.694  = 2.08TB / 3TB


如何配置

使用 MCS 配置 Disk Balancer

Admin > Clusters Settings > Balancer

參數說明:

Enabled:關閉與開啟 Disk Balancer

Disk Balancer Preset:

Disk Balancer Preset:
    Moderate (Default)
	Threshold — 70%
	Concurrent Disk Rebalancer — 10%
    Rapid
	Threshold — 50%
	Concurrent Disk Rebalancer — 5%
    Relaxed
	Threshold — 90%
	Concurrent Disk Rebalancer — 25%

Threshold:當 SP 使用率大於70%(預設值)開始搬移資料。

Concurrent Disk Rebalancer: 為了維持Cluster的效能與服務品質,因此僅會使用Cluster 10% 的 Node 數量資源來搬移資料。

MapR CLI:

開啟與關閉 Disk Balancer

maprcli config save -values {cldb.disk.balancer.enable:"1"}

Container 移出SP 的閾值

maprcli config save -values {cldb.balancer.disk.threshold.percentage:"70"}

限制 Container 搬移的次數最少會有 1

maprcli config save -values {cldb.balancer.disk.max.switches.in.nodes.percentage:"10"}

等待平衡時間 預設1800秒

maprcli config save {"cldb.balancer.startup.interval.sec":"3600"} 

每次運行平衡後可配置停止時間 預設120秒

maprcli config save {"cldb.balancer.disk.sleep.interval.sec":"300"}

防止Volume 不平衡,例如該Volume檔案存放不多,可能僅只存在一個 SP 造成不平衡。

maprcli config save -values {"prevent.volume.skew.by.diskbalancer":"true"}

調整Bin 大小

dbal.above.avg.bin.size
dbal.avg.bin.size
dbal.below.avg.bin.size
dbal.overused.bin.size
maprcli config save -values {"dbal.below.avg.bin.size":"10"}

設定Overused Threshold

maprcli config save -values {"cldb.balancer.disk.overused.threshold":"95"}

設定’Below Average’ 與 ‘Average’ 的Storage Pool 平衡時間

maprcli config save -values {"dbal.below.avg.bins.balancing.frequency":"360"}

讀取 Balancer 狀態

# maprcli dump balancerinfo
usedMB  fsid                 spid                              percentage  outTransitMB  inTransitMB  capacityMB
209     5567847133641152120  01f8625ba1d15db7004e52b9570a8ff3  1           0             0            15200
209     1009596296559861611  816709672a690c96004e52b95f09b58d  1           0             0            15200
# maprcli dump balancerinfo -json
        ....
        {
        "containerid":7840,
        "sizeMB":15634,
        "From fsid":8081858704500413174,
        "From IP:Port":"10.50.60.64:5660-",
        "From SP":"9e649bf0ac6fb9f7004fa19d200abcde",
        "To fsid":3770844641152008527,
        "To IP:Port":"10.50.60.73:5660-",
        "To SP":"fefcc342475f0286004fad963f0fghij"
        }

查看移動數量與大小

# maprcli dump balancermetrics -json
{
  "timestamp":1337770325979,
  "status":"OK",
  "total":1,
  "data":[
    {
      "numContainersMoved":10090,
      "numMBMoved":3147147,
      "timeOfLastMove": "Wed May 23 03:51:44 PDT 2012"
    }
  ]
}

Balancer中可調整參數

[root@datafabric01 ~]# maprcli config load -json | grep balancer
			"cldb.balancer.disk.deltaToRepopulateStoragePoolsBins":"5",
			"cldb.balancer.disk.deltatorepopulatestoragepoolsbins":"5",
			"cldb.balancer.disk.max.switches.in.nodes.percentage":"10",
			"cldb.balancer.disk.overused.threshold":"90",
			"cldb.balancer.disk.sleep.interval.sec":"120",
			"cldb.balancer.disk.threshold.percentage":"70",
			"cldb.balancer.role.max.switches.in.nodes.percentage":"10",
			"cldb.balancer.role.paused":"1",
			"cldb.balancer.role.skip.container.active.sec":"600",
			"cldb.balancer.role.sleep.interval.sec":"900",
			"cldb.balancer.startup.interval.sec":"1800",
			"cldb.disk.balancer.enable":"0",
			"cldb.role.balancer.logging.on":"0",
			"cldb.role.balancer.replicascount.tolerance":"1",
			"cldb.role.balancer.replicassize.tolerance":"15",
			"cldb.role.balancer.strategy":"BySize",
			"prevent.volume.skew.by.diskbalancer":"0",