技术篇-HBase 2.0 之修复工具 HBCK2 运维指南

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 概述 目前社区已经发布了 HBase 的 2.0 版本,很多公司都希望去尝试新版本上的新功 能,但是不得不面对的问题就是当集群出了问题应该如何解决。在之前的 HBase版本中,我们可以依赖 hbck 来帮助检查问题和修复问题,在新的版本上我们应 该如何去处理呢?HBASE-19121[1]给了我们答案——HBCK2。

概述

目前社区已经发布了 HBase 的 2.0 版本,很多公司都希望去尝试新版本上的新功 能,但是不得不面对的问题就是当集群出了问题应该如何解决。在之前的 HBase
版本中,我们可以依赖 hbck 来帮助检查问题和修复问题,在新的版本上我们应 该如何去处理呢?HBASE-19121[1]给了我们答案——HBCK2。HBCK2 目前发布 了 1.0 版本,还在一直开发中,感兴趣的同学看看这个 issue

1. WHY HBCK2
由于之前的 hbck(hbck-1)是会直接去向 region server 或者 hdfs 发送请求进行修 复,而在 HBase 2.0 版本上集群内部操作全部都被挪到了 procedure v2(下文都称 为 procedure)上进行处理。
因为所有的命令都是经过 master 来协调处理,所以在修复时也需要通过 master 进行修复。否则反而可能导致更严重的不一致问题。所以 hbck-1 在 HBase-2.x 版本是不适用的。
除此以外,很多 hbck-1 需要处理的问题对于使用 procedure 的 HBase-2.x 已经 不再是问题了,所以相比起 hbck-1 来说也精简了很多功能。

2. 开始使用

2.1 下载
社区希望把 HBase 相关的外围工具抽离出 HBase 项目,所以在 github 上建了一 个 project hbase-operator-tools: hbase-operator-tools[2],HBCK2 也在其中

2.2 将项目拉取到本地

git clone https://github.com/apache/hbase-operator-tools.git

2.3 编译

修改 pom 中依赖的 HBase 版本 ,实际使用的 HBase 版本.version>

2.4 编译出 jar 包

mvn clean package

2.5 使用

cd 到 HBase 目录下,执行命令:

HBASE_CLASSPATH_PREFIX=

编译出的 hbck2_jar 包地址

./bin/hbase org.apache.hbase.HBCK2 <命令>

或者也可以:

./bin/hbase hbck -j <jar 包地址> <命令>

3. Procedure 简介

由于目前几乎所有的集群操作都是通过 procedure 进行的,所以 HBCK2 的工作 实际就是修复各种不正常的 procedure。所以在这里有必要对 procedure 进行一个简单的介绍。

一个 procedure 是由一系列的操作组成的,一旦完成后,要么成功,要么失败 (ROLL BACK), 不存在中间状态,所以 procedure 是支持事务的。procedure 执行 的每一步都会以 log 的形式持久化在 HBase 的 MasterProcWals 目录下,这样master 在重启时也能通过日志来恢复之前的状态并且继续执行。对于运维而言最重要的一点就是 procedure 在执行过程中会拿好几把锁, 这个在处理问题时是 很重要的,因为一旦锁没有释放,再做任何操作也只能是卡住等锁。

  1. IdLock:procedure 级别的锁,保证一个 procedure 不会被多个线程同时执行。
  2. 资源锁:对 HBase 的内部资源进行加锁,不同的 procedure 加锁的粒度不同, 目前有 region/table/namespace/region server 级别的锁。
    举例来说,假设我 assign 一个 region,那么 procedure 在执行的时候就需要对这 个 region 进行加锁,这样如果有别的人想要 unassign 这个 region,或者 drop 这个 region 所在的 table,都需要等最早的 assignment 结束后释放锁了才能执行。 这样防止有不一致的情况出现。

4. 功能介绍

4.1 bypass[OPTIONS]...

