您好,登錄后才能下訂單哦!
這篇文章主要介紹了HBase如何實現多租戶,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
多租戶(multi-tenancy technology),參考維基百科定義,它是在探討與實現如何于多用戶的環境下共享相同的系統或程序,并且仍可確保各用戶間數據的隔離性。隨著云計算時代的到來,多租戶對于云上服務顯得更加重要。所以HBase也有許多多租戶相關的功能,其為多個用戶共享同一個HBase集群,提供了資源隔離的能力。本文將從Namespace&ACL,Quota,RSGroup三個方面來進行介紹。
在HBase中,創建namespace是一個很輕量的操作,將不同業務的表隔離在不同的namespace是一個最簡單的資源隔離的方法。同時,ACL、quota、 rsgroup等常用的資源隔離方式都支持設置在namespace上。
ACL,全稱Access Control Lists,用于限制不同的用戶對不同的資源的操作或訪問權限。
使用ACL需要添加如下配置:
User分為普通user和super user。super user包括啟動HBase服務的用戶和hbase.superuser配置的用戶,可以對集群進行管理操作。普通用戶需要授權后,才能訪問或操作HBase。Scope可以理解為資源的粒度。
HBase的各種操作需要的Action可以在HBase的官方文檔中查看:http://hbase.apache.org/book.html#appendix_acl_matrix
結合用戶的訪問或操作需求,將user在合理的scope上設置合理的action,是實現用戶權限控制的最佳方式。
在HBase shell中或調用HBase API,設置或取消權限。shell中的操作如圖:
設置namespace的權限需要加@前綴:
設置Cell的權限:
存儲在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實現權限的同步,需要首先將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如何實現多租戶”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。