2 通过hbck检测发现.META.表中出现空洞,具体log是:;Chain of regions in table ... is broken; edges does not contain ...
3 此时读写失败
复制代码
1 hbase发现无法写入
2 通过hbck检测发现.META.表中出现空洞,具体log是:;Chain of regions in table ... is broken; edges does not contain ...
3 此时读写失败
1 hbase发现无法写入2 通过hbck检测发现.META.表中出现空洞,具体log是:;Chain of regions in table ... is broken; edges does not contain ...3 此时读写失败
修复方法:直接使用check_meta.rb重新生成.META.表并修补空洞,但是会引起数据丢失。因为引起该空洞的原因是某个region的parent和daughter都被删掉了
查找故障过程非常复杂,具体就不提了,都是内伤啊...
故障原因需要从split的原理说起:
split是一个分布式的事务过程,由于分布式的复杂性,在每一步都有可能发生异常中止,因此每进行一步就要记录一下当前的状态。如果出错了,就根据己经进行的状态来进行对应的回滚操作。这个记录状态的变量在代码里体现为JournalEntry
于是split的过程是这样的:(见图)
2 通过hbck检查到集群有"Chain of regions in table …contains less elements than are listed in META; visited=”问题存在,意即META表中某些region出错,此时若用户有新的写入,则新的写入有可能会数据丢失。
3 通过1个多小时的修复,仍然没有将该集群状态无损还原。原因是出现了两个region服务同一段数据
1 用户发现tps有下降,且部分写入不正常。
2 通过hbck检查到集群有"Chain of regions in table …contains less elements than are listed in META; visited=”问题存在,意即META表中某些region出错,此时若用户有新的写入,则新的写入有可能会数据丢失。
3 通过1个多小时的修复,仍然没有将该集群状态无损还原。原因是出现了两个region服务同一段数据
1 用户发现tps有下降,且部分写入不正常。 2 通过hbck检查到集群有"Chain of regions in table …contains less elements than are listed in META; visited=”问题存在,意即META表中某些region出错,此时若用户有新的写入,则新的写入有可能会数据丢失。 3 通过1个多小时的修复,仍然没有将该集群状态无损还原。原因是出现了两个region服务同一段数据
修复方法:找到start_key和end_key相同的几个region,把它们的从hdfs上删除掉。然后用add_table重建meta表(会导致丢失数据)
这个过程也是一个hbase的bug产生的,这个bug来自于重启过程。复现问题也很容易,进行以下几步即可复现:
1 找到一台正在split的region所在的rs
2 kill掉该台rs
3 重启整个集群或master进行切换
原因分析:
当hbase的master在主从切换或者重启的时候,有一个步骤是切换之后的master需要对原来所有的挂掉的regionserver上的region进行processDeadRegion,即重新上线。
该过程在0.90.4之前存在一个bug,即会把meta表中所有处在split期间的region也进行处理,虽然region在meta表中处于split状态并不能证明它己经split结束还是正在split(要对split状态进行标记还是很复杂的,因此目前的代码还没有对split状态进行记录,只能通过一些辅助手段,比如检查子region的状态来说明region是否处于split状态),但是万一它己经split结束的话是绝对不应该上线的。因此有可能一个region己经split结束,但它在这个处理过程中又被新起的master上线了,这就导致父子region同时服务了。而父region上线后又有可能继续split,导致状况更加糟糕,同一段数据被两个region服务,等等。
正确的处理办法是在重启时检查这些region的子region状态,具体检查方案在hbase-0.90.4中己经给出,可参见HBASE-3946。注意:打上3946的patch以后,还必须要打上3995的patch,否则单元测试无法通过。