HBase指南 | HBase 2.0之修复工具HBCK2运维指南

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 在之前的HBase版本中,我们可以依赖hbck来帮助检查问题和修复问题,在新的版本上我们应该如何去处理呢?HBASE-19121[1]给了我们答案——HBCK2。 HBCK2目前发布了1.0版本,还在一直开发中,感兴趣的同学看看这个issue。

image

目前社区已经发布了HBase的2.0版本,很多公司都希望去尝试新版本上的新功能,但是不得不面对的问题就是当集群出了问题应该如何解决。

在之前的HBase版本中,我们可以依赖hbck来帮助检查问题和修复问题,在新的版本上我们应该如何去处理呢?HBASE-19121[1]给了我们答案——HBCK2。

HBCK2目前发布了1.0版本,还在一直开发中,感兴趣的同学看看这个issue。

image
由于之前的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来说也精简了很多功能。
image

下载:

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

将项目拉取到本地

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

编译:

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

编译出jar包

mvn clean package

使用:

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

HBASE_CLASSPATH_PREFIX=

编译出的hbck2_jar包地址

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

或者也可以:

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

image
由于目前几乎所有的集群操作都是通过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结束后释放锁了才能执行。这样防止有不一致的情况出现。
image
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
image
将一个或多个region再次随机assign到别的机器上,返回值是创建的pid则为成功,-1则为失败。

参数解析:

-o,--override

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

参数解析:

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

image
可能的table状态, ENABLED, DISABLED, DISABLING, ENABLING

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

patch在HBASE-21393[3],目前这个功能在release版本还没有。

所有的武器我们都有了,再回顾一下之前提到的问题,我们应该怎么处理呢?在Case解决中我们会详细阐述应该怎么处理,这里大家可以先思考一下。
image
这个章节我们会介绍怎么去发现目前集群可能存在的问题。
image
模拟用户的读写请求,去访问集群上的表。当我们需要检查集群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 本身也很适合用来作为集群可用性的监控,有兴趣的同学可以去了解一下。
image
其实大部分的信息都会在master的页面上展示出来,我们来详细的介绍一下:

Procedures & Locks:
image
可以检查当前所有没有执行完的procedure以及所有资源锁,当我们想要assign或者unassign一个region时,需要先去检查下是由有别的procedure已经占有了这个资源锁,如果是的话需要现将那个procedure bypass掉,或者等待那个procedure释放锁。
image
可以看到EXCLUSIVE的lock只有region级别的,图中红框圈出来的就是占有这个锁的procedure id以及它的parent procedure id, 由此我们知道如果想要重新assign/unassign这个region,那么一定要bypass这个procedure。

同理,当Locks这块没有任何EXLUSIVE锁时,我们可以放心的去执行操作而不用担心被卡住。
image
branch-2.0上最容易出现的问题就是region卡在了OPENNING/CLOSING状态,一般处于这两种状态的region都会在rit的队列中,可以通过点击页面上的链接拿到所有的region以及对应的procedure id。
image
可以看到现在有17个region处在transition中,我们可以点击红框圈住的这个链接,会展示所有的region。
image
可以看到现在有17个region处在transition中,我们可以点击红框圈住的这个链接,会展示所有的region。
image
因为我们最后是希望通过HBCK2来进行处理,那么最好是可以复制粘贴需要处理的region或者procedure, 所以可以点击圈出的这两个按钮,会以text形式展示所有region或者所有procedure。
image
image
stuck的region会打印以下日志:

WARN [ProcExecTimeout] org.apache.hadoop.hbase.master.assignment.AssignmentManager: STUCK Region-In-Transition rit=OPENING, location=c4-hadoop-tst-st99.bj,42900,1542148656901, table=test_modify, region=8d81f74b324d0503c3fc87f34e9a17cb

image
1.region卡在OPENING/CLOSING 状态

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

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

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

3.Master起不起来

日志里一般会有这个:

WARN org.apache.hadoop.hbase.master.HMaster: hbase:meta,,1.1588230740 is NOT online; state={1588230740 state=CLOSING, ts=1538456302300, server=ve1017.example.org,22101,1538449648131}; ServerCrashProcedures=true. Master startup cannot progress, in holding-pattern until region onlined.

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

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

4.table卡在disabling状态

因为要求是所有region都disabled, 那么解决办法可以是手动把没有closed的region根据case1来解决。如果所有region都已经是closed状态了,那么我可以利用setTableState手动将表的状态设为DISABLED。之后再drop都是安全的了。
image
其实HBase-2.x版本的运维思路很简单,因为使用了procedure,集群出现meta跟regionserver不一致的状态是很少的,一般都是有procedure出问题了。那么我们主要就是看怎么解决这个有问题的procedure。

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

如果只是region级别的问题,则bypass -o即可。

