1. 崩溃恢复

	a). leader选择过程可以保证新leader是ZXID最大的节点
b). ZAB协议确保丢弃那些只在leader上被提出的事务,场景 leader发出PROPOSAL收到ACK,但是发出COMMIT前产生崩溃,则新的群组会丢弃这条消息

2. Leader选举过程

2.1 服务器状态

LOOKING 系统刚启动或Leader崩溃后选举状态,认为当前集群中没有leader,因此要进入选举流程

FOLLOWING 跟随者状态,角色是Follower

LEADING 领导者状态,leader

OBSERVING 观察者状态(只支持查询,不参与选举),Observer

2.2 投票数据结构-Vote

id		被推举的Leader的SID值
zxid 被推举的Leader的事务ID
electionEpoch 逻辑时钟,用来判断多个投票是否在同一轮选举周期中。该值在服务端是一个自增序列。
每次进入新一轮的投票后,都会对该值进行加1操作。
peerEpoch 被推举的Leader的epoch值
state 当前服务器的状态

2.3 QuorumCnxManager-Server Socket负责选举

a). 每台服务器启动时都会启动一个QuorumCnxManager--Server Socket,负责服务器之间的Leader选举过程。
b). 内部维护几个队列,每个队列又是按SID分组的队列集合
recvQueue 选票接收队列
queueSendMap 待发送的消息,内部按SID为每台机器分配了一个单独队列,保证互补影响
sendWorkerMap 负责消息发送,也按SID进行了分组
lastMesageSent 最近发送的消息,按SID进行分组
c). 建立连接, 集群中机器需要进行两两连接,规则"只允许SID大的机器主动和其它机器进行连接,否则断开连接"来防止重复连接 d). 当服务器检测到当前服务器状态变成LOOKING时,就会触发leader选举
0).如果已存在leader,则发送选票后会被告知leader的信息,直接连接即可,不需要进行后续步骤 1). 自增选举轮次,在FastLeaderElection实现中有一个logicalclock属性,用来标识当前Leader选举轮次,ZK规定所有投票必须
在同一个轮次,server开始新一轮投票前会进行自增操作。 2). 初始化选票(第一次先投票给自己),参照前面的Vote结构
3). 发送初始化选票 4). zk从reeviveQueue接收外部投票
如果zk发现自己无法获得任何投票,则马上检查是否与其他zk保持了有效连接,无则建立,并再次发送自己当前的内部投票 5). 判断选举轮次(接收到的外部投票)
I). 外部投票轮次大于内部投票 立即更新自己的选举轮次(logicalclock),并清空已收到的所有投票,然后使用初始化的投票来PK(第6步)
是否变更内部投票,最终再将内部投票发送出去。
II). 外部投票的轮次小于内部投票 zk直接忽略该投票,不做任何处理,返回步骤4
III). 内外部轮次一致 开始选票PK 6). 选票PK 比较顺序从先到后依次是 轮次 > ZXID > SID ,3种比较都是 "外部大于内部,则进行投票变更” 7). 投票变更 用外部投票的信息覆盖内部投票,变更完成后,再次将这个投票信息发送出去 8). 选票归档 无论是否进行了选票变更,都会将刚刚收到的那份外部投票放入选票集合"recvset"中,recvset内部按SID存在本轮次收到的所有外部投票
9). 统计投票 完成选票归档以后,就开始统计投票。如果确定已经有超过半数的服务器认可了该内部投票,则终止投票。
否则返回步骤4. 10). 如果可以终止投票(再等待200ms来确定是否有更优的投票),则更新服务器状态
首先判断投票选出的Leader是否是自己,然后更具情况更新自己状态为LEADING/FOLLOWING/OBSERVING 11). 选出Leader后,所有learner向leader发送LEARNERINFO消息,等待超过半数的learner连接完成后(取他们最大的epoch当做leader的epoch值) 12). leader向learner发送LEADERINFO消息,learner从中解析出epoch和ZXID,然后向Leader反馈一个ACKEPOCH 13). Leader接收到该Learner的ACK后就开始与其进入”数据同步“环节

