分布式进阶__zookeeper的zab协议工作原理之 崩溃恢复模式

上篇 zookeeper的zab协议工作原理之 原子广播 介绍了 zookeeper 广播的原理。

下篇 来详细的讲解 崩溃恢复模式 的原理

一、什么情况下zab协议会进入崩溃恢复模式?

   1、当服务器启动时

    2、当leader 服务器出现网络中断,崩溃或者重启的情况

    3、当集群中已经不存在过半的服务器与Leader服务器保持正常通信。

二、zab协议进入崩溃恢复模式会做什么?

    1、当leader出现问题,zab协议进入崩溃恢复模式,并且选举出新的leader。当新的leader选举出来以后,如果集群中已经有过半机器完成了leader服务器的状态同(数据同步),退出崩溃恢复,进入消息广播模式。

  2、当新的机器加入到集群中的时候,如果已经存在leader服务器,那么新加入的服务器就会自觉进入崩溃恢复模式,找到leader进行数据同步。

三、特殊情况下需要解决的两个问题:

  1、已经被处理的事务请求(proposal)不能丢(commit的)

     2、没被处理的事务请求(proposal)不能再次出现

什么时候会出现事务请求被丢失呢?

  当 leader 收到合法数量 follower 的 ACKs 后,就向各个 follower 广播 COMMIT 命令,同时也会在本地执行 COMMIT 并向连接的客户端返回「成功」。但是如果在各个 follower 在收到 COMMIT 命令前 leader 就挂了,导致剩下的服务器并没有执行都这条消息。

如何解决 已经被处理的事务请求(proposal)不能丢(commit的)呢?

 1、选举拥有 proposal 最大值(即 zxid 最大) 的节点作为新的 leader:由于所有提案被 COMMIT 之前必须有合法数量的 follower ACK,即必须有合法数量的服务器的事务日志上有该提案的 proposal,因此,zxid最大也就是数据最新的节点保存了所有被 COMMIT 消息的 proposal 状态。

 2、新的 leader 将自己事务日志中 proposal 但未 COMMIT 的消息处理。  3、新的 leader 与 follower 建立先进先出的队列, 先将自身有而 follower 没有的 proposal 发送给 follower,再将这些 proposal 的 COMMIT 命令发送给 follower,以保证所有的 follower 都保存了所有的 proposal、所有的 follower 都处理了所有的消息。通过以上策略,能保证已经被处理的消息不会丢。

问题二出现的场景是:

    当 leader 接收到消息请求生成 proposal 后就挂了,其他 follower 并没有收到此 proposal,因此经过恢复模式重新选了 leader 后,这条消息是被跳过的。 此时,之前挂了的 leader 重新启动并注册成了 follower,他保留了被跳过消息的 proposal 状态,与整个系统的状态是不一致的,需要将其删除。

解决方案是:

 Zab 通过巧妙的设计 zxid 来实现这一目的。一个 zxid 是64位,高 32 是纪元(epoch)编号,每经过一次 leader 选举产生一个新的 leader,新 leader 会将 epoch 号 +1。低 32 位是消息计数器,每接收到一条消息这个值 +1,新 leader 选举后这个值重置为 0。这样设计的好处是旧的 leader 挂了后重启,它不会被选举为 leader,因为此时它的 zxid 肯定小于当前的新 leader。当旧的 leader 作为 follower 接入新的 leader 后,新的 leader 会让它将所有的拥有旧的 epoch 号的未被 COMMIT 的 proposal 清除。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构沉思录

缓存的正确使用方式,你都会了吗?

首先,缓存由于其适应高并发和高性能的特性,已经在项目中被广泛使用。在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。

14210
来自专栏腾讯移动品质中心TMQ的专栏

接口测试理论与实践 ——PiTest + GT双管齐下,专治各种接口测试

最近做接口测试比较多,这里做一个小小的总结,也可以帮助接口测试的同学快速上手。 首先,在做接口测试前,我们来想一想: 接口测试是什么?——含义 接口测试测什么...

27470
来自专栏IT技术精选文摘

一文了解Zookeeper

相信大家对 ZooKeeper 应该不算陌生。但是你真的了解 ZooKeeper 是个什么东西吗?如果别人/面试官让你给他讲讲 ZooKeeper 是个什么东西...

19830
来自专栏Java进阶

zookeeper的zab协议工作原理之 崩溃恢复模式

46270
来自专栏LIN_ZONE

类似于qq空间类型的评论和回复

最近学习thinkphp,做了一个博客系统,其中感觉实现一个类似于qq空间的评论和回复功能比较复杂,所以把这次的经历记录下来,与大家共勉,具体的方法就不说了,在...

17720
来自专栏黑泽君的专栏

进程和线程的概述

11610
来自专栏Android群英传

Xposed加载JNI库

19210
来自专栏黑泽君的专栏

linux命令 uname -r 和 uname -a 的解释与演示

1、uname -r : 显示操作系统的发行版号 2、uname -a :显示系统名、节点名称、操作系统的发行版号、内核版本等等。

30810
来自专栏IT笔记

记一次文件转换服务升级"笔录"

背景 文件转换平台诞生于2015年7月17日,当时的主要业务需求是实现文件上传、转换(word->pdf->swf)、展示(类似于百度文库)的功能,由此她就出生...

35660
来自专栏决胜机器学习

PHP网络技术(三)——CURL实现跨服务取接口功能

PHP网络技术(三)——CURL实现跨服务取接口功能 (原创内容,转载请注明来源,谢谢) PHP的curl类库,可以实现远程访问、页面抓取、表...

46440

扫码关注云+社区

领取腾讯云代金券