Apache HBase 负载均衡机制

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

概述

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

管理

Apache HBase 系统负载均衡操作由HMaster来管理,HMaster中涉及负载均衡相关实例及其关系如下:

HBase Balance.png

其中

  • HMaster:HMaster是HBase的主服务,负责RegionServer的负载均衡,Region分布调整等管理;
    • 在HA模式下,包含主用Master和备用Master。
    • 主用Master:负责HBase中RegionServer的管理,包括表的增删改查;RegionServer的负载均衡,Region分布调整;Region分裂后的Region分配;RegionServer失效后的Region迁移等。
    • 备用Master:当主用Master故障时,备用Master将取代主用Master对外提供服务。故障恢复后,原主用Master降为备用。
  • BalancerChore:定期调用HMaster balance操作线程;通过hbase.balancer.period属性来控制负载均衡的时间间隔,默认是5分钟;
  • ClusterStatusChore:定期给LoadBalancer设置集群状态;通过hbase.balancer.statusPeriod属性来控制状态设置的时间间隔,默认是10分钟;
  • LoadBalanceTracker:跟踪ZooKeeper中的负载平衡器状态;
  • LoadBalancer:对Region的放置和移动做出决策;
  • AssignmentManager:分配管理器是Region分配/取消分配操作的协调者;

BalancerChore

定期调用HMaster balance操作线程;通过hbase.balancer.period属性来控制负载均衡的时间间隔,默认是5分钟;

  protected void chore() {
    try {
      master.balance();
    } catch (IOException e) {
      LOG.error("Failed to balance.", e);
    }
  }

定时调用HMaster balance方法。

ClusterStatusChore

定期给LoadBalancer设置集群状态;通过hbase.balancer.statusPeriod属性来控制状态设置的时间间隔,默认是10分钟;

  protected void chore() {
    try {
      balancer.setClusterMetrics(master.getClusterMetricsWithoutCoprocessor());
    } catch (InterruptedIOException e) {
      LOG.warn("Ignoring interruption", e);
    }
  }

定时balancer的setClusterMetrics方法,将集群状态信息传递给balancer。集群状态信息包括:

    /**
     * metrics about hbase version
     */
    HBASE_VERSION,
    /**
     * metrics about cluster id
     */
    CLUSTER_ID,
    /**
     * metrics about balancer is on or not
     */
    BALANCER_ON,
    /**
     * metrics about live region servers
     */
    LIVE_SERVERS,
    /**
     * metrics about dead region servers
     */
    DEAD_SERVERS,
    /**
     * metrics about master name
     */
    MASTER,
    /**
     * metrics about backup masters name
     */
    BACKUP_MASTERS,
    /**
     * metrics about master coprocessors
     */
    MASTER_COPROCESSORS,
    /**
     * metrics about regions in transition
     */
    REGIONS_IN_TRANSITION,
    /**
     * metrics info port
     */
    MASTER_INFO_PORT,
    /**
     * metrics about live region servers name
     */
    SERVERS_NAME,
    /**
     * metrics about table to no of regions status count
     */
    TABLE_TO_REGIONS_COUNT,

HMaster

BalancerChore定期调用HMaster balance操作,触发负载均衡操作是有条件的,如果发生以下情况则不会触发负载均衡操作:

  • loadBalancerTracker未初始化
  • 负载均衡自动操作balance_switch关闭,即:balance_switch false;

  • HBase Master节点正在初始化操作、集群关闭操作、维护模式;

  • HBase集群中正在执行RIT,即Region正在迁移中;

  • HBase集群正在处理离线的RegionServer;

HMaster balance操作整体执行流程如下:

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数量。

StochasticLoadBalancer

这是一个尽力而为的负载平衡器。给定一个成本函数F(C) => x,它将随机尝试将集群突变为Cprime。如果F(Cprime) < F(C),则新的群集状态将成为执行计划。它包括用于计算以下成本的成本函数:

  • Region Load
  • Table Load
  • Data Locality
  • Memstore Sizes
  • Storefile Sizes

每个成本函数都返回一个介于0和1之间的数字;其中0是最低成本的最佳解决方案,1是最高可能的成本和最差解决方案。计算的成本按其各自的乘数按比例缩放:

  • hbase.master.balancer.stochastic.regionLoadCost
  • hbase.master.balancer.stochastic.moveCost
  • hbase.master.balancer.stochastic.tableLoadCost
  • hbase.master.balancer.stochastic.localityCost
  • hbase.master.balancer.stochastic.memstoreSizeCost
  • hbase.master.balancer.stochastic.storefileSizeCost

还可以通过设置以下配置值来添加自定义Cost函数:hbase.master.balancer.stochastic.additionalCostFunctions。所有自定义CostFunction都需要扩展CostFunction。

除了上述配置外,平衡器还可以通过以下配置值调整:

  • hbase.master.balancer.stochastic.maxMoveRegions,它控制在此平衡器的一次调用中可以移动的最大区域数量。
  • hbase.master.balancer.stochastic.stepsPerRegion,它是区域数量乘以的系数,以尝试获取平衡器将突变所有服务器的次数。
  • hbase.master.balancer.stochastic.maxSteps,它控制平衡器尝试和移动所有服务器的最大次数。平衡器将使用此值和上述计算的最小值。

此平衡器最好与hbase.master.loadbalance.bytable设置为false一起使用,以便平衡器获得集群上所有负载的完整视图。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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