本文主要介绍了如何实现多租户,具有一定的参考价值。有兴趣的朋友可以参考一下。希望大家看完这篇文章后收获多多。让边肖带你去了解一下。
多租户技术,参考维基百科的定义,是讨论和实现如何在多用户环境下共享同一个系统或程序,同时仍然保证用户之间的数据隔离。随着云计算时代的到来,多租户对于云上服务变得越来越重要。因此,HBase还具有许多多租户相关的功能,为多个用户共享同一个HBase集群提供了资源隔离的能力。本文将从命名空间ACL、配额和RSGroup三个方面进行介绍。
在NamespaceACLHBase中,创建一个名称空间是一个非常轻量级的操作,在不同的名称空间中隔离不同业务的表是最简单的资源隔离方法。同时,ACL、配额、rsgroup等常见的资源隔离方式都支持在命名空间中设置。
ACL,访问控制列表的全称,用于限制不同用户对不同资源的操作或访问权限。
需要添加以下配置才能使用ACL:
1、ACL的几个概念
用户分为普通用户和超级用户。用户包括启动HBase服务的用户和由hbase.superuser配置的用户,可以管理集群。普通用户需要授权才能访问或操作HBase。范围可以理解为资源的粒度。
糖化血红蛋白酶的各种操作所需的行动可在糖化血红蛋白酶的官方文件中查看:http://hbase.apache.org/book.html#appendix_acl_matrix.
根据用户的访问或操作需求,在合理的范围内设置合理的动作,是实现用户权限控制的最佳方式。
通过2、设置或取消权限在HBase外壳中或通过调用HBase应用编程接口来设置或取消权限。外壳中的操作如下:
要设置命名空间的权限,前缀@是必需的:
为单元格设置权限:
3.权限存储在Hbase :的ACL表中,rowkey根据作用域计算。Acl表结构如下:
单元格权限使用HFile v3的标签存储。
4、鉴定权限
section>
鉴定权限是指判断某个用户是否拥有某个操作的权限。这个过程是在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实现权限的同步,需要首先将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用于限制各个资源的数据量的大小及访问速度。
需要如下配置开启HBase的quota功能:
HBase中关于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用于限制资源的数据量大小,配置在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
配置throttle limit为soft limit,也就是在集群资源富余的情况下,允许超发,使用如下命令打开或关闭超发:
注意,超发是指允许用户在RS的quota有富余的情况下,允许请求超出配置的user/namespace/table的quota,因此,必须首先设置RS的quota,才能打开超发功能。RS的quota推荐设置的时间单位为秒,因为使用其他时间单位的话,一旦RS的quota被其它用户的请求先消耗的话,恢复quota需要较长的时间,可能会影响后续的请求,即使这些后来的请求并没有超出其配置的user/namespace/table 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分为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,是把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如何实现多租户”这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/138998.html