HBCK2 的核心功能,bypass 可以将一个或多个卡住的 procedure 进行释放。 原理很简单,在 procedure 的类里有一个 bypass 的 flag, 每次执行时会检查这个 flag 是否为 true,如果为 true 则直接返回 null, 这样 procedure 就会被认为执行 成功。而我们的 bypass 就是把这个 procedure 对象中的这个 flag 设为 true。 这样 stuck 的 procedure 就能够不再执行,后续的修复工作才能继续。返回值为 true 则是成功,false 是失败。

参数解析:

-o,--overide

在执行 bypass 之前先会尝试去拿 IdLock, 如果 procedure 还在运行就会超时返回 null,但是设置了这个参数即使拿不到 IdLock 也会去将 procedure 的 bypass flag 设为 true。

-r, --recursive

在 bypass 一个 procedure 时也会将这个 procedure 的所有子 procedure 进行递归的 bypass。例如我们 bypass 一个对 table schema 修改的 procedure, 就需要加上-r 参数,才能把这个操作的所有子 procedure 都 bypass 掉。

-w, --lockWait

上文提到的等待 IdLock 的超时时间配置,默认为 1ms

4.2 assigns [OPTIONS]

将一个或多个 region 再次随机 assign 到别的机器上,返回值是创建的 pid 则为 成功,-1 则为失败。
参数解析:

-o,--override

这里的 override 跟 bypass 的 override 不同,因为 assign 本身就会创建一个新的 procedure, 所以肯定是不涉及到拿 IdLock 的,但是这里涉及到资源锁的问题。 因为之前卡住的资源锁即使在 bypass 后也不会释放(用于 fence, 防止更多未知 的错误操作),所以需要加一个-o 去手动释放这个资源锁。

4.3 unassigns ...

将一个或多个 region unassign,返回值是创建的 pid 则为成功,-1 则为失败。
参数解析:

-o,--override,与 assigns 的一致

4.4 setTableState

可能的 table 状态, ENABLED, DISABLED, DISABLING, ENABLING
在 table 的状态和所有的 region 状态不一致时可以用这个命令进行修复。

4.5 serverCrashProcedures

手动 schedule 一个或多个 serverCrashProcedure, 如果有 serverCrashProcedure 没有执行成功,但是 procedure log 已经丢失了,那么可以利用这个命令进行修复。返回值为创建的 pid 则为成功,-1 则为失败。

patch 在 HBASE-21393[3],目前这个功能在 release 版本还没有。
所有的武器我们都有了,再回顾一下之前提到的问题,我们应该怎么处理呢?在 Case 解决中我们会详细阐述应该怎么处理,这里大家可以先思考一下。

5.查找问题

这个章节我们会介绍怎么去发现目前集群可能存在的问题。

5.1 canary tool

模拟用户的读写请求,去访问集群上的表。当我们需要检查集群 meta 上记录的 region assignment 跟实际 region server 上打开的 region 是否一致时,可以使用这个命令去检查:

hbase canary -f false -t 6000000

这个命令会向 meta 上的记录的每个 region 发送一个 get 请求,将-f 设为 false 是为了不在遇到第一个错误时退出,-t 则是这个命令的超时时间,我们设成了 6000 秒。在执行完成以后可以通过 grep ERROR 来找到那些有问题的 region。

需要注意的是因为是模拟客户端发送的 get 请求,最好将 HBase 的客户端超时时间和超时次数配的小一些,否则会很慢。

PS:canary 本身也很适合用来作为集群可用性的监控,有兴趣的同学可以去了解一下。

5.2 页面状态

其实大部分的信息都会在 master 的页面上展示出来,我们来详细的介绍一下:
Procedures & Locks:
_2019_01_11_1_33_03

可以检查当前所有没有执行完的 procedure 以及所有资源锁,当我们想要 assign 或者 unassign 一个 region 时,需要先去检查下是由有别的 procedure 已经占有了这个资源锁,如果是的话需要现将那个 procedure bypass 掉,或者等待那个 procedure 释放锁。

_2019_01_11_1_33_48

以看到 EXCLUSIVE 的 lock 只有 region 级别的,图中红框圈出来的就是占有这个锁的 procedure id 以及它的 parent procedure id, 由此我们知道如果想要重新 assign/unassign 这个 region,那么一定要 bypass 这个 procedure。

