0%

HBase 多租户隔离技术

之前在看 HBase 的时候,还真没注意过 HBase 居然也有多租户的实现方案,而且还是自带的。今天也是在看 58技术的 公众号的时候发现的。这里呢,可以给大家介绍下,HBase里面的多租户的实现。

说明

首先我们先启动我们的集群环境,目前我的集群环境的组件如下:

  • Hadoop 2.7.2
  • Zookeeper 3.4.10
  • HBase 1.1.2

HBase 这边的实现多租户一般是从三个角度来进行:

  • 资源限制
  • 资源调度
  • 资源隔离

都是很好理解的:
资源限制: 针对用户 / namespace / 以及表的QPS / 请求大小等进行限制;
资源调度: 主要针对任务进行优先级调度,通常会优先调度实时交互而且小的任务,对于那种批次任务,就优先级相对比较低;
资源隔离: 这就是将不同表通过物理隔离的方式分布到不同的 RegionServer 。

但是本文自然不会是说从这三个角度去说的,这样就太不是我风格了。

NameSpace

namespce 就是我们的工作区间,这就是一种很简单的隔离,创建一个 namespace 是一个很轻量的操作:

1
create_namespace 'tenant_namespace'

这样,一个 namespace 就好了。 在HBase 中,如果我们创建表不指定一个 namespace 的话,会将表默认创建在 default 下面。不同类型的表在不同的 namespace 就是一种很简单的资源隔离。

ACL

这是 HBase 中的权限控制,可以设置限制不同用户对不同资源的访问。关于权限这一块,我们需要知道的两个概念:

  • User: 这里的 User 分为 普通的 user 和 super user
  • Scope: 这个就是集群里面的资源的粒度

这里面的权限一般分为五种:

  • Grant: 添加权限
  • Revoke: 删除权限
  • Delete Namespace: 删除 namespace 权限
  • Delete Table: 删除 table 的全部权限
  • Reload: 重新获取全部的 Permission

Quotas

这是HBase中对资源的限制的组件,去限制各个资源的大小以及访问速度,我们需要开启这个服务:

1
2
3
4
<property>
     <name>hbase.quota.enabled</name>
     <value>true</value>
   </property>

关于 Quotas 的使用:

1
set_quota TYPE => THROTTLE, THROTTLE_TYPE => READ, USER => 'u1', TABLE => 't2', LIMIT => '10req/sec'
  • Quotas分别支持表级别以及用户级别资源限制,或者同时支持表级别和用户级别
  • THROTTLE_TYPE可以取值READ / WRITE,分别对随机读和随机写进行限制
  • Limit 表示限制。一般这个LIMIT 可以从两个维度来对资源进行限制,分别为: req/secsize/time 。前者表示的是单位时间内的请求,后者表示的是单位时间内的数据量。后者的 time 可以是 sec | min | hour | day, size 的单位是 B | K | M | G | T | P.

常用的 Quotas 的语句:

1
set_quota TYPE => THROTTLE, TABLE => 't1', LIMIT => '1000req/sec'
1
set_quota TYPE => THROTTLE, THROTTLE_TYPE => WRITE, USER => 'u1', LIMIT => '10M/sec'

注意点

  • set_quota 针对单个的 RegionServer ,目前笔者是知道不支持笔者当前使用的集群环境,笔者没有测试在 高版本环境中这个集群环境是否支持;
  • set_quota 指令执行后不是立即生效,需要静候一段时间,默认是 5 min ,可以根据实际情况进行修改:
    1
    2
    3
    4
    <property>
         <name>hbase.quota.refresh.period</name>
         <value>60000</value>
       </property>
  • list_quotas 可以查看当前的执行的 set_quota 指令

调度

虽然说,HBase 在0.99 版本之后,将默认的 FIFO 调度算法换成了 Deadline 调度算法。这个新的算法的目标就一个,谁急谁的优先级就高。比如说实时的交互,他的优先级就会相对与离线的交互高。我们要做一点就是实现读写的 IO 分离,以及 Scan 请求的分离。

在默认的场景下,HBase只提供一个队列,所有的请求就相当于 FIFO 了,所以这里我们需要自己设置参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 <property>
     <name>hbase.ipc.server.callqueue.read.ratio</name>
     <value>0.6</value>
<description>设置读写队列的比重</description>
   </property>
<property>
     <name>hbase.ipc.server.callqueue.scan.ratio</name>
     <value>0.2</value>
<description>设置 get / scan 的比重</description>
   </property>
<property>
<name>hbase.client.scanner.caching</name>
<value>2048</value>
</property>

资源隔离

简单的理解就是,大家一起租一间房,但是房间都是拿隔板隔开的,互不打扰,这就相当于大家都有自己的房。

在一个HBase的集群环境下,我们将不同的租户进行资源隔离,这样,相当于每个租户都有一套HBase的集群环境。RegionServer Group 就是这么设计的。

RegionServer Group

通过对 RegionServer 进行分组,每个组内的可以根据实际的业务需要挂载不同的表,当组内的表发生变化的时候,不是影响到其他的组。
regionserver-group

引入

首先就是配置,在HMaster 节点下添加,在重启我们的HBase服务:

1
2
3
4
5
6
7
8
9
<property>
<name>hbase.coprocessor.master.classes</name>
<value>org.apache.hadoop.hbase.rsgroup.RSGroupAdminEndpoint</value>
</property>

<property>
<name>hbase.master.loadbalancer.class</name>
<value>org.apache.hadoop.hbase.rsgroup.RSGroupBasedLoadBalancer</value>
</property>

使用

Group 引入之后,我们需要去使用它,来看这个具体的使用:

list_rsgroups

描述: 列出当前的 RegionServer Group,允许使用正则去过滤

1
2
3
list_rsgroups

list_rsgroups 'test.*'

get_rsgroup

描述: 获取某个 Group 的信息

1
2
# default 是默认的 Group
get_rsgroup 'default'

add_rsgroup

描述: 添加一个 Group

1
add_rsgroup 'test_group'

后续的操作大家直接参考这篇文章: HBase 多租户隔离技术:RegionServer Group 介绍及实战

这是打赏的地方...
---------Thanks for your attention---------