Apache HBase 负载均衡机制(三) -- StochasticLoadBalancer详解
概述
在分布式系统中负载均衡是一个非常重要的功能,Apache HBase通常通过Region的数量实现负载均衡,StochasticLoadBalancer将不仅仅考虑Region数量,还会考虑Region负载、表负载、数据本地化、MemStore大小、Storefile大小等。下面将展开分析HBase负载均衡中StochasticLoadBalancer相关内容。
HBase原理
- HBase数据模型
HBase以表的形式存储数据,数据模型如图所示。表中的数据划分为多个Region,并由Master分配给对应的RegionServer进行管理。
每个Region包含了表中一段RowKey区间范围内的数据,HBase的一张数据表开始只包含一个Region,随着表中数据的增多,当一个Region的大小达到容量上限后会分裂成两个Region。可以在创建表时定义Region的RowKey区间,或者在配置文件中定义Region的大小。
图 HBase的数据模型
- RegionServer数据存储
RegionServer主要负责管理由HMaster分配的Region,RegionServer的数据存储结构如图 RegionServer的数据存储结构所示。
图 RegionServer的数据存储结构
图RegionServer的数据存储结构中Region的各部分的说明如表 Region结构说明所示。
-
表 Region结构说明 名称
描述
Store
一个Region由一个或多个Store组成,每个Store对应图 HBase数据模型中的一个Column Family。
MemStore
一个Store包含一个MemStore,MemStore缓存客户端向Region插入的数据,当RegionServer中的MemStore大小达到配置的容量上限时,RegionServer会将MemStore中的数据“flush”到HDFS中。
StoreFile
MemStore的数据flush到HDFS后成为StoreFile,随着数据的插入,一个Store会产生多个StoreFile,当StoreFile的个数达到配置的最大值时,RegionServer会将多个StoreFile合并为一个大的StoreFile。
HFile
HFile定义了StoreFile在文件系统中的存储格式,它是当前HBase系统中StoreFile的具体实现。
HLog
HLog日志保证了当RegionServer故障的情况下用户写入的数据不丢失,RegionServer的多个Region共享一个相同的HLog。
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中实现。
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,它控制平衡器尝试和移动所有服务器的最大次数。平衡器将使用此值和上述计算的最小值。
流程
- 点赞
- 收藏
- 关注作者
评论(0)