HBase隔离方案实战

作者: 飞鸿无痕 | 来源:发表于2018-08-11 22:59 被阅读238次

    HBase适合用于海量数据的存储,横向扩展非常方便,随着数据的增长,访问的性能却不会出现很大的下降。这是很多的公司选择使用HBase作为分布式数据库的一个很重要的原因。正常来说,一个HBase集群肯定不止跑一个业务,即多个业务共享集群资源。这些业务中有的对性能要求很高;有的业务要求存储很大;有的业务属于公司的核心业务,需要重点保障;有的业务是离线业务,短时间访问不了影响也不大。这里就会产生对于不同业务的不同SLA需求。也就是集群需要有隔离的功能。

    全部业务共享集群资源的场景下,如果出现问题,将会同时影响多个业务。那么怎么来解决集群的隔离?不会因为某个业务的访问量陡增或者不合理使用,导致其他的业务受到影响?

    集群隔离

    最先想到的解决办法可能是搭建多个HBase集群,将不同的业务使用不同的HBase,这样就能很好地实现业务之间的隔离。但是这里会存在如下几个问题:

    1、管理麻烦

    2、集群很小,性能不太好

    3、单台机器影响大(集群小,单台上的region多,出问题影响面广)

    4、需要的zk、master、namenode等的机器更多

    5、抗单个业务陡增的场景不强

    因此真实的使用场景,不太可能为每个业务搭建单独的集群,最多就是给非常重要的业务搭建一个单利的集群,其他的非核心业务放在一个大集群中,隔离还是刚需。

    rsgroup方案

    那在HBase中是否有更好一点的隔离策略?

    答案是有,之前yahoo在大规模使用HBase集群的时候也遇到了隔离的问题,他们开发了rsgroup解决方案,比较好地解决了不同应用在regionserver上的隔离。并将rsgroup推荐给了官方,官方版本集成了yahoo提交的rsgroup隔离方案。rsgroup方案的原理如下下图所示:

    在上图中有两个rsgroup,具体原理为:

    1、将不同的RegionServer分配到不同的rsgroup中

        上图中RegionServer1、RegionServer2、RegionServer3被分配到了Important_group中,RegionServer4、RegionServer5、RegionServer6被分配到了normal_group中。

    2、将不同的表分配到不同的group中

        上图中表t1和t2分配到了Important_group,表t3和t4分配到了normal_group。

    3、表、regionserver分配到具体的rsgroup后就达到了隔离的效果

        做好分配后,以表t1为例,t1的所有region都只会落到Important_group所属的Regionserver中。此时当normal_group的任何Regionserver异常,都不会引起t1表的异常(datanode异常会有影响,后面有说明)。只有当Important_group所属的Regionserver异常,并且有t1的region落在该regionserver上才会有影响。表代着业务,你可以将同类型(重要等级)的表放在同一个rsgroup中,这就实现了不同业务的隔离。

        对于于重点业务,可以分配更多的regionserver的机器,负载更低;而对于非重点业务,则可以更少的机器承担负更多的业务。目前datanode已经支持了分级存储,甚至可以将重点业务使用不同的介质,比如SSD。

    rsgroup隔离的优缺点

    优点:

    管理方便

    充分利用集群的资源

    机器腾挪扩容很方便

    有利于整个集群性能的提升

    缺点:

    隔离不彻底,hdfs层还是共用,如果datanode出现异常,还是会影响到多个业务。

    如何开启rsgroup功能

    在hbase的配置文件hbase-site.xml中添加如下内容,并重启master即可

    如何使用rsgroup

    1、规划好对应rsgroup,并添加对应的rsgroup

        根据业务规划好rsgroup,比如1个重点组,1个普通组,一个默认组,添加rsgroup的命令如下:

        add_rsgroup 'groupname'

        范例:

        add_rsgroup 'Important_group'

    2、添加RegionServer到对应的group,命令如下:

        move_rsgroup_servers 'groupname',['regionserverip1:port']

        如果有多台regionserver就在添加多个regionserver到列表中即可,如下:

        move_rsgroup_servers 'groupname',['regionserverip1:port','regionserverip2:port',......]

        范例如下 :

        move_rsgroup_servers 'Important_group',['10.10.10.11:60020']

    3、迁移表到对应的rsgroup中,命令如下

        move_rsgroup_tables 'groupname', ['tablename1']

        如果有多张表则添加多个tablename到列表中即可:

        move_rsgroup_tables 'groupname', ['tablename1','tablename2']

        范例如下:

    move_rsgroup_tables 'Important_group', ['t_digit_user_crt_Fuid']

        注意:如果表的region很多,建议每次只迁移一个表,否则很容易超时。

    4、迁移完表后,最好对表做一下大合并,实现表的本地化,如果表region很多或者region很大,则可以针对region发起大合并

        major_compact 'tablename'

    5、迁移完表后也做一下hbase hbck校验

    rsgroup相关命令介绍

    列出所有的group名

    list_rsgroups

    获得某一个group详细信息,包括:表名和RS

    get_rsgroup 'groupname'

    获得某一个RS所属的group

    get_server_rsgroup 'groupname'

    获得某张表所属的group

    get_table_rsgroup 'tablename'

    新增group

    add_rsgroup 'groupname'

    将regionserver 移到指定的group下,一个regionserver只属于一个group

    move_rsgroup_servers 'groupname',['regionserverip1:port']

    将Table移到指定的group下,一张表也只能属于一个group

    move_rsgroup_tables 'groupname', ['tablename1']

    对指定group进行balance

    balance_rsgroup 'groupname'

    删除指定的group,删除前需要将该group下的RS和Table移掉

    remove_rsgroup 'groupname'

    rsgroup注意事项

    1、迁移完表后记得做major compact(本地化)

    2、迁移完表后做hbase hbck校验,防止添加迁移表的时候有部分region未上线的情况

    3、删除group之前需要将group下的regionserver和table都移除掉

    4、default组和其他的rsgroup不一样,default是动态的,其他的group则是静态的

    相关文章

      网友评论

        本文标题:HBase隔离方案实战

        本文链接:https://www.haomeiwen.com/subject/ggjjbftx.html