摘要: RSGroup是叢集隔離方案。
本文分享自華為雲社群《華為FusionInsight MRS HBase的叢集隔離——RSGroup》,作者: MissAverage。
一、HBase RSGroup理解
RSGroup是叢集隔離方案。
HBase原有的資源隔離:為多個使用者共享同一個HBase叢集,提供了資源隔離的能力。
- NameSpace,將不同業務的表隔離在不同的namespace是一個最簡單的資源隔離的方法。【輕量】
- ACL(Access Control Lists),用於限制不同的使用者對不同的資源的操作或訪問許可權。
1.1 運維成本與叢集資源利用問題
同一個 HBase 叢集使用的使用者越來越多,不同使用者之間的讀寫或者不同表的 compaction、region splits 操作可能對其他使用者或表產生了影響。將所有業務的表都存放在一個叢集的好處是可以很好的利用整個叢集的資源,只需要一套運維繫統。
如果一個業務或者一個部門使用一個 HBase 叢集,這樣會導致 HBase 叢集的數量越來越多,直接導致了運維成本的增加。而且叢集的分離也會導致資源的浪費,有些叢集資源過剩,有些叢集資源不足,這種情況我們無法充分利用不同叢集的資源。將叢集按照業務或部門分開的好處是可以很好的隔離不同表、不同使用者之間的影響。
1.2 RSGroup方案原理
官方版本整合了yahoo提交的rsgroup隔離方案。
如下圖所示:
在上圖中有兩個rsgroup,具體原理為:
A、將不同的RegionServer分配到不同的rsgroup中
上圖中RegionServer1、RegionServer2、RegionServer3被分配到了Important_group中,RegionServer4、RegionServer5、RegionServer6被分配到了normal_group中。
B、將不同的表分配到不同的group中
上圖中表t1和t2分配到了Important_group,表t3和t4分配到了normal_group。
C、表、regionserver分配到具體的rsgroup後就達到了隔離的效果
做好分配後,以表t1為例,t1的所有region都只會落到Important_group所屬的Regionserver中。此時當normal_group的任何Regionserver異常,都不會引起t1表的異常(datanode異常會有影響,後面有說明)。只有當Important_group所屬的Regionserver異常,並且有t1的region落在該regionserver上才會有影響。表代著業務,你可以將同型別(重要等級)的表放在同一個rsgroup中,這就實現了不同業務的隔離。
對於於重點業務,可以分配更多的regionserver的機器,負載更低;而對於非重點業務,則可以更少的機器承擔負更多的業務。目前datanode已經支援了分級儲存,甚至可以將重點業務使用不同的介質,比如SSD。
總結:RegionServer Group 技術是透過對 RegionServer 進行分組,不同的 RegionServer 分到不同的組。每個組可以按需掛載不同的表,並且當組內的表發生異常後,Region 不會遷移到其他的組。這樣,每個組就相當於一個邏輯上的子叢集,透過這種方式達到資源隔離的效果,降低管理成本,不必為每個業務線單獨搭叢集。
1.3 RSGroup隔離優缺點
優點:
- 管理方便
- 充分利用叢集的資源
- 機器騰挪擴容很方便
- 有利於整個叢集效能的提升
缺點:
- 隔離不徹底,hdfs層還是共用,如果datanode出現異常,還是會影響到多個業務。
1.4 RSGroup issue
http://issues.apache.org/jira/browse/HBASE-6721
RegionServer Group based Assignment
該補丁增加了一個新的實驗模組hbase-rsgroup。它是一個高階特性,可以將regionserver劃分成不同的組,以嚴格隔離,只有足夠成熟的使用者才能使用它,這些使用者必須瞭解其全部含義,並且有足夠管理HBase叢集的背景。
在HBase的多租戶部署中,RegionServer很可能會為不同客戶端應用程式擁有的多個不同表提供Region服務。
能夠對執行的RegionServer的子集進行分組併為其分配特定的表,為客戶端應用程式提供了隔離和資源分配的級別。
提議的實質上是存在一個AssignmentManager,它知道RSGroup,並根據RSGroup向RegionServer分配表。負載平衡也將按組進行
二、RSGroup使用(以FusionInsight 8.0.2 --HBase 核心版本2.2.3為背景)
2.1 RSGroup相關配置
1) hbase.master.loadbalancer.class
【說明】負載均衡發生用來執行region均衡的類。當使用RSGroup時,該值必須是org.apache.hadoop.hbase.rsgroup.RSGroupBasedLoadBalancer,原值需要設定到hbase.rsgroup.grouploadbalancer.class中。
【預設值】org.apache.hadoop.hbase.rsgroup.RSGroupBasedLoadBalancer
<name>hbase.master.loadbalancer.class</name>
<value>org.apache.hadoop.hbase.rsgroup.RSGroupBasedLoadBalancer</value>
在引入RSGroup技術之前,HBase預設使用StochasticLoadBalancer策略(透過hbase.master.loadbalancer.class引數實現,參見HBASE-9555)將表的 Region 移動到 RegionServer裡面去。
這種策略並沒有考慮到RegionServer Group的資訊,所以如果要對RegionServer分組,我們就需要在移動Region的時候考慮到這些資訊。
基於這些資訊,社群開發出能夠識別出RSGroup資訊的 RSGroupBasedLoadBalancer,這個類和上面的StochasticLoadBalancer都是實現了LoadBalancer介面的,詳見 HBASE-6721。
2) hbase.coprocessor.master.classes
【說明】逗號隔開的org.apache.hadoop.hbase.coprocessor.MasterObserver coprocessors列表,在主HMaster中預設載入。對於實現了協處理器的所有方法,本配置列表將被順序呼叫。當實現了自己的MaterObserver時,只要將它加入到HBase的classpath並且類名全稱新增到本配置列表即可。
<name>hbase.coprocessor.master.classes</name> <value>org.apache.hadoop.hbase.hindex.server.master.HIndexMasterCoprocessor,com.huawei.hadoop.hbase.backup.services.RecoveryCoprocessor,org.apache.hadoop.hbase.security.access.ReadOnlyClusterEnabler,org.apache.hadoop.hbase.rsgroup.RSGroupAdminEndpoint </value>
3) hbase.rsgroup.fallback.enable
【說明】當Region所在的RSGroup沒有線上的RegionServer時,是否允許Region在預設的RSGroup或者其他的RSGroup短暫上線。[HBASE-24760]
【預設值】true
【注意】使用該功能時,balancer必須開啟,否則Region可能在錯誤的RSGroup上線。關閉該功能時,會影響滾動重啟失敗。
<name>hbase.rsgroup.fallback.enable</name>
<value>true</value>
4) hbase.rsgroup.grouploadbalancer.class
【說明】負載均衡發生用來執行region均衡的類。當未使用RSGroup時,該引數不生效。
<name>hbase.rsgroup.grouploadbalancer.class</name>
<value>org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer</value>
5) hbase.priority.rsgroup.enabled
【說明】Priority RSGroup功能開關。開啟後,該RSGroup中表的資料副本會按照策略優先存放到Priority RSGroup和default RSGroup中的資料節點。故障恢復時,priority RSGroup的節點會優先處理。
【預設值】false
<name>hbase.priority.rsgroup.enabled</name>
<value>false</value>
2.2. RSGroup相關Shell命令
1) add_rsgroup
建立新的RSGroup。
2) alter_rsgroup_config
更新RSGroup配置。
3) balance_rsgroup
對某個RSGroup進行balance操作。
4) get_rsgroup
獲取RSGroup組資訊,將列舉RSGRoup包含的所有servers和tables。
5) get_server_rsgroup
檢視RSGroup組資訊。
6) get_table_rsgroup
檢視RSGroup組資訊。將列舉RSGRoup包含的所有servers和tables。
7) list_rsgroups
檢視RSGroup組資訊。
8) move_namespaces_rsgroup
移動指定namespace到RSGroup。原namespace下的表可能位於不同的RSGroup,執行該命令時,均一起移動至同一RSGroup。
9) move_servers_namespaces_rsgroup
移動指定namespace及regionserver到RSGroup
10) move_servers_rsgroup
移動RegionServer到指定RSGroup,其上的region將移動到原RSGroup的另一RegionServer上。
11) move_servers_tables_rsgroup
將RegionServers和表從一個RSGroup 移動到另一個 RSGroup。
12) move_tables_rsgroup
將表從一個RSGroup移動另一個RSGroup。將指定的表新增到RSGroup,表的region都會轉移到該RSGroup內的RegionServer上。無法將表移動到無RegionServer存在的RSGroup,將報錯。
13) remove_rsgroup
刪除指定RSGroup。存在table和regionserver的非空RSGroup不可以被remove。
14) remove_servers_rsgroup
從RSGroup中刪除已退服的Region server。 無法對處於Dead/recovering/live狀態的Region server進行該操作。
15) rename_rsgroup
刪除指定RSGroup。
16) show_rsgroup_config
顯示RSGroup配置。
三、RSGroup實現
3.1 Coprocessor相關
擴充套件RSGroup 是Coprocessor的應用場景之一。Coprocessor可以擴充套件HBase介面能力且不影響主流程。如果使用者想實現增刪改查之外其它介面,這些介面可能既不是table的介面,也不是Master的介面,那麼Coprocessor是一個較好的選擇。Coprocessor可以透過封裝服務邏輯的方式,在HBase裡面重新建立一個RPC服務。
Coprocessor分為Observer和Endpoint兩種:
1) Observer協處理器類似於RDBMS中的觸發器,因為它在特定事件(如Get或Put)發生之前或之後執行程式碼。
2) Endpoint協處理器類似於RDBMS中的儲存過程,因為它允許在RegionServer本身而不是在客戶端上對資料執行自定義計算。
3.1.1 RSGroup核心功能模組
RSGroup的核心功能模組有以下幾個:proto檔案,AdminEndpoint,Servicelmpl,Client,Server和BasedLoadBalancer等。AdminEndpoint實現MasterCoprocessor和MasterObserver。Service沒有使用Endpoint來實現,而是自己寫了RSGroupAdminServiceImpl類實現。Client真正的業務邏輯在RsGroupAdminServer和BasedLoadBalancer裡面。
3.2 proto檔案
3.2.1 【hbase-protocol】 RSGroup.proto
定義了RSGroupInfo message。
message RSGroupInfo { required string name = 1; repeated ServerName servers = 4; repeated TableName tables = 3; repeated NameStringPair configuration = 5; }
3.2.2 【hbase-rsgroup】 RSGroupAdmin.proto
定義了多個 message資料結構,以及service RSGroupAdminService。
service RSGroupAdminService {
rpc GetRSGroupInfo(GetRSGroupInfoRequest)
returns (GetRSGroupInfoResponse);
rpc GetRSGroupInfoOfTable(GetRSGroupInfoOfTableRequest)
returns (GetRSGroupInfoOfTableResponse);
rpc GetRSGroupInfoOfServer(GetRSGroupInfoOfServerRequest)
returns (GetRSGroupInfoOfServerResponse);
rpc MoveServers(MoveServersRequest)
returns (MoveServersResponse);
rpc MoveTables(MoveTablesRequest)
returns (MoveTablesResponse);
rpc AddRSGroup(AddRSGroupRequest)
returns (AddRSGroupResponse);
rpc RemoveRSGroup(RemoveRSGroupRequest)
returns (RemoveRSGroupResponse);
rpc BalanceRSGroup(BalanceRSGroupRequest)
returns (BalanceRSGroupResponse);
rpc ListRSGroupInfos(ListRSGroupInfosRequest)
returns (ListRSGroupInfosResponse);
rpc MoveServersAndTables(MoveServersAndTablesRequest)
returns (MoveServersAndTablesResponse);
rpc RemoveServers(RemoveServersRequest)
returns (RemoveServersResponse);
rpc RenameRSGroup(RenameRSGroupRequest)
returns (RenameRSGroupResponse);
rpc UpdateRSGroupConfig(UpdateRSGroupConfigRequest)
returns (UpdateRSGroupConfigResponse);
}
RSGroupAdminService由RSgroupAdminEndpoint.RSGroupServiceImpl類繼承實現,呼叫RSGroupAdminServer進行實際工作,將結果轉換為protocol buffer response;如果發生異常處理異常,然後使用RpcCallback進行response。
3.3 RSGroupAdmin
[hbase-rsgroup] org.apache.hadoop.hbase.rsgroup. RSGroupAdmin
介面,定義了client和server之間的RSGroup使用者API介面。
RSGroupInfo getRSGroupInfo(String groupName) throws IOException; RSGroupInfo getRSGroupInfoOfTable(TableName tableName) throws IOException; void moveServers(Set<Address> servers, String targetGroup) throws IOException; void moveTables(Set<TableName> tables, String targetGroup) throws IOException; void addRSGroup(String groupName) throws IOException; void removeRSGroup(String groupName) throws IOException; boolean balanceRSGroup(String groupName) throws IOException; List<RSGroupInfo> listRSGroups() throws IOException; RSGroupInfo getRSGroupOfServer(Address hostPort) throws IOException; void moveServersAndTables(Set<Address> servers, Set<TableName> tables, String targetGroup) throws IOException; default void removeServers(Set<Address> servers) throws IOException { removeServers(servers, false); } void removeServers(Set<Address> servers, boolean forceRemove) throws IOException; void renameRSGroup(String oldName, String newName) throws IOException; void updateRSGroupConfig(String groupName, Map<String, String> configuration) throws IOException;
3.4 RSGroupAdminClient
[hbase-rsgroup] org.apache.hadoop.hbase.rsgroup. RSGroupAdminClient
實現RSGroupAdmin介面。
3.5 RSGroupAdminServer
[hbase-rsgroup] org.apache.hadoop.hbase.rsgroup. RSGroupAdminServer
實現RSGroupAdmin介面。
3.6 RSGroupProtobufUtil
[hbase-rsgroup] org.apache.hadoop.hbase.rsgroup. RSGroupProtobufUtil
實現了兩個方法分別進行RSGroupProtos.RSGroupInfo和【hbase-common】org.apache.hadoop.hbase.rsgroup. RSGroupInfo的轉換
3.7 RSGroupProtobufUtil
[hbase-rsgroup] org.apache.hadoop.hbase.rsgroup. RSGroupProtobufUtil
實現了兩個方法分別進行RSGroupProtos.RSGroupInfo和【hbase-common】org.apache.hadoop.hbase.rsgroup. RSGroupInfo的轉換。
static RSGroupInfo toGroupInfo(RSGroupProtos.RSGroupInfo proto) static RSGroupProtos.RSGroupInfo toProtoGroupInfo(RSGroupInfo pojo)
其中:
toGroupInfo的呼叫在RSGroupAdminClient和RSGroupInfoManagerImpl中。(除了測試程式碼)
toProtoGroupInfo的呼叫在RSGroupAdminEndpoint.RSGroupAdminServiceImpl中和RSGroupInfoManagerImpl中。
以上,是對HBase叢集隔離方案RSGroup的背景、應用及模組實現介紹說明。
參考
- 一文讀懂HBase多租戶
- RegionServer Group based Assignment