上一篇主要讨论了ZooKeeper对客户端节点发生故障时的处理情况。本文将主要对ZooKeeper中的Follower节点发生故障时的处理机制进行详细的讨论。我们知道,当某一个Follower或Observer发生故障时,与之直接相连的ZooKeeper客户端就不可能再从Follower或Observer收到正在处理的请求的响应包,因此,它会丢弃正在处理的请求,并通知客户。而ZooKeeper客户端则会重新选择一个Follower或Observer,并与之建立联系为客户端服务,请注意,这个过程对用户是透明的。
1.Follower在处理第2步之前发生故障,则处理情况如上所诉,只涉及到ZooKeeper客户端;若Follower在处理第2步之后发生故障,则,Leader最迟会在执行第3步的时候发现Follower发生了故障,尽管Leader发送的提案和提交,Follower收不到,Leader也不会收到Follower的投票,但这并不会影响Leader的处理,只要当前还有超过半数的follower存活着。
2.从上可以看出,单个Follower节点的实效对整个ZooKeeper服务集群根本就不会产生“任何”的影响,所以单个Follower在任何时刻的失效,系统仍然会比较稳定的继续运行。
在这里,可能有些人会问,如果某一个Follower实效,则Leader就不能得到该Follower管理的session的信息,之后Leader可能会误认为与该Follower相连的若干ZooKeeper客户端实效。没错,是这样的,但这种情况的处理同ZooKeeper客户端发生故障是一样的。