HBase负载均衡问题分析
负载均衡定义
负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
引入负载均衡
举例子,了解什么是负载均衡。
手机号:130xxx ???????,131xxx, 132xxx, ?133xxx,134xxx等等
往region里面写数据,每一个手机号对应一个用户,一个ID,
那么当针对不同的用户不可能往一个regionserver里面写,这样一台机器,存储量承受不了。而且也无法发挥就集群的作用。
所以,要分散写数据,往不同的region里面写数据,往上百个,千个 写数据, ?可以创建有很多的分区。这样才能分担集群压力
?
但是具体针对某一个用户,假如130,111,112,如果我们分散到几百个regionserver里面,查询用户的时候。就需要打开几百个regionserver,查询效能严重降低。
所以,针对某一个具体的用户要写到一个regionserver中,查询效能升高。
实现连续读:针对具体的用户,往一个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
# 添加如下内容
?
???
???
?
如果不是在首次启动时配置的,需要额外重启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来尝试开启或关闭均衡器。
除了使用均衡器,用户也可以手动使用move命令和API显式地将region移动到别的regionserver上,这种操作适合于当用户希望将region移到到指定的regionserver上时。
HBase是有自动均衡的策略的,均衡的Region取决于设计分割的Key,Key的产生又和HBase中中Rowkey的设计息息相关。所以,HBase中表的RowKey设计的是否优秀,决定了Region均衡时,分割Key的选取。
推荐阅读
-
Apache和Nginx负载均衡集群及测试分析
-
dubbo注册部分源码分析、集群策略、负载均衡算法
-
lvs、haproxy、nginx 负载均衡的比较分析
-
lvs、haproxy、nginx 负载均衡的比较分析
-
SpringCloud微服务(二)Fegin负载均衡遇到的问题和解决方案
-
应用负载均衡之LVS(三):使用ipvsadm以及详细分析VS/DR模式
-
HBase负载均衡问题分析
-
SEO收录异常诊断:负载均衡架构导致的SEO问题及解决方案
-
如何解决asp.net负载均衡时Session共享的问题
-
(转+分享)JAVA核心知识点整理,用于面试!!!【三】 ~ Hbase/MongoDB/设计模式/ 负载均衡/ 数据库/