HBase的负载均衡策略
负载均衡是分布式系统的必备功能,多个节点组成的分布式系统必须通过负载均衡机制保证各个节点之间负载的均衡性,一旦出现负载非常集中的情况,就很有可能导致对应的部分节点响应变慢,进而拖慢甚至拖垮整个集群。
在实际生产线环境中,负载均衡机制最重要的一个应用场景是系统扩容。分布式系统通过增加节点实现扩展性,但如果说扩容就是增加节点其实并不准确。扩容操作一般分为两个步骤:首先,需要增加节点并让系统感知到节点加入;其次,需要将系统中已有节点负载迁移到新加入节点上。而负载迁移在具体实现上需要借助于负载均衡机制。
负载均衡从字面上来看就是通过一定策略使得整个系统的负载在所有节点上都表现均衡。那首先需要明确系统负载的是什么,应该通过哪些元素来刻画。负载明确之后进一步检查集群的负载现状,如果已经均衡就不必做任何处理,如果不均衡就要制订负载迁移计划。迁移计划制订之后需要根据计划进行具体负载的迁移。
一、负载均衡策略
HBase官方目前支持两种负载均衡策略:SimpleLoadBalancer策略和StochasticLoadBalancer策略。
1.1、SimpleLoadBalancer策略
这种策略能够保证每个RegionServer的Region个数基本相等,假设集群中一共有n个RegionServer,m个Region,那么集群的平均负载就是average=m/n,这种策略能够保证所有RegionServer上的Region个数都在[floor(average),ceil(average)]之间。
因此,SimpleLoadBalancer策略中负载就是Region个数,集群负载迁移计划就是Region从个数较多的RegionServer上迁移到个数较少的RegionServer上。
这种策略简单易懂,但是,考虑的因素太过单一,对于RegionServer上的读写QPS、数据量大小等因素都没有实际考虑,这样就可能出现一种情况:虽然集群中每个RegionServer的Region个数都基本相同,但因为某台RegionServer上的Region全部都是热点数据,导致90%的读写请求还是落在了这台RegionServer上,这样显而易见没有达到负载均衡的目的。
1.2、StochasticLoadBalancer策略
StochasticLoadBalancer策略相比SimpleLoadBalancer策略更复杂,它对于负载的定义不再是Region个数这么简单,而是由个种独立负载加权计算的复合值,这些独立负载包括:
-
Region个数(RegionCountSkewCostFunction)
-
Region负载
-
读请求数(ReadRequestCostFunction)
-
写请求数(WriteRequestCostFunction)
-
StoreFile大小(StoreFileCostFunction)
-
MemStore大小(MemStoreSizeCostFunction)
-
数据本地率(LocalityCostFunction)
-
移动代价(MoveCostFunction)
这些独立负载经过加权计算会得到一个代价值,系统使用这个代价值来评估当前Region分布是否均衡,越均衡代价值越低。HBase通过不断随机挑选迭代来找到一组Region迁移计划,使得代价值最小。
二、负载均衡策略的配置
目前HBase默认的负载均衡策略是StochasticLoadBalancer。我们可以通过配置选择具体的负载均衡策略,如下所示:
1 |
|
三、负载均衡相关的命令
HBase提供了几个与负载均衡相关的Shell命令,它们分别是:
-
balancer_enabled:查询负载均衡功能是否开启
-
balance_switch:开启或关闭负载均衡功能
-
balancer:执行负载均衡
四、参考
[HBase原理与实践](HBase原理与实践 (豆瓣))