在实际生产环境中,会因为各种各样的因素(如用户的误 *** 作、HDFS 故障、Hbase 集群节点掉电等),可能使Hbase 集群出现故障,导致集群不可用,常见的故障有Region 出现RIT 问题、Procedure出现卡死情况等。为了解决这些问题,Hbase社区提供了HBCK 工具来进行修复。在Hbase1.x版本中自带hbck(即hbck-1)工具包命令,可以直接去向 region server 或者 hdfs 发送请求进行修复,但是在Hbase2.x版本中集群内部 *** 作全部都被挪到了 procedure v2(下文都称 为 procedure)上进行处理,因为所有的命令都是经过 master 来协调处理,所以在修复时也需要通过 master 进行修复。否则反而可能导致更严重的不一致问题。所以 hbck-1 在 Hbase-2.x 版本是不适用的。除此以外,很多 hbck-1 需要处理的问题对于使用 procedure 的 Hbase-2.x 已经 不再是问题了,所以相比起 hbck-1 来说也精简了很多功能。
需要说明的是Hbase2.0版本自身并不 提供HBCK命令,而是通过单独的HBCK2工具提供,该工具包的git地址为:https://github.com/apache/hbase-operator-tools.git
在使用时可以把代码拉到本地,修改hbase的版本号,然后重新编译得到工具包:hbase-hbck2-1.1.0-SNAPSHOT.jar
Procedure 简介由于HBCK 工具通常是通过修复Procedure 来解决Hbase 集群故障的,因此在介绍HBCK 工具的
功能之前有必要先介绍Procedure。
在Hbase2 集群中,几乎所有的集群 *** 作都是通过Procedure 来进行的,Hbase 在执行Procedure
的时候可能会存在一些不正常的情况,HBCK 的作用就是修复不正常的Procedure。在Hbase2 中,一个Procedure 是由一系列的 *** 作组成的,可以将一个Procedure 看作一次事务,Procedure 完成之后,只存在两种状态,要么执行成功,要么失败回滚,并不存在中间状态。
一次Procedure 包含了多个 *** 作,每一个 *** 作的执行都会以log 的形式持久化在WALs 中,这样可
以保证即使Hbase 集群断电重启,也可以基于保存的日志来恢复之前的状态并继续执行。
由于Procedure 在执行过程中,包含若干个步骤,在此过程中,可能会持有多个锁对象,因此在处
理某一步骤的时候,可能由于异常原因导致锁无法释放,从而出现卡死情况,导致Procedure 迟迟
不能结束。
示例说明:Hbase 的assign region *** 作是一个Procedure,在此过程中,Procedure 会对这个region进行上锁 *** 作,上锁的目的是为了防止在此过程中有其他用户去这个region 执行 *** 作,如unassignregion、drop 该region 所对应的表,从而导致Hbase 集群中数据出现不一致情况。但是如果在assign region 的时候,由于一些异常情况,导致迟迟无法分配完成,更加糟糕的是如果这个region 恰恰就属于meta 表,那么就会出现Hbase 的HMaster服务一直处于正在初始化状态,从而导致整个Hbase集群不可用,如下图:
Procedure 在执行过程中,可能会持有两类锁:
- IdLock:Procedure 层级的锁,保证一个Procedure 不会被多个线程同时执行。
- 资源锁:对Hbase 内部的资源进行加锁,不同的Procedure 加锁的粒度是不同的,目前有region、table、namespace、region server 层级
所有Procedure记录和状态在Hbase的ui上可以看到:
HBCK 工具命令格式HBCK 工具包的使用方式如下:
hbase hbck -jHBCK 功能<命令参数>
1. bypass
bypass 命令可以将卡住的一个或多个Procedure 释放掉。命令如下:
hbase hbck -j-skip bypass [options]
其中Procedure PID 可以在Hbase Master UI 中查看。
[options]的值可以是:
• -o,在执行bypass 之前会先尝试获取IdLock 对象,如果Procedure 还在运行就可能会导致
无法获取到ldLock,从而导致执行超时返回null,一旦设置了-o 参数,即使拿不到ldLock 对
象,也会将Procedure 的bypass flag 设置为true。
• -r,一个Procedure 可能会拥有子Procedure,一旦设置了-r 那么就会递归bypass,将该
Procedure 的所有子任务也bypass 掉。
• –w,设置等待获取idlock 的超时时间,默认是1ms。
2. assign
该命令的作用就是将region 再次随机分配到别的机器上,返回值如果是-1 表示执行失败,其他值则
是Procedure 的PID,表示命令执行成功。命令如下:
hbase hbck -j-skip assigns [options]
[options]的值可以是:
• -o ,此处的-o 参数和bypass 的-o 参数意义不同,assign 命令是新创建一个Procedure,因
此与其他procedure 的IdLock 不冲突,但是如果其他的procedure 是因为资源锁而卡住的话,
就会影响assign 的Procedure,-o 的作用就是释放掉资源锁,防止因锁资源而出现卡死情
况。
3. unassign
该命令可以将一个或者多个region unassign 掉。该命令的返回值为-1 表示执行命令失败,返回值
为其他时表示命令执行成功,返回值为创建的Procedure PID。
hbase hbck -j-skip unassigns [options]
[options]的值可以是:
• -o,-o 和assign 的-o 参数作用一样,不再赘述。
4. setTableState
HbaseTable 可能的状态有ENABLE、DISABLE、DISABLING、ENABLING。
当Table 的状态和所有的region 状态不一致的时候可以使用此命令进行修复。
hbase hbck -j-skip setTableState
5. replication
在副本待删除队列中查找指定表所属的副本,并且删除。
hbase hbck -j-skip replication
6. filesystem
检查指定表的HFile 文件。
hbase hbck -j-skip filesystem
7. reportMissingRegionsInmeta
检查指定表或者指定命名空间是否存在丢失region。
hbase hbck -j-skip reportMissingRegionsInmeta
8. addFsRegionsMissingInmeta
这个和reportMissingRegionsInmeta 功能结合使用,当执行reportMissingRegionsInmeta 命令发现
有missing 的regions,可以执行此命令进行修复,能够修复成功的前提是region 虽然missing,但
是所属的HFile 在HDFS 上还存在。
hbase hbck -j-skip addFsRegionsMissingInmeta
9. setRegionState
此命令可以将指定的region 设定到指定状态,此命令慎用,用户手动执行后,可能会导致region
出现数据不一致情况。
hbase hbck -j-skip setRegionState
这里需要注意的是,通过此功能仅仅是更新了Hbase meta 表中的对应region 的状态值。
region 可能存在的状态有:OFFLINE,OPENING,OPEN,CLOSING,CLOSED,SPLITTING,
SPLIT , FAILED_OPEN , FAILED_CLOSE , MERGING , MERGED , SPLITTING_NEW ,
MERGING_NEW,BNORMALLY_CLOSED。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)