集群个数:

  2n+1,因为集群当宕机大于等于二分之一的机子时,集群选举会失败。故 2n+1台机器和3n台机器可靠性相同

Leader的作用:

  为了实现各个节点数据的一致性,需要一个负责协调数据同步的操作,从而减小数据同步的复杂性

2PC(俩阶段提交):

ZAB协议(支持崩溃恢复的原子广播协议):

俩种基本模式:1. 崩溃恢复  2. 原子广播

当leader出现网络中断,宕机等情况时,ZAB协议就会进入恢复模式选取新leader,当 leader 服务器选举出来后,并且集群中有过半的机器和该 leader 节点完成数据同步后(同步指的是数据同步,用来保证集群中过半的机器能够和 leader 服务器的数据状态保持一致),ZAB 协议就会退出恢复模式,进入广播模式,此时leader正常工作,当启动新的机器时,该机器即进入数据恢复模式,与leader同步数据

消息广播的实现原理:

集群收到客户端的事务操作,将事务转发给leader,leader将消息赋予全局唯一的64位自增ID(ZXID),Leader将消息放入FIFO(First Input First Output)队列中,将带有zxid的消息作为一个Proposal(提议)发送给Follower,当 follower 接收到 proposal,先把 proposal 写到磁盘,写入成功以后再向 leader 回复一个 ack,只要超过半数节点反馈写入成功,leader发送commit消息,则这次事务操作提交(类似2PC)

崩溃恢复(数据恢复):

当Leader发送无法连接,宕机等情况时导致leader失去了与过半follower的联系时,则会进入崩溃恢复模式。同时需要满足俩点:

1. 已被处理的消息不可以丢失

  当leader在处理事务,且已经有节点收到了commit事务时,leader失去与其他follower的联系导致其他节点没有commit事务,此部分数据视为已处理消息,不可以丢失

2. 被丢弃的消息不可以再出现

  当leader在处理事务,且再发送commit提交事务前,leader宕机,此消息视为被丢弃消息。在重新选取leader后,原leader被重启,重新加入集群,原leader中未被体提交的数据需要被删除

为了满足上述俩个要求,需要设计一个leader选举算法

leader需要拥有最大zxid(事务id),这使得leader保存了所有已经被commit的事务。

  ZXID是一个64位自增的事务id,它包括前32位epoch编号,后32位消息计数器。每当zookeeper重新选举leader时,epoch就会+1,同时消息计数器重置为0。通过epoch编号,当老的leader重新接入时,可以通过epoch清楚旧的未commit得事务。

Leader选举:

结果,投票时,优先投票zxid最大,相同则投票myid最大的节点

过程:当节点启动时,节点进入LOOKING状态,处于观望状态,接下来就开始进行选主流程。起初每个节点会将自己作为leader投票,将自己的 zxid,myid,epoch发送给其他节点。当节点接受到其他节点的投票时,会判断其他节点投票的有效性(epoch是否为本轮编号,是否为LOOKING状态等),如有效,则通过比较 ZXID,MYID与自己的投票PK,将ZXID,MYID最大的重新投票。当leader选取好后,后加入的节点则作为follower(不考虑observer)

例:

1,2,3三台机子,epoch相等。按1,2,3启动,当1,2启动时,通过上述方式,选取2为leader,当3启动时,因leader已选取好,故自己作为follower

