欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

HBase负载均衡问题分析

程序员文章站 2022-07-07 22:32:32
负载均衡定义 负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。 负载均衡,英文名称为...

负载均衡定义

负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

引入负载均衡

举例子,了解什么是负载均衡。

手机号:130xxx ???????,131xxx, 132xxx, ?133xxx,134xxx等等

往region里面写数据,每一个手机号对应一个用户,一个ID,

那么当针对不同的用户不可能往一个regionserver里面写,这样一台机器,存储量承受不了。而且也无法发挥就集群的作用。

所以,要分散写数据,往不同的region里面写数据,往上百个,千个 写数据, ?可以创建有很多的分区。这样才能分担集群压力

?

但是具体针对某一个用户,假如130,111,112,如果我们分散到几百个regionserver里面,查询用户的时候。就需要打开几百个regionserver,查询效能严重降低。

所以,针对某一个具体的用户要写到一个regionserver中,查询效能升高。

HBase负载均衡问题分析

实现连续读:针对具体的用户,往一个regionserver里面写数据,实现连续读的速度会很快

为什么要负载均衡

负载均衡:就必须有多台服务器,多个regionserver,即实现服务器集群。

极端情况下假如所有的读请求都落在一台RegionServer的某几个Region上,这一方面不能发挥整个集群的并发处理能力,另一方面势必造成此台RegionServer资源严重消耗(比如IO耗尽、handler耗尽等),落在该台RegionServer上的其他业务会因此受到很大的波及。可见,读请求不均衡不仅会造成本身业务性能很差,还会严重影响其他业务。

读写是否均衡

首先我们要明确,负载均衡是根据每个Table来的,在如下几种情况下是不会执行负载均衡的:

1、如果master没有被初始化

2、当前已经有负载均衡方法在跑了

3、当前有region处于splitting状态

4、当前集群中有挂掉的region server

?

优化原理:极端情况下假如所有的读请求都落在一台RegionServer的某几个Region上,这一方面不能发挥整个集群的并发处理能力,另一方面势必造成此台RegionServer资源严重消耗(比如IO耗尽、handler耗尽等),落在该台RegionServer上的其他业务会因此受到很大的波及。可见,读请求不均衡不仅会造成本身业务性能很差,还会严重影响其他业务。当然,写请求不均衡也会造成类似的问题,可见负载不均衡是HBase的大忌。

观察确认:观察所有RegionServer的读请求QPS曲线,确认是否存在读请求不均衡现象

优化建议:RowKey必须进行散列化处理(比如MD5散列),同时建表必须进行预分区处理

?

对于HBase来讲,不同节点(RegionServer)用户请求需要负载均衡技术,其实在HBase很早的版本中已经实现了负载均衡,0.92版本后HBase的负载均衡算法可以通过实现LoadBalancer接口的hbase.master.loadbalancer.class来自定义。HBase通过Region数量实现简单的负载均衡,虽然这种方式比较简单,但官方认为这样的实现是最简洁、高效的,能够满足绝大部分的需求

?

HBase流量限制和表负载均衡

为什么要做流量限制,无限制全量跑不是更好吗?举个例子,比如今天的双十一日,数据流量是非常大的。如果不限制用户和表的流量,某些重要的核心业务,需要在资源有限的情况下优先保证正常运行。如果非核心业务在此期间其QPS一直降不下来,严重消耗系统资源,影响核心业务的正常运作。

针对上述问题,可以采取以下方案来解决:

资源限制:针对用户、命名空间及表的请求大小和QPS进行限制。

资源隔离:将不同表中的数据通过物理隔离,均衡到不同的RegionServer上。

资源限制

 开启HBase资源限制是有条件,其中包含以下两个条件:

版本必须在1.1.0以上,或者在低版本中打上了

HBase对应的Patch:https://issues.apache.org/jira/browse/HBASE-11598

HBase的资源限制开关默认是关闭的,需要在HBase的配置文件中进行开启。添加内容如下所示:

vi $HBASE_HONE/conf/hbase-site.xml

# 添加如下内容

?

???hbase.quota.enabled

???true

?

如果不是在首次启动时配置的,需要额外重启HMaster服务进程才能使之生效。

Quota语句

HBase中限流是通过Quota语句来操作的,限流的方式有两种,一种是针对用户进行限流;另一种是针对表来进行限流。操作命令如下所示:

# 限制用户u1每秒请求10次

hbase> set_quota TYPE => THROTTLE, USER => 'u1', LIMIT => '10req/sec'

?

# 限制用户u1每秒的读请求为10次

hbase> set_quota TYPE => THROTTLE, THROTTLE_TYPE => READ, USER => 'u1', LIMIT => '10req/sec'

