专栏首页Liusy01ZK数据一致性以及Leader选举

ZK数据一致性以及Leader选举

上两篇介绍了ZK的基础信息以及如何使用ZK实现分布式锁,今儿就来看看ZK是如何保持数据一致性以及ZK中Leader是如何进行选举的。

一、数据一致性

Zookeeper保持数据一致性使用的是ZAB协议。ZAB协议包含两种模式,一是消息广播模式,二是崩溃恢复模式。

(1)消息广播模式(两阶段提交+过半写机制) 具体流程如下:

1、客户端发起写操作,leader接收到写请求

2、leader服务器将客户端请求转化成proposal提案,同时为每个proposal分配一个全局唯一的ID,即ZXID。

3、leader与每个follower节点都维持着一个队列,leader将proposal请求发送到每个队列中(同时也发送给自己)。

4、follower从队列中获取执行成功之后(写入到本地事务中),向leader发送一个ack响应。

5、当leader节点收到半数以上follower的ack响应之后,就会发送commit请求给follower。

(2)崩溃恢复模式

在消息广播时可能会发生如下两种情况:

1、leader执行commit了,但是在给follower发送commit的时候leader宕机了。

2、leader在发送proposal给follower之前,leader宕机了。

针对情况一:

Zookeeper选举出新的leader之后,leader回去检查磁盘上是否存在未commit的消息,如果存在,继续检查follower节点有没有对该请求进行commit,如果有过半节点返回了ACK,但是没有commit,那么新的leader需要完成commit操作。

针对情况二:

此情况下客户端的请求是失败的,假设过了一段时间以后leader节点又恢复了,不过这个时候角色就变为了follower了,它在检查自己磁盘的时候会发现自己有一条消息没有进行commit,此时就会检测消息的编号(也就是ZXID),由高32位和低32位组成,高32位是用来体现是否发生过leader切换的,低32位就是展示消息的顺序的。这个时候当前的节点就会根据高32位知道目前leader已经切换过了,所以就把当前的消息删除,然后从新的leader同步数据,这样保证了数据一致性。

二、leader选举

(1)先看一下在集群初始化时候的leader选举

1、假如现在有两台服务器,分别如下

node-1和node-2,myid是节点在集群中的唯一id,每台机器固定的,ZXID是事务id,因为是初始化,所以默认是0

2、因为一台机器无法进行leader选举,所以启动两台机,两台机启动后,就可以进行leader选举了

3、此时每台机在第一轮投票的时候都会把票投给自己,并把投票信息发送给其他机器,投票信息是以(myid,ZXID)为格式的。所以node-1会将(1,0)发给node-2,node-2会把(2,0)发给node-1。

此时两个节点的所有投票信息如下:

node-1:(1,0),(2,0)

node-2:(1,0),(2,0)

4、每个节点上会进行投票的pk,pk的优先权如下,ZXID大的优先作为leader,如果ZXID一样,则myid大的作为leader,所以此时两个节点的投票pk结果如下:

node-1:(2,0)

node-2:(2,0)

5、统计投票信息

如果某个节点的投票信息超过半数,则为leader,那么此时统计之后发现投给node-2的有两个,已经超过半数,那么node-2就是leader

(2)集群在运行过程中leader宕机,此时的leader选举

大致流程跟初始化时差不多,只是在每个节点接受其他节点投票信息之后会加一个判断,判断选举轮次。此时有三种情况:

1>外部投票选举轮次大于自己的轮次,则会立即更新自己的轮次,然后清空已经接收到的选票。然后使用初始化的选票来PK刚刚的外部投票以确定是否变更自己的投票(PK的规则跟概述里描述一致)。

2>外部投票的选举轮次小于自己的轮次,那么直接忽略该外部选票,不做任何处理。

3>外部投票的选举轮次等于自己的轮次,就进行选票PK。

接下来就是选票PK(PK规则依然是ZXID优先,依次是myid),统计选票,直至选出leader为止。

流程图如下:(侵删!)

在第1步会进行逻辑时针的递增。也就是投票轮次。

在第4步会判断当前Zookeeper的状态:

ZooKeeper的服务有四个状态:LOOKING, FOLLOWING, LEADING, OBSERVING

LOOKING:寻找Leader的状态。

FOLLOWING:跟随者状态。

LEADING:领导者状态。

OBSERVING:观察者状态。

如果当前服务的状态是LOOKING,那么说明还没选举出来Leader,继续下面的步骤,正常情况下一开始都是LOOKING的状态。

其中4-9会经过几轮循环直到Leader产生。

本文分享自微信公众号 - Liusy01(Liusy_01),作者:Liusy01

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Thread、ThreadLocal源码解析

    (1)首先看一下线程的构造方法,之后会说每种参数的用法,而所有的构造函数都会指向init方法

    Liusy
  • 开篇!JAVA线程池

    由于工作中基本都是CRUD操作,对线程池不常用,所以一直没去具体了解过其底层原理,但是在工作、健身之余一直有一颗躁动的心,想在技术上浸淫的更深入一点...

    Liusy
  • 类加载器ClassLoader

    上篇文章说到,Class类可以通过一个类的全限定名去加载类,那么底层是如何去加载的呢?这就是我们今天要聊的类加载器ClassLoader,其可以通过一个类的全限...

    Liusy
  • 高情商技术管理者必备的5项特质

    高情商,能够帮助技术leader事半功倍的管理好团队。高情商技术管理者,要有什么特质呢?

    架构师之路
  • 【工作经验分享】:在滴滴和头条干了 2 年开发,这些太真实…

    先简单交代一下背景吧,某不知名985的本硕,17年毕业加入滴滴,今年下半年跳槽到了头条,一直从事后端研发相关的工作。

    Android技术干货分享
  • 回答老板“明白了”,可真的明白了吗?

    昨天被一个下属气着了,和他交代了一个很重要的事情,反复确认“清楚了吗?”,反复回答“清楚了”,可结果仍不是自己想要的。

    架构师之路
  • 请品鉴我的vim配置

    背景 本人是生信工程师,主要使用的语言是 python, R, perl, shell,经常要ssh到远程服务器上写代码,因此学习了vim,后来发现了spf13...

    生信技能树
  • 面试官:说一下Zookeeper的ZAB协议?敖丙:不好意思我肚子疼!

    Zab(Zookeeper Atomic Broadcast)是为ZooKeeper协设计的崩溃恢复原子广播协议,它保证zookeeper集群数据的一致性和命令...

    敖丙
  • 分布式系统下如何进行数据复制?(下)

    对于single-leader的数据复制模式,并且我们选择了异步的方式对数据进行处理。假如写入数据和读取数据都出现了并发的情况,显然数据会出现短时...

    哒呵呵
  • zookeeper系列(一)——简介和原理

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    逝兮诚

扫码关注云+社区

领取腾讯云代金券