1.概述

  在HBase-1.1.0之前,HBase集群中资源都是全量的。用户、表这些都是没有限制的,看似完美实则隐患较大。今天,笔者就给大家剖析一下HBase的流量限制和表的负载均衡。

2.内容

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

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

  • 资源限制:针对用户、命名空间及表的请求大小和QPS进行限制。
  • 资源隔离:将不同表中的数据通过物理隔离,均衡到不同的RegionServer上。

3.资源限制

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

  • 版本必须在1.1.0以上,或者在低版本中打上了HBase对应的Patch(HBASE-11598
  • HBase的资源限制开关默认是关闭的,需要在HBase的配置文件中进行开启。添加内容如下所示:
# 编辑HBase配置文件
vi $HBASE_HONE/conf/hbase-site.xml # 添加如下内容
<property>
<name>hbase.quota.enabled</name>
<value>true</value>
</property> # 退出编辑并保存

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

3.1 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

  从操作的命令中可以看出,HBase限制流量支持表和用户。可以通过THROTTLE_TYPE来控制READ(读)、WRITE(写)操作,这类操作在HBase中是随机进行限制的。而LIMIT关键字,可以从两个维度进行资源限制,分别是req/time和size/time。

  • req/time:这种表示限制单位时间内的请求次数,time可以是秒、分、时、天,req表示次数。
  • size/time:这种表示单位时间内请求数据的量,time可以是秒、分、时、天,size可以时B (bytes), K (kilobytes), M (megabytes), G (gigabytes), T (terabytes), P (petabytes)。

  LIMIT限制默认大小是:10req/day 或 100P/hour。对于命令set_quota来说,执行这条命令仅仅是限制单个RegionServer上的流量,并不是整个集群的限制总量(集群限制总量=每个RegionServer的限制量*RegionNum)。另外,执行set_quota命令后,默认是需要等待300000秒(5分钟)才会生效。如果觉得时间太长,可以将生效时间缩短,通过hbase-site.xml文件中的参数hbase.quota.refresh.period来设置时间,比如:

# 一分钟后生效
hbase.quota.refresh.period=

3.2 限制命名空间中的表个数

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

# 创建一个命令空间最大包含5个表
hbase> create_namespace 'ns1', {'hbase.namespace.quota.maxtables'=>''} # 修改一个已存在的命令空间所允许的表数量大小为8个
hbase> alter_namespace 'ns2', {METHOD => 'set', 'hbase.namespace.quota.maxtables'=>''} # 显示命令空间下的所有详情
hbase> describe_namespace 'ns2' # 删除命令空间中表个数的限制
hbase> alter_namespace 'ns2', {METHOD => 'unset', NAME=>'hbase.namespace.quota.maxtables'}

3.3 限制命名空间的Region

  在创建命名空间时 ,可以限制Region的个数。在创建之后也可以通过命令来修改个数的上限值。具体操作如下所示:

# 创建一个命名空间最大包含10个Region
hbase> create_namespace 'ns1', {'hbase.namespace.quota.maxregions'=>'' # 显示命令空间中详情
hbase> describe_namespace 'ns1' # 修改命名空间中最大Region个数为20个
hbase> alter_namespace 'ns2', {METHOD => 'set', 'hbase.namespace.quota.maxregions'=>''} # 删除命名空间中Region个数的限制
hbase> alter_namespace 'ns2', {METHOD => 'unset', NAME=> 'hbase.namespace.quota.maxregions'}

  这里也许有些同学在操作的过程当中遇到过,在请求操作限制阀值时,日志没有打印出错误信息,这是由于默认日志输出时INFO级别,不会打印这类异常,如果要查看,可以通过修改log4j的日志级别为DEBUG,这样就可以查看到对应的异常信息了。

4.资源隔离

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

# 停止自动均衡
balance_switch false # 开启自动均衡
balance_switch true

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

# move手动操作语法
move [region id] [ServerName]

  如下图所示:

  从图中一个Table Region来说,”t2,,1510401809742.bd015fc10e75b70a52adc0c32a2321c2.“其中region id为”bd015fc10e75b70a52adc0c32a2321c2“。我们可以在HBase集群客户端执行以下命令来手动指定region。命令如下所示:

# 将该Region(dn3)移动到Region(dn1)
echo "move 'bd015fc10e75b70a52adc0c32a2321c2','dn1,16020,1510401268652'"|hbase shell

  在往HBase表中写数据的时候,默认是往一个Region中写数据,当数据量很大时,才会自动拆分成多个Region,拆分的规则和RowKey设计有关。为了防止出现这种情况,我们可以在创建表的时候进行预分区操作。命令如下所示:

# 创建表的预分区(6个Region),RegionTotals = SPLITS.length + 1
create 't2', 'cf', SPLITS => ['','','','','']

  这样我们可以拆分成6个Region,这里也许有同学要问,为什么是6个Region。其实,从上图中就可以看出,表分区中第一个Region是没有StartKey,最后一个Region是没有EndKey的。为什么会出现这种情况,下面就给大家来剖析这个原因。如下图所示:

  从图中可知,在第一个Region中只有EndKey,没有StartKey。第一个Region中的EndKey(0001),就是第二个Region的StartKey,以此类推,到最后一个Region就只有StartKey(0005)了。这就是为什么第一个Region没有StartKey,最后一个Region没有EndKey的原因。

  其实,我们在使用HBase的Java API获取Region的StartKey和EndKey的时候,有时会出现Null,也就是这个原因。

5.总结

  在使用Quota命令进行限流时,需要确保hbase-site.xml文件中的限流属性开启。另外,在对表做手动均衡操作时,使用move命令即可。HBase是有自动均衡的策略的,均衡的Region取决于设计分割的Key,Key的产生又和HBase中中Rowkey的设计息息相关。所以,HBase中表的RowKey设计的是否优秀,决定了Region均衡时,分割Key的选取。

6.结束语

  这篇博客就和大家分享到这里,如果大家在研究学习的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉。

HBase流量限制和表负载均衡剖析的更多相关文章

  1. Istio流量治理原理之负载均衡

    流量治理是一个非常宽泛的话题,例如: ● 动态修改服务间访问的负载均衡策略,比如根据某个请求特征做会话保持: ● 同一个服务有两个版本在线,将一部分流量切到某个版本上: ● 对服务进行保护,例如限制并 ...

  2. 剖析HBase负载均衡和性能指标

    1.概述 在分布式系统中,负载均衡是一个非常重要的功能,在HBase中通过Region的数量来实现负载均衡,HBase中可以通过hbase.master.loadbalancer.class来实现自定 ...

  3. 深度剖析HBase负载均衡和性能指标

    深度剖析HBase负载均衡和性能指标 在分布式系统中,负载均衡是一个非常重要的功能,HBase通过Region的数量实现负载均衡,即通过hbase.master.loadbalancer.class实 ...

  4. MGW——美团点评高性能四层负载均衡

    转自美团点评技术博客:https://tech.meituan.com/MGW.html 前言 在高速发展的移动互联网时代,负载均衡有着举足轻重的地位,它是应用流量的入口,对应用的可靠性和性能起着决定 ...

  5. 负载均衡DNS和反向代理优缺点

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

  6. 【系统架构】亿级Web系统搭建(1):Web负载均衡

    当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要通过搭建不同的服务 ...

  7. 【转】Nginx学习---负载均衡的原理、分类、实现架构,以及使用场景

    [原文]https://www.toutiao.com/i6593604356799463944/ [原文]https://www.toutiao.com/i6592741060194075143/ ...

  8. 亿级Web系统搭建 Web负载均衡的几种实现方式(阿里)

    我还写了两篇详细的 参考:六大Web负载均衡原理与实现 参考:LVS(Linus Virtual Server):三种IP负载均衡方式比较+另三种Web负载均衡方式 其中LVS.HAProxy可以工作 ...

  9. 基于Docker + Consul + Nginx + Consul-Template的服务负载均衡实现(转)

    转:https://www.jianshu.com/p/fa41434d444a 前言 上一篇文章使用 Consul 和 Registrator 在 docker 的容器环境中搭建了服务注册和发现集群 ...

随机推荐

  1. hdu2157矩阵快速幂

    How many ways?? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. 使用wsimport和JAX-WS调用Web Service接口

    本文简单举例说明如何使用wsimport工具和JAX-WS API调用Web Service接口.此方法的优点:使用JDK自带的工具和API接口,无需依赖第三方库. JDK版本:1.8.0_141开发 ...

  3. SQLServer中SQL语句与可执行二进制语句

    SQLServer可以执行正常SQL语句也可以执行被转换的二进制语句,一般会用此方法进行数据库注入操作,骗过基本的字符过滤 --将二进制格式转为普通SQL语句 ) = 0x53454C45435420 ...

  4. samba的安装和配置

    samba是Linux系统上的一种文件共享协议,可以实现Windows系统访问Linux系统上的共享资源,现在介绍一下如何在Ubuntu 14.04上安装和配置samba 实验环境 Ubuntu 14 ...

  5. SqlServer批量备份多个数据库且删除3天前的备份

    /******************************************* * 批量备份数据库且删除3天前的备份 ************************************ ...

  6. 阿里云AliYun表格存储(Table Store)相关案例

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. Mysql的二进制安装和基础入门操作

    前言:Mysql数据库,知识非常的多,要想学精学通这块知识,估计也要花费和学linux一样的精力和时间.小编也是只会些毛皮,给大家分享一下~ 一.MySQL安装 (1)安装方式: 1 .程序包yum安 ...

  8. Echarts数据可视化series-pie饼图,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  9. 部署LAMP+NFS实现双Web服务器负载均衡

    一.需求分析 1.前端需支持更大的访问量,单台Web服务器已无法满足需求了,则需扩容Web服务器: 2.虽然动态内容可交由后端的PHP服务器执行,但静态页面还需要Web服务器自己解析,那是否意味着多台 ...

  10. 组件 layui 常用控件输入框

    一.普通输入框 input <div class="layui-form-item"> <label class="layui-form-label&q ...