一文读懂HBase多租户

本文从三个方面介绍了HBase的多租户实现。
上篇文章回顾: HDFS短路读详解
多租户(multi-tenancy technology),参考维基百科定义,它是在探讨与实现如何于多用户的环境下共享相同的系统或程序,而且仍可确保各用户间数据的隔离性。随着云计算时代的到来,多租户对于云上服务显得更加剧要。因此HBase也有许多多租户相关的功能,其为多个用户共享同一个HBase集群,提供了资源隔离的能力。本文将从Namespace&ACL,Quota,RSGroup三个方面来进行介绍。

Namespace&ACL

在HBase中,建立namespace是一个很轻量的操做,将不一样业务的表隔离在不一样的namespace是一个最简单的资源隔离的方法。同时,ACL、quota、 rsgroup等经常使用的资源隔离方式都支持设置在namespace上。html

ACL,全称Access Control Lists,用于限制不一样的用户对不一样的资源的操做或访问权限。shell

使用ACL须要添加以下配置:apache

一、ACL的几个概念


User分为普通user和super user。super user包括启动HBase服务的用户和hbase.superuser配置的用户,能够对集群进行管理操做。普通用户须要受权后,才能访问或操做HBase。Scope能够理解为资源的粒度。bash

HBase的各类操做须要的Action能够在HBase的官方文档中查看:http://hbase.apache.org/book.html#appendix_acl_matrixapp

结合用户的访问或操做需求,将user在合理的scope上设置合理的action,是实现用户权限控制的最佳方式。post

二、设置或取消权限

在HBase shell中或调用HBase API,设置或取消权限。shell中的操做如图:
优化

设置namespace的权限须要加@前缀:云计算

设置Cell的权限:spa

三、权限的存储

存储在hbase:acl表中,rowkey是根据scope计算出来的。acl表结构以下表:设计


Cell权限使用tags of HFile v3存储。

四、鉴定权限

鉴定权限是指判断某个用户是否拥有某个操做的权限。这个过程是在AccessController中完成的,AccessController是一个实现了MasterObserver、RegionServerObserver、RegionObserver等的coprocessor,在master、regionserver、region等操做的hook中检查权限。因为每台RS上都维护了完整的PermissionCache,检查PermissionCache中是否包含了所需的权限,若是权限不足,则抛出AccessDeniedException。

五、添加/删除权限

添加/删除授予的过程以下图所示:

(1)client向有acl region的region server发出grant或revoke请求;

(2)收到请求的region server,将新的权限put或者delete到acl表中;

(3)AccessController在region的postPut和postDelete的hook中,若是操做的是acl region,则将更新的权限从acl table中读出,并写入到zk上;

(4)经过zk的监听机制,通知master和regionserver更新PermissionCache,实现权限在master和其余regionserver中的同步。

六、基于Procedure的添加/删除权限

为了使用Procedure实现权限的同步,须要首先将grant/revoke请求发送到master处理, 参考HBASE-21739。而后在添加/删除权限阶段,主要有两个关键的步骤,一是记录权限到acl table中,二是将更新后的权限同步到所有的RegionServer上。设计了UpdatePermissionProcedure来实现这个操做,参考HBASE-22271(目前尚未合并到社区版的master分支)。在UpdatePermissionStorage阶段,更新acl表及zk,master上的PermissionCache,在UpdatePermissionCacheOnRS阶段,发起UpdatePermissionRemoteProcedure,更新RS的PermissionCache。

UpdatePermissionProcedure须要解决五种权限同步的case:

Grant:添加权限

Revoke:删除权限

Delete Namespace:删除namespace的所有权限

Delete Table:删除table的所有权限

Reload:从新获取所有的Permission。

在新的方案中,zk不用于通知RS更新PermissionCache,只用于acl的存储。由于当RS或Master启动时,acl table不必定online,此时,须要从zk上load permission。当acl表中的权限与zk上的权限不一致时,应该以acl表中的权限为准。所以,当master启动且acl table online后,发起类型为Reload的UpdatePermissionProcedure,更新zk上的permission,并更新RS上的PermissionCache。

Quota&Throttle

因为集群的资源及服务能力是有上限的,Quota用于限制各个资源的数据量的大小及访问速度。

须要以下配置开启HBase的quota功能:

HBase中关于Quota的几个概念及其相互关系以下图所示:

一、Throttle Quota

Throttle限制单位时间内,访问资源的次数或数据量。

  • 支持的时间单位包括sec, min, hour, day。

  • 使用req限制请求的次数;

  • 使用B, K, M, G, T, P限制请求的数据量的大小;

  • 使用CU限制请求的读/写容量单位,一个读/写容量单位是指一次读出/写入数据量小于1KB的请求,若是一个请求读出了2.5K的数据,则须要消耗3个容量单位。能够经过hbase.quota.read.capacity.unit或hbase.quota.write.capacity.unit配置一个容量单位的数据量。

  • Machine scope表明throttle额度配置在单台RS上。Cluster表明throttle配额被集群的所有RS共享。若是不指定QuotaScope的话,默认为Machine。

设置Throttle的shell命令以下:

设置RegionServer的throttle(目前只支持使用all关键字表明所有的RegionServer,不支持对指定的RegionServer设置Quota),通常来讲,RS的quota表明该RS的服务上限,推荐以秒为时间单位设置:

设置Cluster scope的quota:

