本文参考: https://www.jianshu.com/p/04d56a2c8b5c , 这篇文章写的很好, 就是命令没法用, 一度以为我们的集群不支持rsgroup, 无意中试出了帮助命令, 才发现, 命令不太对, 不知道是作者粗心还是每个版本的命令不一样, 这里做了一些修正, 我们的集群是CDH5.12.1, hbase是1.2.0
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-site.xml, 并重启master即可
<property>
<name>hbase.coprocessor.master.classes</name>
<value>org.apache.hadoop.hbase.rsgroup.RSGroupAdminEndpoint</value>
</property>
<property>
<name>hbase.master.loadbalancer.class</name>
<value>org.apache.hadoop.hbase.rsgroup.RSGroupBasedLoadBalancer</value>
</property>
cdh集群配置方法: https://blog.csdn.net/yuanhaiwn/article/details/82768785
如何使用rsgroup
最重要的帮助命令:
help 'rsgroup'
帮助命令解释的很详细,大概有9个命令, 这里大致说一下:
1、添加rsgroup分组
add_rsgroup 'my_group'
例如:
add_rsgroup 'g01_group'
2、添加RegionServer到对应的group,命令如下:
move_servers_rsgroup '组名',['RS地址:端口号','server2:port']
例如:
move_servers_rsgroup 'g01_group',['a2502f09:60020']
move_servers_rsgroup 'g01_group',['a2502f12:60020']
(a2502f09 和 a2502f12 是机器别名)
经测试, RS移动到新组的时候, 该RS上原有的region会自动分配到原组的其他RS上, 移动之后的RS是空的
3、迁移表到对应的rsgroup中,命令如下
move_tables_rsgroup '组名',['table1','table2']
例如:
move_tables_rsgroup 'g01_group', ['hbase:meta']
经测试, 表移动到新组, 所有和表相关的region会自动移动到新组所属的regionServer上
注意:如果表的region很多,建议每次只迁移一个表,否则很容易超时。
4. 查看组信息
get_rsgroup 'default'
get_rsgroup 'g01_group'
5. 平衡RegionServer组
balance_rsgroup 'g01_group'
6. 获取给定RegionServer的组名
get_server_rsgroup 'server1:port1'
例如:
get_server_rsgroup 'a2502f09:60020'
7. 获取给定表的组名
get_table_rsgroup 'hbase:meta'
8. 查看所有组
list_rsgroups
也可用正则表达式筛选
list_rsgroups 'de*'
9. 删除组
remove_rsgroup 'g01_group'
rsgroup注意事项
1、迁移完表后记得做major compact(本地化) major_compact 'tablename'
2、迁移完表后做hbase hbck校验,防止添加迁移表的时候有部分region未上线的情况
3、删除group之前需要将group下的regionserver和table都移除掉
4、default组和其他的rsgroup不一样,default是动态的,其他的group则是静态的