ZooKeeper源码分析十七之崩溃恢复

一、崩溃恢复

崩溃恢复一般指当前集群中不存在Leader节点时,此时集群处于一个崩溃的状态需要及时的选举出新的Leader,然后进行数据一致性处理,Leader崩溃是指,Leader节点退出或者重启以及集群中半数Follower不能与Leader保持通信,此时认为处于崩溃状态。针对这几种情况从源码角度分析集群的恢复过程。

1、Leader宕机或者重启
出现这种情况是,集群中的Follower节点会重新选举新的Leader节点,此时我们从Follower节点来分析,新的Leader发起过程。在完成Leader选举之后,Follower节点会阻塞在follower.followLeader()方法调用。followLeader方法会循环接收和处理Leader同步的数据,当Leader宕机或者重启之后,Follower就会关闭当前的socket连接然后退出循环,followLeader()不在阻塞。

     case FOLLOWING:
          try {
           setFollower(makeFollower(logFactory));
           follower.followLeader();
          } catch (Exception e) {
          } finally {
               //关闭follower
               follower.shutdown();
               //follower置空
               setFollower(null);
               //更新当前节点状态为LOOKING
               updateServerState();
          }
    break;

follower.shutdown():
Follower关闭会先关闭所有客户端的连接,把当前的ZooKeeperServer置空,关闭与Leader的连接(如果存在),调用ZooKeeperServer的关闭方法,如果当前与Leader节点同步方式是SNAP还会清空当前的数据库中的数据。也就是说当Leader节点崩溃之后,所有的Follower节点会重新更新节点状态为LOOKING,并恢复节点中各种数据状态,此时开启新一轮的选举过程。

2、过半Follower不能与Leader通信

对于不能与Leader通信的Follower节点会自动更新当前的状态为LOOKING,然后开启新的集群选举过程,此时还有少量机器和Leader节点还是处于正常状态,我们从Leader角度去分析。Leader的lead方法会通过LearnerHandler去与集群中Learner节点建立连接,然后再通过while循环不断的与Learner进行心跳检测。

在心跳检测的while循环中,会通过SyncedLearnerTracker实例来检测当前保持正常通行的Learner,LearnerHandler中当与Learner断开通信后会,run方法随之也会执行完成,此时SyncedLearnerTracker会把断开通信的Learner节点添加到集合中,如果过半节点失去通信,则退出当前循环,此时Leader节点会断开所有的Learner之间的通信,然后调用shutdown方法。此时lead方法不再阻塞。然后置空当前的leader状态,然后设置节点状态为LOOKING,同时所有的Learner节点也会被置为LOOKING状态,此时会开启新一轮的Leader选举过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟+1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值