简介

这篇文章是旨在为那些想要利用zookeeper协调服务能力进行分布式应用创建的开发者的入门指导,包括一些理论性和实践性的内容。

文章的前四部分系统的介绍了zookeeper的相关概念,对于理解zookeeper的工作机制及使用都有很大帮助。

zookeeper的数据结构

zookeeper会话

zookeeper监听

一致性保障

文章的后四部分包含一些训练性的编程内容,包括:

zookeeper操作指引

绑定关系

项目结构

常见问题及解决

zookeeper数据结构

zookeeper本身是一种层次性的命名空间结构,非常类似于分布式文件系统,不同之处在于zookeeper的每个节点都可以存储节点数据及拥有子节点,既是文件又是文件夹。每个节点的路径都是用斜线分割,唯一,绝对的。没有相对路径:

ZNode

zookeeper中的节点以ZNode的形式存在,ZNode结构存储数据及确认历史变化版本号并包含时间戳。zookeeper使用版本号及时间戳来处理缓存时效及协调更新。版本号会随着每次节点数据的改变而递增,客户端查询节点数据,同时会返回数据的版本号信息,当需要执行删除或更新操作时,客户端必须提供相应的需要删除的数据版本号,如果不一致,则操作不执行。

附注:在分布式应用机制中,一个node可以代表一个host地址,一台服务器,集合中的一员,一个客户端进程等,zookeeper中znodes代表数据节点,servers对应组成zookeeper服务的机器,client代表使用zookeeper服务的任何客户端进程,quorum peers代表组成集合的服务器。

znodes是编程主要涉及的对象,主要特性如下:

监听:客户端可以设置节点监听,当节点发生变化(数据变化或者被删除等)将会触发监听并通知监听客户端,触发后删除监听。

数据访问:节点数据访问具有原子性,读取或者更新全部输的数据信息,每个节点都有一个访问控制列表,进行权限控制。

Zookeeper设计的初衷并不是用来作为常规的数据库的,相反,他维护一致性数据,包括配置信息,状态信息,会合信息等,它们共同的特点就是数据量特别小,Kbits大小,zookeeper客户端和服务端有一套健全的机制检查节点数据的大小,确保不大于1M,通常来说会大大小于1M。大体积数据操作会耗费更多的时间在网络传输上,从而会影响其它相关操作,通常不建议。如果要存储大体积的数据,通常的做法是将数据存放在文件系统,然后将指向地址存储在zookeeper节点中。

临时节点:临时节点是一种节点,它会随着创建它的会话的生命周期而存在,会话结束,则节点删除,因为这一特性,临时节点没有子节点。

顺序节点(唯一命名):创建节点的时候,可以设置zookeeper单纯的增加路径末端的节点序号。节点序号相对于父节点是唯一的,按照10位前端补零的格式来格式化并排序,4bytes无符号整数,当节点超过2147483647是会发生溢出异常。

容器节点:3.6.0之后增加

容器节点是专门为了应用于leader选举,分布式锁等而添加的特殊节点形式。当容器节点的最后一个子节点被删除,容器节点就会被列入zookeeper服务将要删除的节点行列。

当在容器节点下创建子节点时,需要捕获NoNodeException异常,当容器节点不存在是先执行容器节点的创建。

zookeeper中的时间:

Zxid:zookeeeper的状态变化会以唯一zxid的形式印记,用以标识zookeeper的状态变化顺序,小序号先于大序号发生。

版本号:节点的变化会以几点的一种版本号变化来标记,节点包含三种版本号:version指代节点数据的变化;cversion指代节点子节点的变化;aversion指代节点的确认acl。

Ticks:当使用多服务zookeeper时,服务之间使用ticks来同步协调,例如状态上载,会话过期,终端连接的过期。

zookeeper状态结果:

czxid:节点创建

mzxid: 节点更新

pzxid:子节点更新

ctime:节点创建过去的毫秒数

mtime:节点更新过去的毫秒数

ephemeralowner:临时节点拥有者的会话id

numchildren:节点的子节点数。

zookeeper监控

节点操作包括getDate(),getChildren(),exists()都可以设置节点监听,监听有以下特点:

一次性触发:当节点数据发生变化时,服务器会向客户端发送监听事件。

接受监听事件:监听事件发送具有异步性。

节点监听的数据变化。

附注:zookeeper不保证同一时间不同客户端获取数据的一致性。因为网路延迟,可能一个客户端执行的更新操作导致的节点数据变化时间可能还没有传递到另外一个客户端。

