ZooKeeper基础知识总结
数据模型
ZooKeeper数据模型是一个树状的数据结构,类似于文件系统;和文件系统的区别在于树中的每一个节点(叶子节点与非叶子节点)都可以保存数据,且每个节点的访问都必须从根节点开始,以斜线作为分隔的访问路径,如 /root/a/b/,它没有相对路径的概念,所有的节点都必须通过绝对路径来访问;
Znode
ZooKeeper树中的节点被称之为znode,znode维护了一个stat结构,其中包含了版本号和时间戳;版本号是一直递增的,每一次znode中包含的数据被更新,版本号也会发生改变;
当客户端尝试去更新或者删除一个znode的时候,必须提供它要更新/删除的znode的当前版本号,如果版本号不正确,这个更新/删除就会失败(有点类似于数据库操作的乐观锁)。
观察者
客户端可以给znode添加一个观察者(类似于事件),当znode发生改变时,这个观察者会被触发,相应的客户端就会收到一个通知;
Zookeeper客户端可以给三个操作设置观察者:exists、getChildren、getData:
操作 | 触发的时间点 |
getChildren |
当znode的子节点被创建或者删除、当znode自身被删除时触发 |
exists | 当znode被创建、删除,或者数据被更新时触发 |
getData | 当znode被删除或znode的数据被更新时触发 |
观察者只会被触发一次,如果想被多次触发,则需要在触发之后重新注册;观察者的常用地方在于,使用ZooKeeper作为一个配置中心,各个客户端(应用程序)通过观察者监听znode从而获取最新的配置;
顺序性Znode
当创建一个Znode时,你可以要求ZooKeeper添加一个单调递增的计数器到这个znode上,这样你就可以在同一个父节点下创建多个相同的znode,而每个znode会以一串数字结尾,并单调递增;
这个计数器只在同一个父节点下唯一,最大值为2147483647,超过之后则会溢出;
暂时性Znode
Znode包含两种类型:暂时性znode和持久性znode;当创建这个znode的客户端session超时时,暂时性znode会被删除,而持久性的znode与客户端session无关,只能被显式的删除;
暂时性Znode不能有子节点,但它对所有的客户端是可见的;
顺序性Znode和暂时性Znode相结合可以作为分布式锁,具体操作为:创建顺序性znode的最小值的客户端作为分布式锁的获得者,当这个客户端关闭Session时,其创建的znode会被删除,而剩下的顺序性znode最小值的创建者将捕获这个分布式锁;为避免惊群效应,每一个客户端只需要在比它稍小的那个znode上设置一个观察者,这样当znode被删除时,只会唤醒一个客户端。
一致性
选举
ZooKeeper使用Master/Slave模式,通过ZAB算法实现Leader的选举机制;
ZooKeeper的所有机器可以分为三类:Leader、Follower、Learner,Learner主要用于同步Znode数据,选举主要在多个Follower之间进行;选举的目的主要用于在多个Follower中选举出持有zxid和myid(ZooKeeper服务器的标识ID)相对较大(比较过半数即可)的那个机器作为Leader;
在ZooKeeper集群中的每一个更新操作都会有一个全局的唯一性标识,这个标识叫做zxid,又称之为ZooKeeper事务ID,它永远是递增的;
Zxid是一个64位的数字,包含两部分:任期(epoch)和计数器(counter),高32位为任期,低32位为计数器;当一个新的Leader选举出来之后,任期会加1,在同一个Leader任期内保持计数器递增,通过此种方式记录操作的顺序性。
ZAB算法的核心在于多个Follower之间两两比较,如果一个Follower的zxid + myid比n/2+1(n为Follower的总数)个Follower都大,则会被选举出来作为Leader;
正因为选举需要比较过半数的Follower,如果过半数的Follower宕机,则集群崩溃。
写操作
ZooKeeper集群的写操作都是由Leader来完成的,然后再通过Leader同步到Follower,Zookeeper在返回结果到客户端之前并不会保证同步到所有的Follower,只要过半(n/2+1)Follower同步成功即可;
读操作
客户端可以连接到集群中任何一台机器进行读操作,但不能保证都能读到最新的数据,因此在getData之前最好调用sync操作同步最新的数据再读取。
ZooKeeper基础知识总结的更多相关文章
- zookeeper基础知识整理
http://blog.csdn.net/pelick/article/details/7269670 http://zookeeper.apache.org/doc/trunk/javaExampl ...
- zookeeper基础知识
Zookeeper简介 ZooKeeper设计目的 最终一致性client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能. 可靠性具有简单.健壮.良好的性能,如 ...
- ZooKeeper_基础知识学习
ZooKeeper是Hadoop的开源子项目(Google Chubby的开源实现),它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.命名服务.分布式同步.组服务等. Zookee ...
- 大数据基础知识问答----spark篇,大数据生态圈
Spark相关知识点 1.Spark基础知识 1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduce的通用的并行计算框架 dfsSpark基于mapredu ...
- 《两地书》--Kubernetes(K8s)基础知识(docker容器技术)
大家都知道历史上有段佳话叫“司马相如和卓文君”.“皑如山上雪,皎若云间月”.卓文君这么美,却也抵不过多情女儿薄情郎. 司马相如因一首<子虚赋>得汉武帝赏识,飞黄腾达之后便要与卓文君“故来相 ...
- HBASE基础知识总结
HBASE基础知识总结 一,概要说明 文章首先回顾HBase 的数据模型和数据层级结构,对数据的每个层级的作用和架构进行了详细阐述:随后介绍了数据写入和读取的详细流程.先把架构图和流程图来坐镇. 架构 ...
- IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列
1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...
- SpringCloud(1) 架构演进和基础知识简介
一.传统架构演进到分布式架构 简介:讲解单机应用和分布式应用架构演进基础知识 (画图) 高可用 LVS+keepalive 1.单体应用:开发速度慢.启动时间长.依赖庞大.等等 2.微服务:易开发.理 ...
- 最全的spark基础知识解答
原文:http://www.36dsj.com/archives/61155 一. Spark基础知识 1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduc ...
随机推荐
- Oracle——生成Awr报告
Oracle--生成Awr报告 AWR的概念 Oracle数据库是一个使用量很多的数据库,关于Oracle数据库的性能.Oracle10g以后,Oracle提供了一个性能检测的工具:AWR(Autom ...
- Linux学习 - 分区与文件系统
一.分区类型 1 主分区:总共最多只能分四个 2 扩展分区:只能有一个(主分区中的一个分区),不能存储数据和格式化,必须再划分成逻辑分区 才 ...
- 快速上手git gitlab协同合作
简单记录,整理. 摘要 为方便大家快速上手Git,并使用Gitlab协同合作,特编写此手册,手册内容不会太丰富与深入.主要包含如下内容: Git 使用教程1.1 安装1.2 常用命令1.3 版本控制1 ...
- JDBC(3):PreparedStatement对象介绍
一,PreparedStatement介绍 PreperedStatement是Statement的子类,它的实例对象可以通过Connection.preparedStatement()方法获得,相对 ...
- springmvc框架找那个@responseBody注解
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html& ...
- 什么是maven(一)
转自博主--一杯凉茶 我记得在搞懂maven之前看了几次重复的maven的教学视频.不知道是自己悟性太低还是怎么滴,就是搞不清楚,现在弄清楚了,基本上入门了.写该篇博文,就是为了帮助那些和我一样对于m ...
- Leetcode 78题-子集
LeetCode 78 网上已经又很多解这题的博客了,在这只是我自己的解题思路和自己的代码: 先贴上原题: 我的思路: 我做题的喜欢在本子或别处做写几个示例,以此来总结规律:下图就是我从空数组到数组长 ...
- jstl中的if标签
<%@ page import="java.util.ArrayList" %><%@ page import="java.util.List" ...
- Consumer方法结合Lambda表达式的应用
package com.itheima.demo05.Consumer;import java.util.function.Consumer;/** * @author newcityman * @d ...
- [特征工程] GBDT