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则是静态的
网友评论