HBase线上生产调优建议(读写分离、RSgroup、流量控制)

笔者今天给大家讲一下 HBase 生产环境中的实践,包括资源隔离、参数配置、性能优化等方面,部分内容参考《HBase原理与实践》(非常建议大家好好读一读,一定会大有收获),以及笔者的实战经验。

HBase 业务资源隔离

1. 读写分离场景

RegionServer 默认情况下只提供一个请求队列给所有业务使用,导致部分延迟较高的请求影响其他对延迟敏感的业务。针对这种情况,HBase 提供了读写队列隔离方案。

我们知道,HBase 有三种典型的API操作类型,分别为 get、scan 和write,其中 get 和 scan 属于 read 类型。默认场景下,HBase 只提供一个队列,所有请求都会进入该队列进行优先级排序。在一些场景下,我们要求这三种类型的访问尽可能的互相不影响,那么就需要在线上配置读写分离。

HBase 中的相关配置如下:

  1. hbase.ipc.server.callqueue.read.ratio

    如果将 hbase.ipc.server.callqueue.read.ratio 设置为0.5,则表示有50%的线程数处理读请求,剩余50%用于接收写请求。

  2. hbase.ipc.server.callqueue.scan.ratio

    如果将 hbase.ipc.server.callqueue.scan.ratio 设置为0.5,则代表在50%的读线程之中,再有50%的线程处理 scan,也就是全部线程的25%。

2. CPU/内存资源隔离

针对系统资源方面,HBase 提供了 RegionServer Group(RSGroup)方案。RSGroup 方案在HBase 1.4 以上版本才原生支持,但是之前 1.x 版本可以打社区 patch。不过如果使用 CDH 搭建的平台,比如 CDH 5.13.3,HBase 1.2 版本即可支持。

为了支持 RSGroup 功能,需要配置如下参数:

    1. <property>

    2. <name>hbase.coprocessor.master.classes</name>

    3. <value>org.apache.hadoop.hbase.rsgroup.RSGroupAdminEndpoint</value>

    4. </property>

    5.  
    6. <property>

    7. <name>hbase.master.loadbalancer.class</name>

    8. <value>org.apache.hadoop.hbase.rsgroup.RSGroupBasedLoadBalancer</value>

    9. </property>

生产线上,分组原则一般遵循:

  • 在线业务和离线业务尽量划分到不同组

  • 重要业务和边缘业务尽量划分到不同组

  • 非常重要的业务尽量单独划分到独立组或者单独部署集群

使用RSGroup会自动关闭全局自动负载均衡,后续需要手工触发。

另外要隔离系统表,要么定义一个 system rsgroup 用来存储所有系统表,要么把系统表都默认放在 default rsgroup 中。所有其他用户的表都定义在非 default 的 rsgroups 中。

根据实践证明,笔者建议,针对 Dead 或有问题的节点,定义一个特殊的 rsgroup 是非常有用的。所有放在这个特殊的 rsgroup 中的节点是无法运行的,直到修复完成。

最后,使用 RSGroup 要注意几点:

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

    2. hbase(main):001:0> major_compact 'tablename'

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

    4. (3) 删除 group 之前需要将 group 下的 regionserver 和 table 都移除掉

    5. (4) default 组和其他的 rsgroup 不一样,default 是动态的,其他的 group 则是静态的

HBase HBCK

线上环境,需要定期地检测和监控 HBase 集群中 Region 的一致性和完整性,同时可以对损坏的集群进行修复。

HBase HBCK 主要工作在两种模式下:

  • 一致性检测只读模式

  • 多阶段修复模式

HBase 集群一致性状态

  • HBase Region 一致性

    1. 集群中所有 region 都被 assign,而且被分配到唯一一个 RegionServer 节点上

    2. 该 region 的状态在内存中、hbase:meta 表中以及 zookeeper 这三个地方需要保持一致

  • HBase 表的完整性

    对于集群中任意一张表,每个 rowkey 都仅能存在于一个 region 区间

最好制定一个周期计划,例行地执行 hbck 命令,并在多次出现不一致的情况下发出报警信息,通知运维人员定位分析,及时解决问题。

    1. hbase hbck

    2. hbase hbck -details

    3. # 如果集群规模大,region很多,hbck耗时很长,可以针对某些表执行:

    4. hbase hbck TableFoo TableBar

HBCK 的局部低危修复

低风险的 Region 一致性问题修复是指:

修复仅仅涉及 HBase Master 内存中 Region 状态、ZooKeeper 临时节点中 Region 状态以及 hbase:meta 元数据表中 Region 状态的修改、并不实际修改任何 HDFS 文件。

注意:hbase2.0版本之后,hbase hbck中的修复命令已经弃用,需要使用如下命令hbase hbck -j /root/hbase-operator-tools-1.0.0.1.0.0.0-618/hbase-hbck2/hbase-hbck2-1.0.0.1.0.0.0-618.jar filesystem -fix

其中hbase-hbck2/hbase-hbck2-1.0.0.1.0.0.0-618.jar这个包在我的资源中有,大家可以去下载

https://download.youkuaiyun.com/download/m0_37534613/12938763

Region一致性问题修复有两个常用选项:

  • filesystem -fix 修复 assign 相关问题,如没有 assign、assign 不正确或者同时 assign 到多个 RegionServer 节点问题的 regions。

  • fixMeta 主要修复 .regioninfo 文件和 hbase:meta 元数据表的不一致。修复的原则是以 HDFS 文件为准:如果 region 在 HDFS 上存在,但在 hbase.meta 表中不存在,就会在 hbase:meta 表中添加一条记录。反之如果在 HDFS 上不存在,而在 hbase:meta 表中存在,就会将 hbase:meta 表中对应的记录删除。

HBCK高危修复

Region 区间 overlap 相关问题的修复属于高危修复操作,因为这类修复通常需要修改 HDFS 上的文件,有时甚至需要人工介入。对于这类高危修复操作,建议先执行 hbck-details ,然后根据结果详细了解问题细节,再执行相应的修复操作。

笔者建议在 overlap 分析的基础上使用 merge 命令,强制将存在 overlap 的相关Region 合并到一起。需要注意的是,对于多个Region,需要两两合并,之后对合并后的Region 执行 Major Compaction ,再两两合并。

这里需要特别注意: -repair|-fix 命令强烈不建议生产线上使用。

使用案例

接下来针对线上出现的一些问题,进行案例分析和提出问题解决的方案。

1. Region 没有部署到任何 RegionServer 节点 

执行 hbck 命令后,确认 Region 元数据信息在 HDFS 和 hbase:meta 中都存在,但没有部署到任何一台 RegionServer 上,hbck 命令的输出如下:

    1. ERROR:Region {meta => NEW_REGION_XXXXXXXXXX,\x001\x01,1566748778085.652f5c6d6623f060adeefc622d8ffead., hdfs => hdfs://xxxxx/default/NEW_REGION_XXXXXXXXXX/652f5c6d6623f060adeefc622d8ffead, deploy => } not deployed on any region server.

    2. ......

    3. ERROR: There is a hole in the region chain between and . You need to create a new .regioninfo and region dir in hdfs to plug the hole.

    4. ERROR: Found inconsistency in table NEW_REGION_XXXXXXXXXX

如果在 hbck 命令输出的详细的信息中看到 “not deployed on any region server”,可以使用如下命令修复:

    1. hbase hbck -fixAssignments

当然,我们也可以在 hbase shell 中执行 assign 命令部署指定 Region。

需要特别注意的是,h

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值