HBaseFsck (HBCK)工具可以检测 HBase 集群中 Region 的一致性和完整性,同时可以对损坏的集群进行修复。
HBCK 主要工作在两种模式下:一致性检测只读模式和多阶段修复模式。
HBase 集群一致性状态
HBase 集群一致性主要包括两个方面:
- HBase Region 一致性:集群中所有 Region 都被 assign,而且 deploy 到唯一一台 RegionServer 上,并且该 Region 的状态在内存中、hbase:meta 表中以及 ZooKeeper 这三个地方需要保持一致。
- HBase 表完整性:对于集群中任意一张表,每个 rowkey 都仅能存在于一个 Region 区间。
HBCK 的集群一致性状态检测
执行 hbase hbck 命令来检查 Hbase 集群是否存在损坏,命令执行后,在窗口中输出集群所有 Region 一致性和完整性的检查信息,并在最后输出检查结果:OK 或者 INCONSISTENCIES。
通常需要执行多次 hbck 命令以防止部分 Region 出现临时性的非一致性状态,比如刚好有些 Region 在执行 split、merge 或者 move 操作。一个好的运维习惯是,间隔性(比如每天晚上执行)地执行 hbck 命令,并在多次出现不一致的情况下发出报警信息。集群如果存在不一致的 Region,HBCK 会在窗口输出基本的报告信息,可以加上 -details 选项来获取更多的细节:
有时候集群规模很大,包含几万甚至几十万的 Region,对整个集群执行一次 hbck 命令可能会比较耗时。HBCK 允许管理员通过如下方式只针对某些表进行一致性、完整性检测。
hbase hbck tableName1 tableName2 ……
如果发现集群有不一致的情况,就需要尝试进行修复。
集群修复的基本原则是首先修复低风险的 Region 一致性问题(以及部分表完整性问题),再谨慎修复部分高风险的表完整性问题(overlap问题)。
HBCK 的局部低危修复
低风险的 Region 一致性问题修复是指,这类修复仅仅涉及 Master 内存中 Region 状态、ZooKeeper 临时节点中 Region 状态以及 hbase:meta 元数据表中 Region 状态的修改,并不实际修改任何 HDFS 文件。修复成功之后,Region 的状态在 .regioninfo 文件、Master 内存、ZooKeeper 临时节点和 hbase:meta 元数据表中保持一致。
Region 一致性问题修复有两个基本选项:
- -fixAssignments :修复 assign 相关问题,如没有 assigned、assign 不正确或者同时 assign 到多台 RegionServer 的问题 Regions。
- -fixMeta:主要修复 .regioninfo 文件和 hbase:meta 元数据表的不一致。修复原则是以 HDFS 文件为准。如果 Region 在 HDFS 上存在,但在 hbase:meta 表中不存在,就会在 hbase:meta 表中添加一条记录。反之如果在 HDFS 上不存在,而在 hbase:meta 表中存在,就会将 hbase:meta 表中对应的记录删除。
除了 Region 一致性问题是低风险问题之外,部分表完整性问题的风险也不高。最典型的就是 HDFS Region 空洞(HDFS Region holes)。
这类问题可以添加 -fixHdfsHoles 选项进行修复,这个命令会在空洞形成的地方填充一个空 Region。另外,这个命令通常不单独使用,而是和 -fixMeta、-fixAssignments一起使用:
hbaes hbck -fixAssignments -fixMeta -fixHdfsHoles
或者使用选项 -repairHoles,等价于上述命令:
hbase hbck -repairHoles
HBCK 的高危修复
Region 区间 overlap 相关问题的修复属于高危修复操作,因为这类修复通常需要修改 HDFS 上的文件,有时甚至需要人工介入。对于这类高危修复,建议先执行 hbck -details 命令,详细了解更多的问题细节,再执行相应的修复命令。建议在 overlap 分析的基础上使用 merge 命令,强制将存在 overlap 的相关 Region 全部合并到一起。需要注意的是,对于多个 Region,需要两两合并,之后对合并后的 Region 执行 MajorCompaction,再两两合并。
HBase version file 丢失
HBase 集群启动时会加载 HDFS 上的 version file(/hbase-root/hbase.version)来确定 HBase 的版本信息,如果该文件丢失或损坏,则系统无法正常启动。此时可以使用如下命令进行修复,命令会重新生成一份 hbase.version 文件,文件中 HBase 集群版本信息来自当前运行的 HBCK 版本。
hbase hbck -fixVersionFile
对于 HBCK 工具,总结最好的实践方式如下:
- 周期性地多次执行 hbck 命令,对集群进行定期体检,如果发现异常则报警。
- 若能对表执行 hbck 修复,就对表进行修复,而不要对整个集群进行修复操作。
- 大多数导致集群不一致的问题是“ not deployed on any region server ”,可以放心使用 -fixAssignments 进行修复
- 对于其他 overlap 的情况,需要管理员认真分析,再谨慎使用 hbck 命令进行修复。如果可以手动修复,建议手动修复。
- 如果使用 HBCK 工具无法修复集群的不一致,需要结合日志进行进一步分析,决定修复方案。
《Hbase 原理与实践》笔记