HMaster的failover 流程(二)

继续上一篇的master failover流程


master挂掉期间没有regionserver挂掉的情况。

昨天写着写着突然发现90 failover存在一个bug,今天测试了一下,果然存在。


当master处理zk上面的unassigned节点时,首先会去getchlidren。这个函数会获取zk unassigned节点

 

set watch(该节点删除触发nodedeleted事件,有子节点创建删除会触发nodeChildrenchanged)然后会对

 

unassigned下所有节点getdata(watch)并set watch。如果这些节点有些值为M_ZK_REGION_OFFLINE,会将该

 

region的regionstate置为offline,并加入rit队列,然后清空内存并重新assign出去。

 

这样做的目的是由于当ZK上该region的节点时offline时认为此时该region尚未open,需要重新分配。

 

但是有一个问题是如果这个时候region open的rpc请求已经发送出去了,那么在那台rs上面会继续处理open region这

 

个事件这样可能造成几个现象:

 

1.当rs把region open以后,master开始assign,那么该region就有可能被重新分配两次。

 

2.rs open region以后master assign到同一台机器,那么该assign过程中止,但是master 内存中该region数据已经

 

清空导致该无法进行banlance等操作。

 

3.由于assign动作中止,RIT中存在该region的数据且并未清除,当超时时间到以后,会重新assign,但是由于rit中的数

 

据和zk上的数据不匹配导致该region的数据一致存在RIT中,而且不分配,无法balance

 

该问题复现概率比较小,主要是由于master启动failover该查到的region在zk上处于offline状态,而且此时rs还在处理该

 

region。即在rs更新zk的offline状态到opening之间,failover启动并且开始assign。若要重现可在rs处理的过程sleep

 

一段时间,然后重启master。(ms rs发生gc时该问题可能出现概率比较大)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值