Cluster scope的quota是如何分配到各个RS上的:

  • 对于table的quota,TableMachineLimit = ClusterLimit / TotalTableRegionNum * MachineTableRegionNum;

  • 对于namespace的quota,NamespaceMachineLimit = ClusterLimit / RsNum,须要注意的是,这里没有考虑RSGroup,若是把namespace隔离到某个RSGroup,分配到RS上的throttle limit是偏小的,后续须要改进这个计算方式。

GlobalBypass在全局范围内,跳过throttle,配置在用户上。

二、Space Quota

Space用于限制资源的数据量大小,配置在namespace或者table上。当数据量达到限额时,执行配置的违反策略,包括:

Disable:disable table/ the tables of namespace

NoInserts:禁止除Delete之外的Mutation操做,容许Compaction

NoWrites:禁止Mutation操做,容许Compaction

NoWritesCompactions:禁止Mutation操做,禁止Compaction

看当前Space quota的快照(这里的快照并非HBase中的快照),而是指当前表的空间大小,配置的limit,触发的策略的状态:

限制namespace的table或region数量:

hbase.namespace.quota.maxtables/hbase.namespace.quota.maxregions复制代码

若是超出限制的话,会抛出QuotaExceededException。

Space quota的实现原理是:

(1)RS周期的把Region size信息发送给master:RegionSizeReportingChoreMaster

(2)统计表的size及触发的策略并存到quota表:QuotaObserverChoreRS

(3)周期的读quota表,执行policy:SpaceQuotaRefresherChore

三、Soft limit

配置throttle limit为soft limit,也就是在集群资源富余的状况下,容许超发,使用以下命令打开或关闭超发:

注意,超发是指容许用户在RS的quota有富余的状况下,容许请求超出配置的user/namespace/table的quota,所以,必须首先设置RS的quota,才能打开超发功能。RS的quota推荐设置的时间单位为秒,由于使用其余时间单位的话,一旦RS的quota被其它用户的请求先消耗的话,恢复quota须要较长的时间,可能会影响后续的请求,即便这些后来的请求并无超出其配置的user/namespace/table quota。

四、Quota存储

quota相关的信息存储在hbase:quota表中。

row key主要有如下几种:

n.namespace:namespace的quota

t.table:table的quota

u.user:user的quota

r.all:RegionServer的quota

exceedThrottleQuota:是否容许超发

Throttle相关的quota存储在q CF中,Space相关的quota存储在u CF中。

Throttle是否打开存储在/hbase/rpc-throttle的zk节点上,值为true或者false。由于打开或关闭Throttle是实时生效的,而其它quota配置是经过RS按期的读quota表,是延迟生效的。

五、Throttle

设置throttle分为2步:

(1)client向master发送set quota请求,master把quota存入hbase:quota表中;

(2)RS每五分钟,从quota表中加载最新的quota值并更新QuotaCache。所以,对于新设置的quota,最多五分钟后生效(能够经过hbase.quota.refresh.period配置时间间隔)。

当读写请求到达RS上时,限流过程以下图所示:


其中,在读数据前,会首先预估本次请求将要消耗的quota数目,目前社区的代码是按照一个get或mutate预计消耗100字节,一个scan预计消耗1000字节,这里应该是能够优化的,能够根据上次请求后读出的数据量来动态的调整预估的字节数。

Throttle limit是设置在某个时间单位上的,会随着时间的推移逐渐恢复,主要有两种恢复方式:

(1)Average Interval Refill(默认):根据当前和上一次的恢复时间,恢复出这段时间内的quota,但最大不能超出quota配置的limit。

好比,配置了100资源/秒,100ms后,恢复出10个资源。2s后,恢复出100资源,而不是200资源。

(2)Fixed Interval Refill:通过固定的时间间隔,恢复出所有quota。

好比,配置了100资源/秒,若是上次quota恢复的时间是10:10:10,100,则下次恢复时间为10:10:11,100,并记录本次恢复时间,若是在10:10:11,099访问,此时可用资源依然为0。

打开或关闭限流:

关闭限流时,配置的throttle将不会进行限流,即便集群开启了quota功能。

RSGroup

RSGroup,是把RS分配到不一样的组中,以后,将namespace或者table分配到某个RSGroup中,从而实现隔离的目的,能够形象的理解为每一个RSGroup组成了一个小集群。

使用RSGroup,须要添加以下配置:

当开启RSGroup后,全部的RS默认在default这个group中。

建立新的group后,必须首先移入RS到这个group中,以后才能把namespace或者table移动到这个group中。

添加新的RSGroup:

先将RS移动到这个group中,再将namespace移动到这个group中:

RSGroup的功能主要在RSGroupAdminEndpoint中实现,它是一个实现了MasterObserver的Endponit,在master操做的hook中,将table的region移动到对应的RSGroup中。

RSGroup的信息存储在hbase:rsgroup表中。同时,RSGroup的信息也在zk中存储,当集群启动时,rsgroup表尚未online时,从zk中读出RSGroup的信息。

综上,就是HBase中多租户相关功能的介绍,但愿你们在生产环境中多多使用,并向社区反馈改进建议,共同推进HBase多租户功能的进一步完善。

关于做者

梅祎,小米最年轻的美女HBase Committer,梅祎所在的HBase生态组,团队技术氛围浓厚,累计培养了9位HBase Committer和2位PMC,还有多位开源项目Contributer。欢迎开源爱好者及HBase爱好者加入咱们一块儿成长。

PS:他们团队还在招人哦,戳招募令|寻找优秀工程师了解详情。

本文首发于公众号“小米云技术”,点击查看原文

相关文章
相关标签/搜索