文章目录
  1. Hbase源码11_负载均衡
    1. 1. 简介
    2. 2. 分析
      1. 2.1 生成RegionPlan
      2. 2.2 执行生成的计划
    3. 3. 总结

[TOC]

Hbase源码11_负载均衡

1. 简介

HBase负载均衡是指在某个RegionServer发生过载(region的数量过多)的时候,需要进行region转移的功能。

在当HMaster启动的过程中,会向zk注册当前为Active的Master。在成为Active的Master之后会有一系列的初始化行为。(HMaster#startActiveMasterManager)。然后具体执行 finishActiveMasterInitialization 方法,里面有一堆初始化的行为,这里就不详细分析。部分截图如下:

2. 分析

这里重点分析下,启动负载均衡调度器(BalancerChore)的过程。

其中有个配置hbase.balancer.period,默认为300000,即5分钟。表示这个调度器每5分钟,调度一次。执行BalancerChore#chore方法。
代码的入口就是HMaster#balance()

如果符合如下条件,则返回false,不进行负载均衡

  • master还在初始化
  • balancer的开关处于关闭的状态
  • 当前有region正处于Transition中,如正在splitting
  • 正在处理挂掉的regionservers
  • 过程中超过设定的周期时间,直接cutoff

2.1 生成RegionPlan

  • 获取所有region相关的信息
1
2
3
4
5
// 优化点: 将 hbase.master.loadbalance.bytable 设置为 true
// flase: TableName为固定值ensemble, 返回所有的合集。按照集群所有region数量进行负载均衡
// true: TableName为具体的表名, 按照表的region数量进行负载均衡
Map<TableName, Map<ServerName, List<HRegionInfo>>> assignmentsByTable =
this.assignmentManager.getRegionStates().getAssignmentsByTable();
  • 生成执行计划
1
2
// balancer 的实现默认配置为 StochasticLoadBalancer
List<RegionPlan> partialPlans = this.balancer.balanceCluster(assignments);

注释说StochasticLoadBalancer是最好的一个balancer,他会根据region负载table负载数据位置Memstore的大小Storefile的大小来计算最佳的执行方案。

  • 执行 needsBalance 方法
1
2
3
4
5
6
7
8
// slop 配置项 hbase.regions.slop , 默认0.2, 表示平均值的上下浮动

// 平均值
float average = cs.getLoadAverage();
// 下限
int floor = (int) Math.floor(average * (1 - slop));
// 上限
int ceiling = (int) Math.ceil(average * (1 + slop));

只要当前集群的 最大和最小负载 都落在 [floor, ceiling]区间, 就不进行负载。

  • 执行 nextAction(cluster);

中间会随机Random来生成下一步操作,所有的实现如下,就不一一分析了(埋个坑):

  • 最后执行 cluster.doAction(action);

返回执行计划。

2.2 执行生成的计划

  • 循环所有的plans,执行如下代码
1
this.assignmentManager.balance(plan);
  • 内部执行的主要代码
1
2
3
4
5
6
synchronized (this.regionPlans) {
// 放到执行计划中
this.regionPlans.put(plan.getRegionName(), plan);
}
// 卸载然后装载
unassign(hri, false, plan.getDestination());

关于assignunassign,这里就不多说了。后面有时间单独分析。

3. 总结

中间执行nextAction的地方,我埋了个坑,其实主要pick算法都在那几个实现类中。

文章目录
  1. Hbase源码11_负载均衡
    1. 1. 简介
    2. 2. 分析
      1. 2.1 生成RegionPlan
      2. 2.2 执行生成的计划
    3. 3. 总结