Zookeeper数据模型与session机制:
zookeeper的数据模型有点类似于文件夹的树状结构,每一个节点都叫做znode,每一个节点都可以有子节点和数据,就好像文件夹下面可以有文件和子文件夹。
 * 每一个节点存储的数据不宜过大。
 * 我们可以为节点设置相应的控制权限。
 * 每个节点都带有版本号,数据变更时,版本号(乐观锁)变更。
   zookeeper的客户端与服务端建立连接就会存在session机制,通过客户端向服务端ping包请求的心跳机制来检查session是否过期,session过期的时候,该session创建的所有临时节点都会被抛弃。

  

Zookeeper的四种类型节点:
  persistent:                  持久化节点
  persistent_sequential: 持久化顺序节点
  ephemeral:                 临时节点
  ephemeral_sequential:临时顺序节点
    * 持久化节点只能主动调用detele方法删除
    * 临时节点在创建者超时或失去连接后节点就会被删除,临时节点下面没有子节点
    * 顺序节点在创建后会自动在后面添加序列号

Zookeeper集群的三种角色:
  leader:一个集群有且只有一个leader节点,处理写请求,并负责进行发起投票和决议,更新系统状态。每次处理写请求的时候都会发起投票,只有过半的节点通过才能写入数据。
  follower:用来处理读请求,leader会根据算法落实到某个follower节点。follower除了有投票权还具有选举权,当leader挂掉之后,follower之间就会发起投票,选举出下一任的leader。
  observer:用来处理读请求,可以当成没有投票和选举资格的follower。其存在的目的就是为了协助follower来处理读请求。因为一个集群只有leader和follower的话每次节点变化都需要投票,这是很耗时间的;有这么一个只干活不投票的打酱油角色可以提高读取的吞吐量。
  * zookeeper集群必须有过半的节点存活才能提供服务。那么5台的集群最多能挂2台机,6台的集群最多也只能挂2台。那么5台和6台没区别,为了节约服务器成本通常集群为奇数。

zookeeper的选举状态变化:
  looking,   选举中状态(集群刚启动或leader宕机时,查找leader的状态)
  leading,   领导者状态(若节点为leader,那么它就是leading状态)
  following, 随从者状态(若节点为follower,它就会同步leader数据,成为following状态)
  observing,  观察者状态(若节点为observer,它就会同步leader数据,成为observing状态)

Zookeeper如和实现数据一致性的:
  zk的核心是广播机制,该机制保证了各个zk之间的数据同步(数据一致性)。zk实现的机制为ZAB协议(zk原子广播协议),主要原理是下面3中模式。
   广播模式:leader写入数据时会发起提议,当大多数follower都同意之后,leader就会更新数据并广播给其他follower。
   恢复模式:如果leader崩溃,这个时候就会进入恢复模式,使得整个zk集群恢复到正常的工作状态。
   同步模式:新的leader选举出来后,就会进入同步模式,各个follower会去同步新的leader上的数据,当大多数节点完成了状态同步,恢复模式就结束。

Zookeeper集群的选举算法:
  zookeeper集群的机器有两个核心的属性,myid和zxid。
  myid:是zk集群中服务器的唯一标识,例如有3台zkserver,那么编号分别为1,2,3。
  zxid:是一个64位的long类型。它会拆分成2部分,高32位表示epoch(leader标识), 低第32位表示xid(事务id)。

现在我们以3台机器的集群模拟选举过程:
  1. 由于是集群初始化,前面几个节点都是投自己的票.这个时候集群还没启动过半,则这个zkserver的选举状态是looking。这时候假定epoch为123,则第一个机器的票数,epoch,myid为 1:123:1。然后将投票信息广播出去。
  2. 启动第二台机器,它还是投自己的票(n台机器的集群,前面几台机器都是自己投自己)。此时它的票数,epoch,myid为 1:124:2。广播给其他节点自己的投票消息。
  2.1 此时集群已经启动过半,可以提供服务了。首先会比较票数,票数多的为leader;票数一样就比较epoch,值大者(大表示数据越新)胜出;epoch相等就比较myid,myid大的胜出。
  2.2 此时第二台机器就是leader,第一台机器就是follower。
  3. 启动第三台机器,由于集群已经产生出leader了,所以节点三也是follower。
  3.1 leader选举出来之后就会产生一个新的zxid,然后所有follower都去同步leader的zxid.其中高32的epoch表示一个新纪元(改朝换代会有新的国号嘛),低32位的xid事务id用来leader提议写操作(可以理解成一个国家的法律)
  4. 若leader无法保持连接的时候就会开始新一轮的投票, 产生新的leader和zxid,然后进行同步 .....
  5.1如果之前的leader重启,那么他会成为一个follower,去同步新的leader信息
  5.2如果刚才的leader只是假死,现在它复活之后还会以为自己是leader,那么它向其它follower发生请求会被拒绝。
  注意: 因为ZooKeeper维护了一个叫epoch的变量, 每当新leader产生时, epoch都会递增, followers如果确认了新的leader存在, 同时也会知道其epoch的值。
  它们会拒绝epoch小于现任leader的epoch的所有旧leader的任何请求.仍然会存在有部分followers不知道新leader的存在, 但肯定不是大多数, 否则新leader将无法产生.

