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. HDU 6089 Rikka with Terrorist (线段树)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6089 题解 这波强行维护搞得我很懵逼... 扫描线,只考虑每个点能走到左上方(不包括正上方,但包括正左 ...

  2. R_Studio(学生成绩)对数值型数据进行统计量分析

    对“Gary.csv”中的成绩数据进行统计量分析 基础数据分析 均值 中位数 极差   标准差   变异系数 1/4分位数 3/4分位数 四分位间距... ...分析 setwd('D:\\data' ...

  3. textarea 自动高度

    textarea 自动撑开高度 var textAreaArr = document.querySelectorAll('.textarea'); for (var i = 0; i < tex ...

  4. windows管理员权限激活

    第一步:计算机-右键--管理--选择用户,选择administrator用户--取消勾选:账户禁用 第二步:alt+ctrl+delete,快捷键调出资源管理器--点击切换用户 第三步:显示出现adm ...

  5. docker简单理解

    Docker是开源的一个基于轻量级虚拟化技术的容器引擎项目.它通过分层镜像标准化和内核虚拟化技术,使得应用开发者和运维工程师可以以统一的方式跨平台发布应用,并且以几乎没有额外开销的情况下提供资源隔离的 ...

  6. LeetCode 337. 打家劫舍 III(House Robber III)

    题目描述 小偷又发现一个新的可行窃的地点. 这个地区只有一个入口,称为“根”. 除了根部之外,每栋房子有且只有一个父房子. 一番侦察之后,聪明的小偷意识到“这个地方的所有房屋形成了一棵二叉树”. 如果 ...

  7. vue实现百度下拉框

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  8. Uep弹窗showModalDialog的使用

    function imageMaintain() { $.showModalDialog($$pageContextPath + "uepI/imageMaintain.do?service ...

  9. python模块------pyautogui

    安装 pip install pyautogui 基本使用 查询 screenWidth, screenHeight = pyautogui.size() # 屏幕尺寸 mouseX, mouseY ...

  10. linux如何杀掉进程(kill)

    方法/步骤1: 使用“ps -e|grep mysql”命令,查看mysql程序的对应的pid号.结果如下图:   方法/步骤2: 使用“kill -9 2891”命令,可以结束掉mysqld_saf ...