Zookeeper崩溃恢复过程(Leader选举)的更多相关文章

  1. ZooKeeper集群与Leader选举

    说说你对ZooKeeper集群与Leader选举的理解?   ZooKeeper是一个开源分布式协调服务.分布式数据一致性解决方案.可基于ZooKeeper实现命名服务.集群管理.Master选举.分 ...

  2. MySQL · 引擎特性 · InnoDB 崩溃恢复过程

    MySQL · 引擎特性 · InnoDB 崩溃恢复过程 在前面两期月报中,我们详细介绍了 InnoDB redo log 和 undo log 的相关知识,本文将介绍 InnoDB 在崩溃恢复时的主 ...

  3. Zookeeper入门(四)之Leader选举

    让我们分析如何在ZooKeeper集合中选举leader节点.考虑一个集群中有N个节点.leader选举的过程如下: 所有节点创建具有相同路径 /app/leader_election/guid_ 的 ...

  4. Zookeeper——分布式一致性协议及Zookeeper Leader选举原理

    文章目录 一.引言 二.从ACID到CAP/BASE 三.分布式一致性协议 1. 2PC和3PC 2PC 发起事务请求 事务提交/回滚 3PC canCommit preCommit doCommit ...

  5. Zookeeper之Leader选举过程

    Leader在集群中是一个非常重要的角色,负责了整个事务的处理和调度,保证分布式数据一致性的关键所在.既然Leader在ZooKeeper集群中这么重要所以一定要保证集群在任何时候都有且仅有一个Lea ...

  6. 学习Leader选举算法

    读书笔记:<从Paxos到Zookeeper 分布式一致性原理与实践> 选举的前提约定 观察者不参与选举,只有跟随者才参与选举. 优先选事务ID(ZXID)大的,事务Id相同再优先选服务器 ...

  7. MySQL · 引擎特性 · InnoDB崩溃恢复

    前言 数据库系统与文件系统最大的区别在于数据库能保证操作的原子性,一个操作要么不做要么都做,即使在数据库宕机的情况下,也不会出现操作一半的情况,这个就需要数据库的日志和一套完善的崩溃恢复机制来保证.本 ...

  8. 【分布式】Zookeeper的Leader选举-选举过程介绍(经典的Paxos算法解析)

    一.前言 前面学习了Zookeeper服务端的相关细节,其中对于集群启动而言,很重要的一部分就是Leader选举,接着就开始深入学习Leader选举. 二.Leader选举 2.1 Leader选举概 ...

  9. zookeeper集群搭建及Leader选举算法源码解析

    第一章.zookeeper概述 一.zookeeper 简介 zookeeper 是一个开源的分布式应用程序协调服务器,是 Hadoop 的重要组件. zooKeeper 是一个分布式的,开放源码的分 ...

随机推荐

  1. phpMailer在CentOS 6.5下无法发送邮件的解决办法

    作者:ffsystem 网站在Windows平台上开发测试,完成了后同步到CentOS6.5 Nigix运行.发现phpMailer组件无法与SMTP服务器建立连接,导致无法发送邮件. 错误代码: p ...

  2. 在Golang中使用C语言代码实例

    转自:http://www.jb51.net/article/56720.htm cgo 使得在 Golang 中可以使用 C 代码. Hello World 为了有一个较为直观的了解,我们来看一个简 ...

  3. SQL介绍(1)

    SQL 是用于访问和处理数据库的标准的计算机语言. SQL,指结构化查询语言,全称是 Structured Query Language. SQL 让您可以访问和处理数据库. SQL 是一种 ANSI ...

  4. java对单向单向链表的操作

    概述:众所周知,数据对于数据的存储时连续的,也就是说在计算机的内存中是一个整体的.连续的.不间断的ADT数据结构.伴随的问题也会随之出现,这样其实对于内存的动态分配是不灵活的.而链表具备这个优点.因此 ...

  5. linux 安装输入法

    简述 Ubuntu16.04安装完后,和12.04以及14.04都不一样,并没有中文输入功能.于是搜索一些安装中文输入法的方法. 开始安装了ibus pinyin输入法,但是系统重启之后发现有些时候不 ...

  6. Pig Flatten 解包操作,解元组

    Flatten Operator The FLATTEN operator looks like a UDF syntactically, but it is actually an operator ...

  7. 《精通Spring4.X企业应用开发实战》读后感第五章(通过编码方式动态添加Bean)

  8. php小块代码

    //页面本身网址 "http://".$_SERVER["HTTP_HOST"].preg_replace("/[^\/]+$/",&quo ...

  9. vivado中使用debug不能连接到vcse_server

    打开 Xilinx Design Tools -> ISE Design Suite 14.7 -> Accessories -> ISE Design Suite 64 Bit C ...

  10. ES Docs-3:Modifying Data

    Modifying Data Indexing/Replacing Documents curl -XPUT 'localhost:9200/customer/external/1?pretty' - ...