zookeeper核心知识与投票机制详解的更多相关文章

  1. Android事件分发机制详解

    事件分发机制详解 一.基础知识介绍 1.经常用的事件有:MotionEvent.ACTION_DOWN,MotionEvent.ACTION_MOVE,MotionEvent.ACTION_UP等 2 ...

  2. Android事件传递机制详解及最新源码分析——ViewGroup篇

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 在上一篇<Android事件传递机制详解及最新源码分析--View篇>中,详细讲解了View事件的传递机制,没掌握或者掌握不扎实的小伙伴 ...

  3. 转 Java虚拟机5:Java垃圾回收(GC)机制详解

    转 Java虚拟机5:Java垃圾回收(GC)机制详解 Java虚拟机5:Java垃圾回收(GC)机制详解 哪些内存需要回收? 哪些内存需要回收是垃圾回收机制第一个要考虑的问题,所谓“要回收的垃圾”无 ...

  4. 深入理解mybatis原理, Mybatis初始化SqlSessionFactory机制详解(转)

    文章转自http://blog.csdn.net/l454822901/article/details/51829785 对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章 ...

  5. Shiro的Filter机制详解---源码分析

    Shiro的Filter机制详解 首先从spring-shiro.xml的filter配置说起,先回答两个问题: 1, 为什么相同url规则,后面定义的会覆盖前面定义的(执行的时候只执行最后一个). ...

  6. JVM类加载机制详解(二)类加载器与双亲委派模型

    在上一篇JVM类加载机制详解(一)JVM类加载过程中说到,类加载机制的第一个阶段加载做的工作有: 1.通过一个类的全限定名(包名与类名)来获取定义此类的二进制字节流(Class文件).而获取的方式,可 ...

  7. 《深入理解mybatis原理2》 Mybatis初始化机制详解

    <深入理解mybatis原理> Mybatis初始化机制详解 对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章将通过以下几点详细介绍MyBatis的初始化过程 ...

  8. java面试题之----JVM架构和GC垃圾回收机制详解

    JVM架构和GC垃圾回收机制详解 jvm,jre,jdk三者之间的关系 JRE (Java Run Environment):JRE包含了java底层的类库,该类库是由c/c++编写实现的 JDK ( ...

  9. Android应用AsyncTask处理机制详解及源码分析

    1 背景 Android异步处理机制一直都是Android的一个核心,也是应用工程师面试的一个知识点.前面我们分析了Handler异步机制原理(不了解的可以阅读我的<Android异步消息处理机 ...

随机推荐

  1. JavaWeb_通过xml配置文件配置servlet访问路径

    Servlet两种访问路径 一.在Servlet类中通过设置@WebServlet标注访问 二.在web.xml中编写配置文件 第一种能比较直观看到Servlet路径,但当项目发布后不好再对Servl ...

  2. 利用jquery动态添加和删除表格的一行,并且保存单行数据

    开发时遇到一个需求:要求要在页面的表格可以添加和删除一行,并能填写对应的数据后保存这一行数据. HTML代码 界面使用了freemarker框架,teams是后台传过来的list类型数据 <fo ...

  3. Pandas使用groupby()时是否会保留顺序?

    PythonPandas:使用groupby()和agg()时是否保留了顺序? 看到这个增强问题 简短的答案是肯定的,groupby会保留传入的顺序.你可以用你的例子来证明这一点: df = pd.D ...

  4. HiddenField Class

    HiddenField Class Namespace: System.Web.UI.WebControls Assembly: System.Web.dll Represents a hidden ...

  5. leetcode-hard-array-54. Spiral Matrix-NO

    mycode 思路:这种方格图一定要预先设置定位的变量,例如最大的长.宽,变化中的长.宽,在while循环中也要不断判断是否满足break条件 class Solution(object): def ...

  6. 1.1 DAL数据访问层

    分布式(Distributed)数据访问层(Data Access Layer),简称DAL,是利用MySQL Proxy.Memcached.集群等技术优点而构建的一个架构系统.主要目的是解决高并发 ...

  7. MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

    1. 摘要 作者提出了一系列应用于移动和嵌入式视觉的称之为 MobileNets 的高效模型,这些模型采用深度可分离卷积来构建轻量级网络. 作者还引入了两个简单的全局超参数来有效地权衡时延和准确率,以 ...

  8. centos7 禁止root远程ssh直接登录

    修改/etc/ssh/sshd_config文件,将 #PermitRootLogin yes 修改为 PermitRootLogin no   查看 more /etc/ssh/sshd_confi ...

  9. MVC1:.Net MVC Cotroller向View传值

    下面介绍 ASP .Net MVC中 Cotroller 向 View 传值 的4中方式: ViewBag,ViewData,TempData,Model. (注:参数可根据需要为复杂类型,只需在应用 ...

  10. 阶段3 2.Spring_08.面向切面编程 AOP_6 四种常用通知类型

    新建项目 复制上节课的pom.xml内的代码 复制java下的代码 测试类也复制过来 配置文件也拷贝过来 logge下增加几个方法 测试方法只需要一个saveAccount方法就可以了 增加其他三种通 ...