Apache HBase 负载均衡机制
概述
在分布式系统中负载均衡是一个非常重要的功能,Apache HBase通常通过Region的数量实现负载均衡,下面将展开分析HBase负载均衡的相关内容。
管理
Apache HBase 系统负载均衡操作由HMaster来管理,HMaster中涉及负载均衡相关实例及其关系如下:
其中
- 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一起使用,以便平衡器获得集群上所有负载的完整视图。
- 点赞
- 收藏
- 关注作者
评论(0)