bypass之后检查locks的页面,看看是不是锁都释放了,如果没有锁了则根据需求进行assign或者unassign,或者对table的属性进行还原。
参考链接:

原文:https://mp.weixin.qq.com/s/GVMWwB1WsKcdvZGfvX1lcA

相关实践学习
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
相关文章
|
2天前
|
运维 Ubuntu Devops
自动化运维工具的魅力:Ansible入门
【9月更文挑战第5天】在快速变化的IT世界里,自动化运维不再是可选项,而是必需品。Ansible,一款简单却强大的自动化工具,正成为众多DevOps工程师的首选。本文将带你了解Ansible的基本概念、安装步骤以及如何编写简单的Playbook,从而开启你的自动化之旅。
50 35
|
7天前
|
运维 监控 开发工具
自动化运维工具的设计与实现
【8月更文挑战第31天】在现代软件开发和运维领域,自动化工具已成为提升效率、减少人为错误的关键。本文将介绍如何设计并实现一个自动化运维工具,旨在帮助团队简化日常任务,确保部署流程的顺畅与一致性。通过具体案例,我们将探讨工具的架构、功能模块以及如何集成到现有的运维流程中。
|
8天前
|
运维 Prometheus 监控
自动化运维工具的探索与实践
【8月更文挑战第31天】在数字化浪潮中,自动化运维成为提升效率、保障系统稳定的关键。本文通过介绍几款流行的自动化运维工具,结合实例探讨它们在实际工作中的应用及效果,旨在为读者提供一份实用的自动化运维指南。
|
8天前
|
存储 运维 应用服务中间件
自动化运维工具:Ansible入门教程
【8月更文挑战第31天】在这个数字化时代,运维工作的重要性日益凸显。为了提高运维效率,自动化工具应运而生。本文将介绍Ansible这一自动化运维工具的基本概念、安装过程以及简单的使用示例,帮助读者快速上手并应用到实际工作中。
|
13天前
|
运维 Ubuntu Linux
自动化运维工具:Ansible入门与实践
【8月更文挑战第26天】在现代IT运维领域,自动化已成为提升效率和减少人为错误的关键。Ansible作为一款流行的自动化运维工具,以其简洁性和易用性受到广泛欢迎。本文将介绍Ansible的基本概念、安装过程以及一个简单的使用示例,帮助初学者快速上手并应用到实际的运维工作中。通过深入浅出的方式,我们将探索Ansible如何简化日常的系统管理和配置任务,让读者能够理解并实现自己的自动化脚本。
|
7天前
|
运维 网络安全 Python
自动化运维工具的搭建与实践
【8月更文挑战第32天】本文将介绍如何通过Python脚本实现自动化运维工具的搭建,包括环境准备、功能实现和代码示例。我们将从简单的任务开始,逐步深入,最终构建一个实用的自动化运维工具。无论你是运维新手还是经验丰富的专家,这篇文章都将为你提供有价值的参考和启示。让我们一起探索自动化运维的世界吧!
|
8天前
|
运维 关系型数据库 MySQL
自动化运维工具:Ansible入门与实践
【8月更文挑战第31天】 在现代IT运维领域,自动化已成为提升效率和减少人为错误的利器。Ansible作为一款流行的自动化运维工具,以其简洁易用和强大的功能受到广泛欢迎。本文将通过实际操作演示,带你快速入门Ansible,并分享一些实践经验,帮助你构建起自己的自动化运维体系。
|
8天前
|
运维 监控 测试技术
自动化运维工具的设计与实现
【8月更文挑战第31天】在现代软件开发中,自动化运维是提高效率、减少错误的关键。本文将探讨如何设计并实现一个自动化运维工具,通过具体代码示例展示其构建过程。我们将从需求分析入手,逐步深入到工具的设计思路、核心功能实现以及最终的部署与测试。文章旨在为读者提供清晰的自动化运维工具开发指导和实践参考。
|
8天前
|
运维 Ubuntu 网络安全
自动化运维工具:Ansible入门教程
【8月更文挑战第31天】在IT世界中,时间就是金钱。自动化运维工具Ansible以其简洁、高效的特性,成为众多IT专家的首选。本文将深入浅出地介绍Ansible的基础知识,并通过实际案例引导你步入自动化运维的大门,让你轻松应对日常的系统管理任务。
|
8天前
|
运维 Linux Apache
自动化运维工具:Ansible入门与实战
【8月更文挑战第31天】 本文将引导读者理解自动化运维的重要性,并通过介绍Ansible这一强大的自动化工具,展示如何简化和加速IT管理任务。文章不仅讲解了Ansible的基础概念,还通过实例展示了如何配置和使用Ansible进行日常的运维工作,包括部署、配置管理和任务自动化等。无论你是运维新手还是希望提高现有工作流程的效率,这篇文章都会为你提供实用的知识和技能。
下一篇
DDNS