摘要: RSGroup是集群隔离方案。

本文分享自华为云社区《华为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

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

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

一文了解华为FusionInsight MRS HBase的集群隔离方案RSGroup的更多相关文章

  1. 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解

    引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单 ...

  2. HADOOP+SPARK+ZOOKEEPER+HBASE+HIVE集群搭建(转)

    原文地址:https://www.cnblogs.com/hanzhi/articles/8794984.html 目录 引言 目录 一环境选择 1集群机器安装图 2配置说明 3下载地址 二集群的相关 ...

  3. CentOS6安装各种大数据软件 第六章:HBase分布式集群的配置

    相关文章链接 CentOS6安装各种大数据软件 第一章:各个软件版本介绍 CentOS6安装各种大数据软件 第二章:Linux各个软件启动命令 CentOS6安装各种大数据软件 第三章:Linux基础 ...

  4. [推荐]Hadoop+HBase+Zookeeper集群的配置

    [推荐]Hadoop+HBase+Zookeeper集群的配置 Hadoop+HBase+Zookeeper集群的配置  http://wenku.baidu.com/view/991258e881c ...

  5. Hbase的集群安装

    hadoop集群的搭建 搭建真正的zookeeper集群 Hbase需要安装在成功部署的Hadoop平台,并且要求Hadoop已经正常启动. 同时,HBase需要集群部署,我们分别把HBase 部署到 ...

  6. Apache DolphinScheduler 使用文档(2-3/8):集群规划及环境准备

    本文章经授权转载,原文链接: https://blog.csdn.net/MiaoSO/article/details/104770720 目录 2. 集群规划 2.1 集群配置 2.2 软件版本 2 ...

  7. HBase数据库集群配置

    0,HBase简介 HBase是Apache Hadoop中的一个子项目,是一个HBase是一个开源的.分布式的.多版本的.面向列的.非关系(NoSQL)的.可伸缩性分布式数据存储模型,Hbase依托 ...

  8. Cobar使用文档(可用作MySQL大型集群解决方案)

    原文:http://my.oschina.net/ydsakyclguozi/blog/374564 最近好不容易抽空研究了下Cobar,感觉这个产品确实很不错(在文档方面比Amoeba强多了),特此 ...

  9. [精华]Hadoop,HBase分布式集群和solr环境搭建

    1. 机器准备(这里做測试用,目的准备5台CentOS的linux系统) 1.1 准备了2台机器,安装win7系统(64位) 两台windows物理主机: 192.168.131.44 adminis ...

  10. hbase分布式集群搭建

    hbase和hadoop一样也分为单机版.伪分布式版和完全分布式集群版本,这篇文件介绍如何搭建完全分布式集群环境搭建. hbase依赖于hadoop环境,搭建habase之前首先需要搭建好hadoop ...

随机推荐

  1. (Java初学篇)IDEA项目新建流程和软件配置优化以及怎么彻底删除项目

    相信很多小伙伴们在初学 Java 时都会出现这样的情况,就是在网上一顿搜索加捣鼓终于把 JDK 和IDEA 这两款软件安装配置好,但是发现面对这个陌生的软件此时却无从下手,那么接下来我就给大家简单地介 ...

  2. Linux实战笔记__Ubuntu20.04上搭建Vulhub漏洞环境

    安装python3和pip3 安装docker 安装docker-compose 上传解压vulhub-master.zip 启动漏洞环境 进入某漏洞目录,执行docker-compose up -d ...

  3. win10操作系统下Android环境配置

    Windows命令行调试unity(Android)应用环境变量配置准备步骤:先下载好我们需要的Android SDK和JDK. Android SDK推荐地址:http://tools.androi ...

  4. SQL中事务以及全局变量的使用

    事务的定义 简单的说,事务处理可以用来维护数据库的完整性,保证一批SQL语句要么全执行,要么全部不执行 事务的特性 原子性  一致性  持久性  隔离性        注:一元九个 事务的使用 sel ...

  5. Spring事务传播行为实战

    一.什么是事务传播行为? 事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何运行. 例如:methodA方法调用methodB方 ...

  6. Linux之Docker-01

    一.镜像基础命令 1.docker version  [root@DY-Ubuntu-01 ~]#docker version               #查看 Docker 版本 2.docker ...

  7. Scrapy 如何传递 get请求的params

    我们都知道 在requests中可以使用 requests.get(url,params)的方式传值 那么在scrapy中如何传值呢 直接看代码 from urllib.parse import ur ...

  8. 所有selenium相关的库

    通过爬虫 获取 官方文档库 如果想获取 相应的库 修改对应配置即可 代码如下 from urllib.parse import urljoin import requests from lxml im ...

  9. 【lwip】09-IPv4协议&超全源码实现分析

    目录 前言 9.1 IP协议简述 9.2 IP地址分类 9.2.1 私有地址 9.2.2 受限广播地址 9.2.3 直接广播地址 9.2.4 多播地址 9.2.5 环回地址 9.2.6 本地链路地址 ...

  10. Pytest学习

    pytest简介 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高. 使用介绍 编写规则 测试函数以t ...