?

# 限制用户u1每天的请求量为10M

hbase> set_quota TYPE => THROTTLE, USER => 'u1', LIMIT => '10M/day'

?

# 限制用户u1的写请求量每秒为10M

hbase> set_quota TYPE => THROTTLE, THROTTLE_TYPE => WRITE, USER => 'u1', LIMIT => '10M/sec'

?

# 限制用户u1在操作表t2时,每分钟的请求量为5K

hbase> set_quota TYPE => THROTTLE, USER => 'u1', TABLE => 't2', LIMIT => '5K/min'

?

# 限制用户u1在操作表t2时,每秒的读请求为10次

hbase> set_quota TYPE => THROTTLE, THROTTLE_TYPE => READ, USER => 'u1', TABLE => 't2', LIMIT => '10req/sec'

?

# 删除用户u1在命令空间ns2的请求限制

hbase> set_quota TYPE => THROTTLE, USER => 'u1', NAMESPACE => 'ns2', LIMIT => NONE

?

# 限制在命名空间ns1中每小时的请求为10次

hbase> set_quota TYPE => THROTTLE, NAMESPACE => 'ns1', LIMIT => '10req/hour'

?

# 限制表t1每小时的请求为10T

hbase> set_quota TYPE => THROTTLE, TABLE => 't1', LIMIT => '10T/hour'

?

# 删除用户u1的所有请求限制

hbase> set_quota TYPE => THROTTLE, USER => 'u1', LIMIT => NONE

?

# 显示用户u1在命名空间ns2中的所有限制详情

hbase> list_quotas USER => 'u1, NAMESPACE => 'ns2'

# 显示命令空间ns2的所有限制详情

hbase> list_quotas NAMESPACE => 'ns2'

?

# 显示表t1的所有限制详情

hbase> list_quotas TABLE => 't1'

?

# 显示所有限制详情

hbase> list_quotas

另外,执行set_quota命令后,默认是需要等待300000秒(5分钟)才会生效。如果觉得时间太长,可以将生效时间缩短,通过hbase-site.xml文件中的参数hbase.quota.refresh.period来设置时间,比如:

# 一分钟后生效

hbase.quota.refresh.period=60000

限制命名空间中的表个数

在创建命名空间中的表个数,可以在创建命名空间时指定,也可以在创建之后在此修改表个数,同样也可以删除表限制。通过设置hbase.namespace.quota.maxtables属性值来改变

?限制命名空间的Region

在创建命名空间时 ,可以限制Region的个数。在创建之后也可以通过命令来修改个数的上限值

# 创建一个命名空间最大包含10个Region

hbase> create_namespace 'ns1', {'hbase.namespace.quota.maxregions'=>'10'

# 显示命令空间中详情

hbase> describe_namespace 'ns1'

# 修改命名空间中最大Region个数为20个

hbase> alter_namespace 'ns2', {METHOD => 'set', 'hbase.namespace.quota.maxregions'=>'20'}

# 删除命名空间中Region个数的限制

hbase> alter_namespace 'ns2', {METHOD => 'unset', NAME=> 'hbase.namespace.quota.maxregions'}

资源隔离

在HBase中可以通过资源隔离的方式来间接的限流。将请求均衡到多个RegionServer中去。通过balance_switch命令来实现自动均衡操作

# 查看自动均衡状态

balance_switch status

?

# 停止自动均衡

balance_switch stop

?

# 开启自动均衡

balance_switch start

 在实际业务中,如果HBase某个表的RegionServer全部集中在一个上,这时候可以考虑使用move命令手动均衡操作,具体操作语法如下:

# move手动操作语法

move [region id] [ServerName]

HBase Shell开启或关闭均衡器

HBase有一个特性叫均衡器,默认情况下,均衡器每5分钟执行,通过hbase.balancer.period设置。当均衡器启动时,它将尝试均匀分配region到所有regionserver中。?
启动均衡器后,均衡器首先会确定一个region分配计划用于描述region如何移动,然后通过迭代调用unassign()方法开始移动region。?

??用户可以通过均衡器开关来控制均衡器,使用HBase Shell的balancer_switch或使用balanceSwitch()接口都可以实现。下面通过HBase Shell来尝试开启或关闭均衡器。

HBase负载均衡问题分析

除了使用均衡器,用户也可以手动使用move命令和API显式地将region移动到别的regionserver上,这种操作适合于当用户希望将region移到到指定的regionserver上时。

HBase是有自动均衡的策略的,均衡的Region取决于设计分割的Key,Key的产生又和HBase中中Rowkey的设计息息相关。所以,HBase中表的RowKey设计的是否优秀,决定了Region均衡时,分割Key的选取。