zookeeper核心知识与投票机制详解
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核心知识与投票机制详解的更多相关文章
- Android事件分发机制详解
事件分发机制详解 一.基础知识介绍 1.经常用的事件有:MotionEvent.ACTION_DOWN,MotionEvent.ACTION_MOVE,MotionEvent.ACTION_UP等 2 ...
- Android事件传递机制详解及最新源码分析——ViewGroup篇
版权声明:本文出自汪磊的博客,转载请务必注明出处. 在上一篇<Android事件传递机制详解及最新源码分析--View篇>中,详细讲解了View事件的传递机制,没掌握或者掌握不扎实的小伙伴 ...
- 转 Java虚拟机5:Java垃圾回收(GC)机制详解
转 Java虚拟机5:Java垃圾回收(GC)机制详解 Java虚拟机5:Java垃圾回收(GC)机制详解 哪些内存需要回收? 哪些内存需要回收是垃圾回收机制第一个要考虑的问题,所谓“要回收的垃圾”无 ...
- 深入理解mybatis原理, Mybatis初始化SqlSessionFactory机制详解(转)
文章转自http://blog.csdn.net/l454822901/article/details/51829785 对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章 ...
- Shiro的Filter机制详解---源码分析
Shiro的Filter机制详解 首先从spring-shiro.xml的filter配置说起,先回答两个问题: 1, 为什么相同url规则,后面定义的会覆盖前面定义的(执行的时候只执行最后一个). ...
- JVM类加载机制详解(二)类加载器与双亲委派模型
在上一篇JVM类加载机制详解(一)JVM类加载过程中说到,类加载机制的第一个阶段加载做的工作有: 1.通过一个类的全限定名(包名与类名)来获取定义此类的二进制字节流(Class文件).而获取的方式,可 ...
- 《深入理解mybatis原理2》 Mybatis初始化机制详解
<深入理解mybatis原理> Mybatis初始化机制详解 对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章将通过以下几点详细介绍MyBatis的初始化过程 ...
- java面试题之----JVM架构和GC垃圾回收机制详解
JVM架构和GC垃圾回收机制详解 jvm,jre,jdk三者之间的关系 JRE (Java Run Environment):JRE包含了java底层的类库,该类库是由c/c++编写实现的 JDK ( ...
- Android应用AsyncTask处理机制详解及源码分析
1 背景 Android异步处理机制一直都是Android的一个核心,也是应用工程师面试的一个知识点.前面我们分析了Handler异步机制原理(不了解的可以阅读我的<Android异步消息处理机 ...
随机推荐
- HDU 6089 Rikka with Terrorist (线段树)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6089 题解 这波强行维护搞得我很懵逼... 扫描线,只考虑每个点能走到左上方(不包括正上方,但包括正左 ...
- R_Studio(学生成绩)对数值型数据进行统计量分析
对“Gary.csv”中的成绩数据进行统计量分析 基础数据分析 均值 中位数 极差 标准差 变异系数 1/4分位数 3/4分位数 四分位间距... ...分析 setwd('D:\\data' ...
- textarea 自动高度
textarea 自动撑开高度 var textAreaArr = document.querySelectorAll('.textarea'); for (var i = 0; i < tex ...
- windows管理员权限激活
第一步:计算机-右键--管理--选择用户,选择administrator用户--取消勾选:账户禁用 第二步:alt+ctrl+delete,快捷键调出资源管理器--点击切换用户 第三步:显示出现adm ...
- docker简单理解
Docker是开源的一个基于轻量级虚拟化技术的容器引擎项目.它通过分层镜像标准化和内核虚拟化技术,使得应用开发者和运维工程师可以以统一的方式跨平台发布应用,并且以几乎没有额外开销的情况下提供资源隔离的 ...
- LeetCode 337. 打家劫舍 III(House Robber III)
题目描述 小偷又发现一个新的可行窃的地点. 这个地区只有一个入口,称为“根”. 除了根部之外,每栋房子有且只有一个父房子. 一番侦察之后,聪明的小偷意识到“这个地方的所有房屋形成了一棵二叉树”. 如果 ...
- vue实现百度下拉框
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Uep弹窗showModalDialog的使用
function imageMaintain() { $.showModalDialog($$pageContextPath + "uepI/imageMaintain.do?service ...
- python模块------pyautogui
安装 pip install pyautogui 基本使用 查询 screenWidth, screenHeight = pyautogui.size() # 屏幕尺寸 mouseX, mouseY ...
- linux如何杀掉进程(kill)
方法/步骤1: 使用“ps -e|grep mysql”命令,查看mysql程序的对应的pid号.结果如下图: 方法/步骤2: 使用“kill -9 2891”命令,可以结束掉mysqld_saf ...