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. java从ldap中导出数据到ldif文件中

    原创:http://www.cnblogs.com/dqcer/p/7814034.html 导入ldap.jar包,笔者已对下面两个文件测试并通过.若有疑问欢迎留言 LDAPExport.java ...

  2. R_Studio(关联)对dvdtrans.csv数据进行关联规则分析

    dvdtrans.csv数据:该原始数据仅仅包含了两个字段(ID, Item) 用户ID,商品名称(共30条) #导入arules包 #install.packages("arules&qu ...

  3. 移动端 iphone手机在中文情况下不执行keyup事件

    问题:移动端 在

  4. LeetCode 168. Excel表列名称(Excel Sheet Column Title)

    题目描述 给定一个正整数,返回它在 Excel 表中相对应的列名称. 例如, 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 - ...

  5. 1.4 Navicat Mybatis 占坑

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...

  6. cors 预请求

    1.CORS的其他限制 默认允许的方法只有:GET.HEAD.POST默认允许的Content-Type:text/plain.multipart/form-data.applicaton/x-www ...

  7. [常用的SQL语句总结]

    1. 创建数据库DataBase create  database  数据库名称; 2. 删除数据库DataBase drop database 数据库名称 drop database 数据库名称1, ...

  8. Electron对JQuery的支持问题

    最近在了解Electron框架写应用,偶然发现在html中使用<script src="./jquery.js"></script>这种方式引入JQuery ...

  9. oracle 一张表插入另外一张表 存储过程

    ----创建存储过程 create or replace procedure inserttest as cursor cs is select id, name, cla, addr, phone, ...

  10. 【DVWA】File Inclusion(文件包含漏洞)通关教程

    日期:2019-07-28 20:58:29 更新: 作者:Bay0net 介绍: 0x01. 漏洞介绍 文件包含时,不管包含的文件是什么类型,都会优先尝试当作 php 文件执行. 如果文件内容有 p ...