数据模型

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 + myidn/2+1(n为Follower的总数)个Follower都大,则会被选举出来作为Leader;

正因为选举需要比较过半数的Follower,如果过半数的Follower宕机,则集群崩溃。

写操作

ZooKeeper集群的写操作都是由Leader来完成的,然后再通过Leader同步到Follower,Zookeeper在返回结果到客户端之前并不会保证同步到所有的Follower,只要过半(n/2+1)Follower同步成功即可;

读操作

客户端可以连接到集群中任何一台机器进行读操作,但不能保证都能读到最新的数据,因此在getData之前最好调用sync操作同步最新的数据再读取。

ZooKeeper基础知识总结的更多相关文章

  1. zookeeper基础知识整理

    http://blog.csdn.net/pelick/article/details/7269670 http://zookeeper.apache.org/doc/trunk/javaExampl ...

  2. zookeeper基础知识

    Zookeeper简介 ZooKeeper设计目的 最终一致性client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能. 可靠性具有简单.健壮.良好的性能,如 ...

  3. ZooKeeper_基础知识学习

    ZooKeeper是Hadoop的开源子项目(Google Chubby的开源实现),它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.命名服务.分布式同步.组服务等. Zookee ...

  4. 大数据基础知识问答----spark篇,大数据生态圈

    Spark相关知识点 1.Spark基础知识 1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduce的通用的并行计算框架 dfsSpark基于mapredu ...

  5. 《两地书》--Kubernetes(K8s)基础知识(docker容器技术)

    大家都知道历史上有段佳话叫“司马相如和卓文君”.“皑如山上雪,皎若云间月”.卓文君这么美,却也抵不过多情女儿薄情郎. 司马相如因一首<子虚赋>得汉武帝赏识,飞黄腾达之后便要与卓文君“故来相 ...

  6. HBASE基础知识总结

    HBASE基础知识总结 一,概要说明 文章首先回顾HBase 的数据模型和数据层级结构,对数据的每个层级的作用和架构进行了详细阐述:随后介绍了数据写入和读取的详细流程.先把架构图和流程图来坐镇. 架构 ...

  7. IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列

    1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...

  8. SpringCloud(1) 架构演进和基础知识简介

    一.传统架构演进到分布式架构 简介:讲解单机应用和分布式应用架构演进基础知识 (画图) 高可用 LVS+keepalive 1.单体应用:开发速度慢.启动时间长.依赖庞大.等等 2.微服务:易开发.理 ...

  9. 最全的spark基础知识解答

    原文:http://www.36dsj.com/archives/61155 一. Spark基础知识 1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduc ...

随机推荐

  1. win32汇编基础

    win32汇编基础知识 Debug 版本|Release 版本 Debug 是"调试"的意思,Debug 版本就是为调试而生的,编译器在生成 Debug 版本的程序时会加入调试辅助 ...

  2. Ubantu nodejs卸载与二进制安装

    #apt-get 卸载 sudo apt-get remove --purge npm sudo apt-get remove --purge nodejs sudo apt-get remove - ...

  3. Can we call an undeclared function in C++?

    Calling an undeclared function is poor style in C (See this) and illegal in C++. So is passing argum ...

  4. Druid数据库监控

    一.简介 Druid是阿里开源的一个JDBC应用组件, 其包括三部分: DruidDriver: 代理Driver,能够提供基于Filter-Chain模式的插件体系. DruidDataSource ...

  5. 【Java多线程】Java 中断

    如何安全的结束一个正在运行的线程 java.lang.Thread类包含了一些常用的方法,如:start(), stop(), stop(Throwable) ,suspend(), destroy( ...

  6. 使用OPC与PLC通讯 一

    总结自己在opc与自控开发的经验.首先介绍OPC DA模式下的OPC各种操作. 在使用opc时需要引用到 OPCDAAuto.dll 这个类库. 在项目引用后需要注册这个类库,否则程序跑起来会报错,& ...

  7. react-hook简单使用

    一.函数式组件创建 function HelloComponent(props, /* context */) { return <div>Hello {props.name}</d ...

  8. Android: Client-Server communication by JSON

    Refer to: http://osamashabrez.com/client-server-communication-android-json/ This is a sequel to my l ...

  9. WebRTC与音频音量

    WebRTC打开麦克风,获取音频,在网页上显示音量. 播放示例音频 先从播放音频入手.准备一个现成的音频文件. 界面上放一个audio元素,提前准备好一个音频文件,路径填入src <audio ...

  10. CF616B Dinner with Emma 题解

    Content 翻译很明白,或者你也可以看我的简化版题意: 求一个 \(n\times m\) 的矩阵中每行的最小值的最大值. 数据范围:\(1\leqslant n,m\leqslant 100\) ...