同理,当 Locks 这块没有任何 EXLUSIVE 锁时,我们可以放心的去执行操作而不 用担心被卡住。

5.3 OPENING/CLOSING region 的查找

branch-2.0 上最容易出现的问题就是 region 卡在了 OPENNING/CLOSING 状态, 一般处于这两种状态的 region 都会在 rit 的队列中,可以通过点击页面上的链接 拿到所有的 region 以及对应的 procedure id。

_2019_01_11_1_34_54

可以看到现在有 17 个 region 处在 transition 中,我们可以点击红框圈住的这个链接,会展示所有的 region。

_2019_01_11_1_35_50

可以看到现在有 17 个 region 处在 transition 中,我们可以点击红框圈住的这个链接,会展示所有的 region。

_2019_01_11_1_36_36

因为我们最后是希望通过 HBCK2 来进行处理,那么最好是可以复制粘贴需要处理的 region 或者 procedure, 所以可以点击圈出的这两个按钮,会以 text 形式展 示所有 region 或者所有 procedure。

_2019_01_11_1_37_08

5.4 Master 日志

stuck 的 region 会打印以下日志:

_2019_01_11_1_38_53

6.Case 解决

6.1 region 卡在 OPENING/CLOSING 状态

首先找到这些 region 对应的 pid, 然后执行 bypass, 检查是否锁都释放了,如果 释放了就再 assign 一遍,如果需要 close,就再unassign 一次

6.2 对 table 的修改有问题如何回退

找到这个修改的rootprocedure,bypass-or来bypass所有相关的procedure, 利用 table unset 来重置 meta,因为 bypass 之后资源锁还是没有释放,所以需要手动加上 override 参数再去全部 assigns 一遍

6.3 Master 起不起来 日志里一般会有这个:

6.Case 解决

6.1 region 卡在 OPENING/CLOSING 状态
首先找到这些 region 对应的 pid, 然后执行 bypass, 检查是否锁都释放了,如果 释放了就再 assign 一遍,如果需要 close,就再 unassign 一次

6.2 对 table 的修改有问题如何回退
找到这个修改的rootprocedure,bypass-or来bypass所有相关的procedure, 利 用 table unset 来重置 meta,因为 bypass 之后资源锁还是没有释放,所以需要手 动加上 override 参数再去全部 assigns 一遍

6.3 Master 起不起来 日志里一般会有这个:
_2019_01_11_1_40_13

手动去 assign 一下 meta 表即可,hbase:meta 表的 encoded name 是一个时间戳,比如上面日志的 encoded name 就是 1588230740

另外 hbase:namespace 表没有 online 也会造成这个问题,同样需要我们去手动assign 一下

6.4 table 卡在 disabling 状态

因为要求是所有 region 都 disabled, 那么解决办法可以是手动把没有 closed 的 region 根据 case1 来解决。如果所有 region 都已经是 closed 状态了,那么我可以利用 setTableState 手动将表的状态设为 DISABLED。之后再 drop 都是安全的了。

7. 总体解决思路

其实 HBase-2.x 版本的运维思路很简单,因为使用了 procedure,集群出现 meta 跟 regionserver 不一致的状态是很少的,一般都是有 procedure 出问题了。那么 我们主要就是看怎么解决这个有问题的 procedure。

如果是 table/namespace 级别的修改,因为设计到很多 region 的锁,如果需要 bypass 的话需要找到 root procedure 然后使用 bypass -or.

如果只是 region 级别的问题,则 bypass -o 即可。
bypass 之后检查 locks 的页面,看看是不是锁都释放了,如果没有锁了则根据需 求进行 assign 或者 unassign,或者对 table 的属性进行还原。

参考链接:
[1] https://issues.apache.org/jira/browse/HBASE-19121
[2] https://github.com/apache/hbase-operator-tools
[3] https://issues.apache.org/jira/browse/HBASE-21393

作者:田竞云 小米 HBase Committer