Zookeeper 分布式应用的更多相关文章

  1. zookeeper 分布式应用好处

    <pre name="code" class="html"> 举个例子 比如我以前通过haproxy 负载两台tomcat8082 比如api01 ...

  2. hadoop之 Zookeeper 分布式应用程序协调服务

    (1) Zookeeper 在 Hadoop 集群中的作用 Zookeeper 是分布式管理协作框架,Zookeeper 集群用来保证 Hadoop 集群的高可用,(高可用的含义是:集群中就算有一部分 ...

  3. 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解

    引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单 ...

  4. HADOOP+SPARK+ZOOKEEPER+HBASE+HIVE集群搭建(转)

    原文地址:https://www.cnblogs.com/hanzhi/articles/8794984.html 目录 引言 目录 一环境选择 1集群机器安装图 2配置说明 3下载地址 二集群的相关 ...

  5. ZooKeeper概述(三)

    ZooKeeper:分布式应用的分布协调服务 ZooKeeper是一个为分布式应用提供的分布的开源的协调服务.它暴露一组简单的原子操作,分布式系统可以在这之上为同步,配置管理,和组和命名实现更高级的服 ...

  6. <译>Zookeeper官方文档

    apache原文地址:http://zookeeper.apache.org/doc/trunk/zookeeperOver.html ZooKeeper ZooKeeper: A Distribut ...

  7. Mycat 依赖包解读

    1.curator - zookeeper开源客户端框架 2.dom4j - xml解析包 3.druid - 阿里巴巴推出的国产数据库连接池,同时具备监控功能,性能优于JDBC和C3P0 4.ehc ...

  8. hadoop第二课

    1.1为什么需要Hadoop  (1)数据分析者面临的问题 – 数据日趋庞大,读写都出现性能瓶颈: – 用户的应用和分析结果,对实时性和响应时间 要求越来越高: – 使用的模型越来越复杂,计算量指数级 ...

  9. Java自学开发编程路线图(文中有资源福利)

    Java 语言入门 免费视频资源<毕向东Java基础教程>:http://yun.itheima.com/course/7.html JavaEE 学习大纲 所处阶段 主讲内容 技术要点 ...

随机推荐

  1. 如何用C#对Gridview的项目进行汇总统计?

    上一次用了javascript对gridview进行了汇总统计,但那个统计是在客户端进行的,虽然减轻了服务器的负担,但是,当需要把统计信息汇出excel时,汇总信息却死活不出来了,所以,绕半天又绕回来 ...

  2. Jmeter--随机生成浮点数

    post接口中需要随机生成目标对象的地理位置: 所以就使用了javaScript函数,如下所示: { "Location": { "Altitude": ${_ ...

  3. Java编码问题原因以及解决

    一.文件编码 Unicode 是首选编码.Unicode 是全球范围的字符编码标准. 小结: GBK 与unicode之间的转换是通过gbk unicode映射表. UTF-8 与unicode之间的 ...

  4. Python 学习笔记(十一)Python语句(三)

    While 循环语句 用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务. 语法: while 判断条件: 执行语句…… 执行语句可以是单个语句或语句块.判断条件可以是任何 ...

  5. ArrayList详解

    一.ArrayList类介绍:(这里给出jdk1.8源码上中文翻译) ArrayList是List接口以可变数组方式实现的,实现了所有的lis接口中的操作,并容许有null等所有元素.除了实现了Lis ...

  6. iOS7下Status Bar字体颜色修改

    原文来自这里:iOS7下Status Bar字体颜色修改. 旧项目在iOS7上遇到status bar字体颜色需要修改的问题,症状如下:导航栏设置为黑色后,iphone上status bar的字体颜色 ...

  7. DB数据源之SpringBoot+MyBatis踏坑过程(二)手工配置数据源与加载Mapper.xml扫描

    DB数据源之SpringBoot+MyBatis踏坑过程(二)手工配置数据源与加载Mapper.xml扫描 liuyuhang原创,未经允许进制转载  吐槽之后应该有所改了,该方式可以作为一种过渡方式 ...

  8. 前端ajax的各种与后端交互的姿势

    前端中常常用的与后端交换数据的话,通常是要用到ajax这种方法的 但是交互的方式有很多种,很多取决于你后端的属性,我这儿主要列举我目前项目比较常用的两种方式 --一个是我们通用的web api和控制器 ...

  9. 『ACM C++』HDU杭电OJ | 1416 - Gizilch (DFS - 深度优先搜索入门)

    从周三课开始总算轻松了点,下午能在宿舍研究点题目啥的打一打,还好,刚开学的课程还算跟得上,刚开学的这些课程也是复习以前学过的知识,下半学期也不敢太划水了,被各种人寄予厚望之后瑟瑟发抖,只能努力前行了~ ...

  10. 10分钟搞定webpack打包

    入门前端这个职位近三年的时间了,但是脑子里的东西不多也不少,今天就从脑袋里把新版本的webpack打包过程拔出来给大家鲁一遍,就算帮助那些小白了,废话不多说,开始鲁起来,大家跟着我一起撸... 首先, ...