HBase负载均衡算法

0.92版本后HBase的均衡算法可以通过实现了LoadBalancer接口的hbase.master.loadbalancer.class来自定义。

2.负载均衡实行条件。

负载均衡以特定时间间隔(hbase.balancer.period 默认是5分钟)执行。

当遇到如下场景时候不进行负载均衡:

1.均衡负载开关balanceSwitch关闭。

2.HMase为完成初始化。

3.RIT中有未处理完的regions。

4.有正在处理的DeadRegionserver.

3.默认负载均衡的具体算法

3.1 将所有RegionServer以负载进行排序,如果负载相同则按照serverName进行排序。

例子: 

RS1 11       RS6 2  
RS2 10       RS5 5  
RS3 9   排序为:   RS3 9  
RS4 10       RS2 10  
RS5 5       RS4 10  
RS6 2       RS1 11  

3.2 通过如下算法计算当前是否需要进行均衡:

// Check if we even need to do any load balancing
float average = (float)numRegions / numServers; // for logging
// HBASE-3681 check sloppiness first
int floor = (int) Math.floor(average * (1 - slop));
int ceiling = (int) Math.ceil(average * (1 + slop));
if (serversByLoad.lastKey().getLoad() <= ceiling &&
  serversByLoad.firstKey().getLoad() >= floor) {
  // Skipped because no server outside (min,max) range
  LOG.info("Skipping load balancing because balanced cluster; " +
    "servers=" + numServers + " " +
    "regions=" + numRegions + " average=" + average + " " +
    "mostloaded=" + serversByLoad.lastKey().getLoad() +
    " leastloaded=" + serversByLoad.firstKey().getLoad());
  return null;
}

根据如上算法在本例中:
      float average = 47/ 6  = 7.8;
      int floor = (int) Math.floor(average * (1- slop)) = 6
      intceiling = (int) Math.ceil(average * (1+ slop)) = 9
      其中slop为hbase.regions.slop 默认为0.2
  可以看出RS6 上只有2个region < floor 所以本例需要进行负载均衡。


  3.3 计算 min 和 max 得到最小负载和最大负载
     
12 int min = numRegions / numServers;
int max = numRegions % numServers == 0 ? min : min + 1;

本例中:
    min = 7 

max = 8


3.4 将大于max负载的RS降低到max负载,移除的Region放入regionsToMove队列待分配。

RS6 2       RS6 2  
RS5 5       RS5 5  
RS3 9   max:8   RS3 8  
RS2 10       RS2 8  
RS4 10       RS4 8  
RS1 11       RS1 8  
           
        regionsToMove  
        RS3 1  
        RS2 2  
        RS4 2  
        RS1 3  

3.5 将小于min负载的RS从regionsToMove队列中取出全部加到min负载

RS6 2       RS6 7  
RS5 5       RS5 7  
RS3 8   min:7   RS3 8  
RS2 8       RS2 8  
RS4 8       RS4 8  
RS1 8       RS1 8  
           
        regionsToMove  
        RS1 1  

3.6 这里分为两种情况:

a.当所有< min负载RS都升到min负载时regionsToMove队列还有剩余region的时候则将遍历min负载的RS起始达到max。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/b401df52fc55a52ea35dc7fc4688924a.html