一文讀懂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:他們團隊還在招人哦,戳招募令|尋找優秀工程師瞭解詳情。

本文首發於公衆號「小米雲技術」,點擊查看原文

相關文章
相關標籤/搜索