ZOOKEEPER进阶的更多相关文章

  1. 【进阶】ZooKeeper 相关概念总结

    1. 开卷有益 学习是一种习惯,只有把这种习惯保持下来,每天不学习一点就感觉浑身不自在,达到这样的境界,那么你成为大佬也就不远了买,正如我们标题所写的"开卷有益".人生匆匆,要想过 ...

  2. 分布式进阶(十六)Zookeeper入门基础

    Zookeeper入门基础 前言 在Zookeeper中,znode是一个跟Unix文件系统路径相似的节点,可以往这个节点存储或获取数据.如果在创建znode时Flag设置为EPHEMERAL,那么当 ...

  3. 分布式系统理论进阶 - Raft、Zab

    引言 <分布式系统理论进阶 - Paxos>介绍了一致性协议Paxos,今天我们来学习另外两个常见的一致性协议——Raft和Zab.通过与Paxos对比,了解Raft和Zab的核心思想.加 ...

  4. Zookeeper集群的安装和使用

    Apache Zookeeper 由 Apache Hadoop 的 Zookeeper 子项目发展而来,现已经成为 Apache 的顶级项目,它是一个开放源码的分布式应用程序协调服务,是Google ...

  5. Zookeeper从入门到精通(开发详解,案例实战,Web界面监控)

    ZooKeeper是Hadoop的开源子项目(Google Chubby的开源实现),它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.命名服务.分布式同步.组服务等. Zookee ...

  6. zookeeper 入门系列-理论基础 – zab 协议

    上一章讨论了paxos算法,把paxos推到一个很高的位置.但是,paxos有没有什么问题呢?实际上,paxos还是有其自身的缺点的: 1. 活锁问题.在base-paxos算法中,不存在leader ...

  7. Spark进阶之路-Spark HA配置

    Spark进阶之路-Spark HA配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 集群部署完了,但是有一个很大的问题,那就是Master节点存在单点故障,要解决此问题,就要借 ...

  8. Scala进阶之路-Spark独立模式(Standalone)集群部署

    Scala进阶之路-Spark独立模式(Standalone)集群部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们知道Hadoop解决了大数据的存储和计算,存储使用HDFS ...

  9. Java进阶资料汇总

    Java经过将近20年的发展壮大,框架体系已经丰满俱全:从前端到后台到数据库,从智能终端到大数据都能看到Java的身影,个人感觉做后台进要求越来越高,越来越难. 为什么现在Java程序员越来越难做,一 ...

随机推荐

  1. 预处理、const、static、sizeof-为什么inline能很好地取代表达式形式的预定义

    1:有如下几种原因: (1)inline定义的类的内联函数,函数的代码被放在符号表中,在使用时直接进行替换(像宏一样展开),没有了调用的开销,效率也很高. (2)类的内联函数也是一个真正的函数.编译器 ...

  2. Leetcode题目53.最大子序和(动态规划-简单)

    题目描述: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连 ...

  3. Netfilter 之 连接跟踪初始化

    基础参数初始化 nf_conntrack_init_start函数完成连接跟踪基础参数的初始化,包括了hash,slab,扩展项,GC任务等: int nf_conntrack_init_start( ...

  4. adb命令连接Android模拟器夜神模拟器

    1.打开夜神模拟器,打开设置,调成手机模式,初次进入的话,进入设置 - 关于平板电脑 - 版本号,点击版本号5次,可以激活使用开发者模式:打开设置 -> 开发者选项 -> USB调试, 打 ...

  5. linux系统空间不足,不重启进程,清理僵尸文件。

    问题:通过lsof |grep delete命令可以看到状态为delete的进程文件占用了较多的空间,导致系统磁盘空间不足,而du 命令看到的磁盘空间占用没那么高. 得到僵尸文件名称:catalina ...

  6. CentOS7 上搭建 CDH(6.3.0)

    这里以四台节点搭建 IP HostName OS 192.168.8.5 h5(主) CentOS 7.5 192.168.8.6 h6(从) CentOS 7.5 192.168.8.7 h7(从) ...

  7. 2965 -- The Pilots Brothers' refrigerator

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27893 ...

  8. P1241 括号序列

    P1241 括号序列 题解 谁解释下标签递推是个什么鬼,应该是暴力 数据比较小直接跑暴力 但是注意题目描述 也就是说: [ ( ] ) 是不合法的 补全应该是 [ ] ( [ ] ) 举个栗子: 比如 ...

  9. Callable和Supplier的区别

    A Callable is "A task that returns a result, while a Supplier is "a supplier of results&qu ...

  10. jQuery.extend函数

    http://www.cnblogs.com/luckboy/archive/2009/06/25/1510870.html 1.扩展jQuery静态方法. 1$.extend({ 2test:fun ...