数据模型

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. day05 连表查询与子查询

    day05 连表查询与子查询 昨日内容回顾 表关系之一对一 换位思考之后得出两边都是不可以 要么是没有关系,要么是一对一 一对一的表关系外键虽然建在哪个都可以,但是建议建在查询频率多的表上 # 外键其 ...

  2. FileReader (三) - 网页拖拽并预显示图片简单实现

    以下是一个很贱很简单的一个 在网页上图拽图片并预显示的demo. 我是从https://developer.mozilla.org/en-US/docs/Web/API/FileReader#Stat ...

  3. CSS3新增特性\HTML标签类型

    RGBA:透明度      作用: 设置透明度(R G B A)   opacity:不透明度     文字也会被设置不透明度   圆角      border-radius:圆角{左上角,右上角.. ...

  4. supervise安装与使用

    确认当前是否已经安装which supervise/usr/local/bin/supervise 软件下载安装-------------------------------------------- ...

  5. maven根据profile,resources,filters来区分部署环境

    项目过程中,在不同的阶段,分别需要部署开发环境,测试环境,线上环境.如果都用一套配置文件,很容易弄乱,所以维持多套配置文件很有必要. maven提供了一组属性以供开发人员灵活搭配,可以根据环境来打包, ...

  6. idea如何在git上将分支代码合并到主干

    1.首先将idea中的代码分支切换到master分支,可以看到我们在dev上提交的代码 在master上是没有的 2.如图所示,在remote branch 上选择分支,点击后面的三角图标,展开之后选 ...

  7. 华为云函数中使用云数据库的JavaScript SDK基础入门

    背景介绍 使用云数据库Server端的SDK,此处我以华为提供的官方Demo为例,他们的Demo也已经开源放在了GitHub上,大家需要的可以自行下载. https://github.com/AppG ...

  8. 7、Redis五大数据类型---集合(Set)

    一.集合(Set)简介 Set是string类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1). ...

  9. 在写易买网时产生的错误 JSTL标签库中<c:choose></c:choose>不能放JSP页面<!-- -->注释

    最近在使用JSTL标签库的<c:choose>标签时候,发现在该标签体中加了JSP的<!-- -->注释时,总是会显示报错信息.错误的信息如下: org.apache.jasp ...

  10. 三维引擎导入obj模型不可见总结

    最近有客户试用我们的三维平台,在导入模型的时候,会出现模型全黑和不可见的情况.上一篇文章说了全黑的情况.此文说下不可见的情况. 经过测试,发现可能有如下两种情况. 导入的模型不在镜头视野内 导入的模型 ...