1      HBase数据路由

1、  从ZooKeeper中获取-ROOT- Region所在的RegionServer

2、  向-ROOT- Region所在的RegionServer发送Scan –ROOT-的RPC请求,来获取.META. Region 所在的位置。下图为-ROOT- Region里的具体内容

3、  向.META. Region所在的RegionServer发送Scan .META.的RPC请求,来获取User Region 所在的位置。下图为.META. Region的具体内容

4、  向User Region所在的RegionServer发送Scan .该User Region的RPC请求,来获取需要的数据。

2      元数据异常分类

由第一章的介绍,可以看出-ROOT- .META. Region中数据非常重要,如果-ROOT- .META. Region中的数据异常,将会导致整个集群的全部或者部分的User Region无法路由,集群将无法正常运行。

2.1      元数据全部丢失

元数据底层存储在HDFS上(以HFile形式存储),如果底层的文件块丢失,或者损坏,则会导致元数据全部丢失。

2.2      元数据部分丢失

.META.迁移后,会将其存储在-ROOT-中的位置更新为新的RegionServer的地址,同理User Region迁移后,也会将其存储在.META.中的位置更新为新的RegionServer的地址。但是更新并没有直接修改底层的存储文件,而是先写入HLog (存储在HDFS上,RegionServer宕机后,用来恢复数据),再写入内存,在满足一定条件的时候才会真正的更新到底层的存储文件(HFile),所以一旦HLog这个块异常,且RegionServer节点宕机(内存数据也丢失),这样就会导致在元数据中存储的位置没有得到更新。

3      HBase检查工具HBCK

HBase提供了一个检查工具HBCK,该工具可以检查出HBase常见的问题,并尝试修复部分问题。

执行方法:在安装的HBase客户端的bin目录下执行./hbase hbck。

注意: HBase某些正常流程(Region split, Region assign等),会导致HBCK检查出集群状态为异常。要确定集群异常,最好连续执行HBCK,且每次异常都相同,才能确定集群出现异常。下图为执行HBCK的检查结果为正常的集群。

4      -ROOT-数据丢失恢复

4.1      数据完全丢失修复

4.1.1        构造场景

进入HBase shell客户端执行如下命令删除-ROOT- Region中的所有数据

delete '-ROOT-', '.META.,,1', 'info:regioninfo'

delete '-ROOT-', '.META.,,1', 'info:server'

delete '-ROOT-', '.META.,,1', 'info:serverstartcode'

delete '-ROOT-', '.META.,,1', 'info:v'

4.1.2        HBCK检查现象

数据丢失后HBase集群没有重启时,HBCK检查现象

数据丢失,HBase集群重启后,HBCK检查现象

4.1.3        修复方案

1、  停止HBase集群。

2、  删除-ROOT-在HDFS路径下的所有数据。

执行方法:在HDFS客户端的bin路径下,执行./hdfs dfs –rm –r /hbase/-ROOT-

3、  启动HBase集群。

4、  集群恢复正常

4.2      部分数据丢失导致.META. Region位置错误修复

4.2.1        构造场景

进入HBase shell客户端执行如下命令修改.META. Region所在的RegionServer

put '-ROOT-', '.META.,,1', 'info:server', '160-172-0-13:26003'

注:主机名指定为集群中另外一台节点的主机名

4.2.2        HBCK检查现象

一直在试图扫描.META. Region 但是因为位置错误,导致一直在循环尝试。

4.2.3        修复方案

1、  重启HBase集群

2、  HBase集群恢复正常

5      .META.数据丢失恢复

5.1      数据完全丢失修复

5.1.1        构造场景

进入HBase shell客户端执行如下命令删除-ROOT- Region中的所有数据

 

delete '.META.', 'Region名', 'info:regioninfo'

delete '.META.', ' Region名', 'info:server'

delete '.META.', ' Region名', 'info:serverstartcode'

5.1.2        HBCK检查现象

5.1.3        修复方案

1、  进入HBase安装客户端的bin目录,执行./hbase hbck -repair

2、  HBase集群恢复正常

5.2      部分数据丢失导致User Region位置错误修复

5.2.1        构造场景

进入HBase shell客户端执行如下命令修改.META. Region所在的RegionServer

put '.META.', 'Region名','info:server','160-172-0-13:26003'

注:主机名指定为集群中另外一台节点的主机名

5.2.2        HBCK检查现象

5.2.3        修复方案

1、  进入HBase安装客户端的bin目录,执行./hbase hbck -repair

2、  HBase集群恢复正常

6      极端场景测试

现在来考虑-ROOT- .META.数据全部丢失的场景,若这种场景能够修复,那么部分元数据丢失的场景也能修复。因为可以强制将元数据表里的记录给全部删除(上述的所有场景均会被这种场景覆盖)。

6.1      构造场景:

1、  停止集群

2、  删除HBase在HDFS中存放的所有元数据。

进入HDFS客户端执行命令:

hdfs dfs -rm -r /hbase/.META.

     hdfs dfs -rm -r /hbase/-ROOT-

6.2      HBCK检查结果

因HBase集群已停止,所以先将HBase启动,再执行HBCK。

6.3      修复方案

1、  进入HBase安装客户端的bin目录,执行./hbase hbck -repair

2、  HBase集群恢复正常