相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
12天前
|
弹性计算 运维 监控
|
3月前
|
运维 Linux Apache
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
93 3
|
3月前
|
运维 Linux Apache
Puppet这一强大的自动化运维工具,涵盖其基本概念、安装配置及使用示例
【10月更文挑战第8天】本文介绍了Puppet这一强大的自动化运维工具,涵盖其基本概念、安装配置及使用示例。Puppet通过定义资源状态和关系,确保系统配置始终如一,支持高效管理基础设施。文章详细讲解了Puppet的安装步骤、配置方法及DSL语言示例,帮助读者快速掌握Puppet的使用技巧。
128 2
|
23天前
|
弹性计算 运维 监控
云资源运维难?阿里云免费工具来帮忙
阿里云推出免费运维工具——云服务诊断,帮助用户提升对云资源的运维效率、降低门槛、减轻负担。其核心功能包括「健康状态」和「诊断」。通过「健康状态」可实时查看云资源是否正常;「诊断」功能则能快速排查网络、配置、安全等问题,并提供修复建议,助您迅速恢复业务。体验评测活动火热进行中,参与即有机会赢取索尼头戴耳机、小米背包等好礼。活动链接:https://developer.aliyun.com/topic/cloud-health。
387 18
|
1月前
|
运维 Kubernetes Devops
自动化运维:从脚本到工具的演进之旅
在数字化浪潮中,自动化运维成为提升效率、保障系统稳定的关键。本文将探索自动化运维的发展脉络,从基础的Shell脚本编写到复杂的自动化工具应用,揭示这一技术变革如何重塑IT运维领域。我们将通过实际案例,展示自动化运维在简化工作流程、提高响应速度和降低人为错误中的重要作用。无论你是初学者还是资深专家,这篇文章都将为你提供宝贵的洞见和实用的技巧。
|
26天前
|
人工智能 运维 自然语言处理
今晚围观—>安全运维工程师现场直播用通义灵码发现和修复代码漏洞
12 月 18 日晚 19:30 分,阿里云中小企业直播间「AI 编码助手一年养成记:从“打酱油”到企业开发“真正助手”」见。
|
2月前
|
机器学习/深度学习 人工智能 运维
自动化运维之路:从脚本到工具的演进
在IT运维领域,效率和准确性是衡量工作成效的关键指标。随着技术的发展,自动化运维逐渐成为提升这两个指标的重要手段。本文将带领读者了解自动化运维的演变历程,从最初的简单脚本编写到现今复杂的自动化工具应用,展示如何通过技术提升运维效率。文章不仅介绍理论和实践案例,还提供了代码示例,帮助读者理解自动化运维的实际应用场景。
|
2月前
|
运维 Ubuntu 应用服务中间件
自动化运维工具Ansible的实战应用
【10月更文挑战第36天】在现代IT基础设施管理中,自动化运维已成为提升效率、减少人为错误的关键手段。本文通过介绍Ansible这一流行的自动化工具,旨在揭示其在简化日常运维任务中的实际应用价值。文章将围绕Ansible的核心概念、安装配置以及具体使用案例展开,帮助读者构建起自动化运维的初步认识,并激发对更深入内容的学习兴趣。
82 4
|
2月前
|
运维 监控 数据安全/隐私保护
自动化运维工具的设计与实现
【10月更文挑战第34天】在现代IT基础设施管理中,自动化运维工具扮演着至关重要的角色。它们不仅提高了运维效率,还确保了服务的连续性和稳定性。本文将深入探讨如何设计并实现一个自动化运维工具,从需求分析到功能实现,再到最终的测试与部署。我们将通过一个简单的代码示例来展示如何自动执行常见的运维任务,如日志清理和性能监控。文章旨在为读者提供一套完整的方法论,以便他们能够构建自己的自动化运维解决方案。
|
3月前
|
运维 关系型数据库 MySQL
自动化运维工具Ansible的实战应用
【10月更文挑战第9天】在现代IT运维领域,效率和可靠性是衡量一个系统是否健康的重要指标。自动化运维工具Ansible因其简洁、易用的特性,成为了众多企业和开发者的首选。本文将通过实际案例,展示如何利用Ansible进行日常的运维任务,包括配置管理、软件部署以及批量操作等,帮助读者深入理解Ansible的应用场景及其带来的效益。