Apache HBase 负载均衡机制(二) -- SimpleLoadBalancer详解

举报
milan 发表于 2022/10/31 12:03:57 2022/10/31
【摘要】 在分布式系统中负载均衡是一个非常重要的功能,Apache HBase通常通过Region的数量实现负载均衡,本文将展开分析HBase负载均衡中SimpleLoadBalancer相关内容。

概述

在分布式系统中负载均衡是一个非常重要的功能,Apache HBase通常通过Region的数量实现负载均衡,下面将展开分析HBase负载均衡中SimpleLoadBalancer相关内容。

HBase原理

  • HBase数据模型

    HBase以表的形式存储数据,数据模型如图所示。表中的数据划分为多个Region,并由Master分配给对应的RegionServer进行管理。

    每个Region包含了表中一段RowKey区间范围内的数据,HBase的一张数据表开始只包含一个Region,随着表中数据的增多,当一个Region的大小达到容量上限后会分裂成两个Region。可以在创建表时定义Region的RowKey区间,或者在配置文件中定义Region的大小。


LoadBalancer

对Region的放置和移动做出决策。开源社区存在多种策略可供选择:

BaseLoadBalancer

负载平衡器的基类。它提供了用于以分配Region方法,它不提供实际平衡算法的实现。提供按表级别进行负载平衡和按集群级别进行负载平衡两种方式:

    if (isByTable) {
      List<RegionPlan> result = new ArrayList<>();
      loadOfAllTable.forEach((tableName, loadOfOneTable) -> {
        LOG.info("Start Generate Balance plan for table: " + tableName);
        List<RegionPlan> partialPlans = balanceTable(tableName, loadOfOneTable);
        if (partialPlans != null) {
          result.addAll(partialPlans);
        }
      });
      return result;
    } else {
      LOG.debug("Start Generate Balance plan for cluster.");
      return balanceTable(HConstants.ENSEMBLE_TABLE_NAME, toEnsumbleTableLoad(loadOfAllTable));
    }

具体负载均衡算法在balanceTable中实现。

SimpleLoadBalancer

根据服务器映射到每台服务器负载最高的Region信息,生成全局负载均衡计划。负载平衡原则是所有服务器都会平均分配Region。如果平均值是整数,则所有服务器都将平衡到平均值。否则,所有服务器都将具有最低(平均)或最高(平均)region数量。

该算法目前是这样实现的:

  • 计算均衡值的区间范围,通过总Region个数以及RegionServer节点个数,算出平均Region个数,得到最小值MIN=floor(average)和最大值MAX=ceiling(average)区间范围。
  • 迭代遍历负载较高(Region个数较多)的RegionServer,将该节点上的Region迁移出去,使得Region个数等于最大值MAX;当遇到小于等于最大值MAX的RegionServer时,迭代停止。
  • 迭代遍历负载较低(Region个数较少)的RegionServer,给该节点上分配Region,使得Region个数等于最小值MIN;当遇到大于等于最小值MIN的RegionServer时,迭代停止。分配给负载较低的RegionServer的Region是由上一步负载高的RegionServer迁移出的Region。可能存在迁移出的Region没办法填充每一个负载低的RegionServer达到最小值MIN。定义需要达到最小值MIN的Region数量为needRegions
  • 如果needRegions非零(依然存在不均衡RegionServer),再次迭代负载最多的RegionServer,从每个RegionServer中删除单个Region(这将使得从具有MAX Region变为具有MIN Region)。
  • 如果依然存在待分配的Region,再次迭代负载最少的RegionServer,将填充为最大值MAX
  • 所有的RegionServer所管理的Region都处于最小值MIN=floor(average)和最大值MAX=ceiling(average)区间范围。

示例

当前有一个5台节点规模的HBase集群(包含HMaster和RegionServer),其中2台HMaster和3台RegionServer组成如图所示:

其中RegionServer1 有110个Region,RegionServer2 有100个Region,RegionServer3 有90个Region;

计算集群平均值、最大值、最小值:

    float average = cs.getLoadAverage(); 
    int floor = (int) Math.floor(average * (1 - slop));
    int ceiling = (int) Math.ceil(average * (1 + slop));

其中slop由参数hbase.regions.slop控制,默认为0.2;

    average = 100
    floor = 80
    ceiling = 120

每个RegionServer的Region数都处于【80,120】区间内,不需要进行balance操作。

当前有一个5台节点规模的HBase集群(包含HMaster和RegionServer),其中2台HMaster和3台RegionServer组成如图所示:

其中RegionServer1 有121个Region,RegionServer2 有100个Region,RegionServer3 有79个Region;

计算集群平均值、最大值、最小值:

    float average = cs.getLoadAverage(); 
    int floor = (int) Math.floor(average * (1 - slop));
    int ceiling = (int) Math.ceil(average * (1 + slop));

其中slop由参数hbase.regions.slop控制,默认为0.2;

    average = 100
    MIN = floor = 80
    MAX = ceiling = 120

RegionServer1 121 > MAX (120), RegionServer3 79  < MIN(80) 需要进行balance操作。均衡后效果如下:

总结

SimpleLoadBalancer均衡器实现了基于Region数量的均衡,均衡较快;但是由于仅仅考虑Region数量,未考虑数据本地化、读写负载等因素,容易导致热点和性能下降。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。