写点什么

一文了解华为 FusionInsight MRS HBase 的集群隔离方案 RSGroup

  • 2023-01-05
    贵州
  • 本文字数:5763 字

    阅读完需:约 19 分钟

本文分享自华为云社区《华为FusionInsight MRS HBase的集群隔离——RSGroup》,作者: MissAverage。

一、HBase RSGroup 理解


RSGroup 是集群隔离方案。


HBase 原有的资源隔离:为多个用户共享同一个 HBase 集群,提供了资源隔离的能力。


  1. NameSpace,将不同业务的表隔离在不同的 namespace 是一个最简单的资源隔离的方法。【轻量】

  2. 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


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


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 4
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
一文了解华为FusionInsight MRS HBase的集群隔离方案RSGroup_大数据_华为云开发者联盟_InfoQ写作社区