之前在看 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 | <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/sec
,size/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 | <property> |
资源隔离
简单的理解就是,大家一起租一间房,但是房间都是拿隔板隔开的,互不打扰,这就相当于大家都有自己的房。
在一个HBase的集群环境下,我们将不同的租户进行资源隔离,这样,相当于每个租户都有一套HBase的集群环境。RegionServer Group 就是这么设计的。
RegionServer Group
通过对 RegionServer 进行分组,每个组内的可以根据实际的业务需要挂载不同的表,当组内的表发生变化的时候,不是影响到其他的组。
引入
首先就是配置,在HMaster 节点下添加,在重启我们的HBase服务:
1 | <property> |
使用
Group 引入之后,我们需要去使用它,来看这个具体的使用:
list_rsgroups
描述: 列出当前的 RegionServer Group,允许使用正则去过滤
1 | list_rsgroups |
get_rsgroup
描述: 获取某个 Group 的信息
1 | default 是默认的 Group |
add_rsgroup
描述: 添加一个 Group
1 | add_rsgroup 'test_group' |
后续的操作大家直接参考这篇文章: HBase 多租户隔离技术:RegionServer Group 介绍及实战