Zookeeper系列(二)特征及应用场景
zookeeper类似一个分布式的文件系统,每个节点可以有和它自身或它的子节点相关联的数据,此外指向节点的路劲必须使用绝对路径(不能使用相对路劲);
Znode
对应目录树中的的一个节点,并拥有一些属性信息(版本号、时间戳等),每当Znode数据改变时它相应的版本号就会增加;

属性结构说明:
czxid:节点被创建的Zxid值(Zxid为时间戳格式)
mzxid:节点被修改的Zxid值;
ctime:节点被创建的时间;
mtime:节点最后一次的修改时间;
version:节点被修改的版本号;
cversion:节点所拥有的子节点被修改的版本号;
aversion:节点的ACL被修改的版本号;
dataLength:节点数据域的长度;
numChildren:节点拥有的子节点个数;
emphemeralOwner:如果此节点为临时节点,那么他的值为这个节点拥有者的会话ID;否则,它的值为0;
特点:
1、znode 可以有子节点目录,并且每个 znode 可以存储数据,注意 EPHEMERAL 类型的目录节点不能有子节点目录;
2、znode 是有版本的,每个 znode 中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据;
3、znode 可以是临时节点,一旦创建这个 znode 的客户端与服务器失去联系,这个 znode 也将自动删除,Zookeeper 的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳来保持连接,这个连接状态称为 session,如果 znode 是临时节点,这个 session 失效,znode 就会被删除;
4、znode 的目录名可以自动编号;
5、znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端;
Zookeeper服务与客户端交互
客户端应用程序创建Zookeeper实例,与Zookeeper服务建立起连接,Zookeeper系统将会给此连接会话分配一个ID值,并且客户端会周期性的向服务器发送心跳来维持会话的连接,只要连接有效,客户端还可通过Zookpeeper API来进行相应的处理;
zookeeper系统机构图:

常用方法说明
1、String create(String path,byte[] data,List<ACL> acl,CreateMode createMode)
功能说明:
a、根据path创建目录节点,该节点的数据域初始值为data;
b、acl:目录分别由perms和id两部分组成,Perms标识权限,有ALL、READ、WRITE、CREATE、DELETE、ADMIN六种;id标识访问目录的身份列表,有ANYONE_ID_UNSAFE、AUTH_IDS两种,分别表示任何人都可以访问和仅创建者有权限访问;常用的ACL有OPEN_ACL_UNSAFE、CREATOR_ALL_ACL、READ_ACL_UNSAFE三种,定义在ZooDefs中,
c、createMode:分别有四种表现形式PERSISTENT:持久的目录节点;EPHEMERAL:临时目录节点,当创建该节点的客户端与服务端连接超时或断开,该节点将自动删除;PERSISTENT_SEQUENTIAL:顺序自动编号的目录节点,根据当前已经存在的节点数自动加1;EPHEMERAL_SEQUENTIAL:临时自动编号节点;
2、State exists(String path,boolean wach)
功能说明:
根据path判断目录节点是否存在,可通过watch控制是否监听;
3、void delete (String path,int version)
功能说明:
根据目录节点路径path及版本信息version,删除对应的目录节点,当version为-1时将删除该节点所有数据;
4、List<String> getChildren(String path,boolean watch)
功能说明:
获取path下的所有子目录节点;
5、State setData(String path,byte[] data,int version)
功能说明:
根据path及version设置节点的数据域为data,当version为-1时将匹配任何版本;
6、byte[] getData(String path,boolean watch,Stat stat)
功能说明:
获取节点数据(path表示目录节点路径,stat标识数据的版本信息,watch用来控制是否设置监控);
7、void addAuthInfo(String scheme,byte[] auth)
功能说明:
客户端将自己的授权信息提交给服务器,服务器将根据这个授权信息验证客户端的访问权限;
8、Stat setAcl(String path,List<ACL> acl,int version)
功能说明:
给path表示的目录节点设置访问权限(注: Zookeeper 中的目录节点权限不具有传递性,父目录节点的权限不能传递给子目录节点);
9、List<ACL> getACL(String path,Stat stat)
功能说明:
获取path表示的目录节点的访问权限列表;
写操作与zookeeper内部事件对应关系

zookeeper内部事件与watch的对应关系

写操作与watch对应关系
Zookeeper应用场景
1、配置管理
在分布式应用中,存在一些公共配置,每台机器都需要加载,若单独部署在每台机器,那么对配置文件变动维护会比较繁琐,而且容易出现不一致的情况,采用zookeeper进行统一配置管理后,将有效的解决该问题;
配置管理结构图:

说明:
图中的每个client代表一台电脑,而且都对zookeeper中的/configuration目录进行监控,当/configuration节点的数据域产生变化时,所有的client都将会收到通知进行同步;
2、集群管理
以zookeeper来实现集群的管理方式如下图所示,集群中的每台机器在/GroupMenbers(EPHEMERAL类型)节点目录下,都会建立一个对应clienti(EPHEMERAL_SEQUENTIAL类型)子节点,并在/GroupMenbers节点上设置监控getChildren,当创建它的集群节点挂了,这个目录节点也随之被删除,所以 Children 将会变化,这时 getChildren上的 Watch 将会被调用,所以其它 集群节点 就知道。新增集群节点实现同理。
选举功能(Leader Election)的实现,在zookeeper中的每个server中创建一个EPHEMERAL_SEQUENTIAL目录节点,之所以它是 EPHEMERAL_SEQUENTIAL 目录节点,是因为我们可以给每台 Server 编号,我们可以选择当前是最小编号的 Server 为 Master,假如这个最小编号的 几圈死去,由于是 EPHEMERAL 节点,死去的 Server 对应的节点也被删除,所以当前的节点列表中又出现一个最小编号的节点,我们就选择这个节点为当前 Master。这样就实现了动态选择 Master,避免了传统意义上单 Master 容易出现单点故障的问题。
集群管理结构图

3、共享锁
实现方式:在需要获得锁的 Server 创建一个 EPHEMERAL_SEQUENTIAL 目录节点,然后调用 getChildren方法获取当前的目录节点列表中最小的目录节点是不是就是自己创建的目录节点,如果正是自己创建的,那么它就获得了这个锁,如果不是那么它就调用 exists(String path, boolean watch) 方法并监控 Zookeeper 上目录节点列表的变化,一直到自己创建的节点是列表中最小编号的目录节点,从而获得锁,释放锁很简单,只要删除前面它自己所创建的目录节点就行了。
流程图

4、队列
定义:当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达;
实现思路:
创建一个父目录 /synchronizing,每个成员都监控标志(Set Watch)位目录 /synchronizing/start 是否存在,然后每个成员都加入这个队列,加入队列的方式就是创建 /synchronizing/member_i 的临时目录节点,然后每个成员获取 / synchronizing 目录的所有目录节点,也就是 member_i。判断 i 的值是否已经是成员的个数,如果小于成员个数等待 /synchronizing/start 的出现,如果已经相等就创建 /synchronizing/start。
同步队列流程图

FIFO 队列实现思路:
在特定的目录下创建 SEQUENTIAL 类型的子目录 /queue_i,这样就能保证所有成员加入队列时都是有编号的,出队列时通过 getChildren( ) 方法可以返回当前所有的队列中的元素,然后消费其中最小的一个,这样就能保证 FIFO
Zookeeper系列(二)特征及应用场景的更多相关文章
- Zookeeper系列二:分布式架构详解、分布式技术详解、分布式事务
一.分布式架构详解 1.分布式发展历程 1.1 单点集中式 特点:App.DB.FileServer都部署在一台机器上.并且访问请求量较少 1.2 应用服务和数据服务拆分 特点:App.DB.Fi ...
- 服务注册中心之ZooKeeper系列(二) 实现一个简单微服务之间调用的例子
上一篇文章简单介绍了ZooKeeper,讲了分布式中,每个微服务都会部署到多台服务器上,那服务之间的调用是怎么样的呢?如图: 1.集群A中的服务调用者如何发现集群B中的服务提供者呢? 2.集群A中的服 ...
- 微信公众号开发C#系列-11、生成带参数二维码应用场景
1.概述 我们在微信公众号开发C#系列-7.消息管理-接收事件推送章节有对扫描带参数二维码事件的处理做了讲解.本篇主要讲解通过微信公众号开发平台提供的接口生成带参数的二维码及应用场景. 微信公众号平台 ...
- Zookeeper 系列(二)安装配制
Zookeeper 系列(二)安装配制 一.Zookeeper 的搭建方式 Zookeeper 安装方式有三种,单机模式和集群模式以及伪集群模式. 单机模式 :Zookeeper 只运行在一台服务器上 ...
- zookeeper系列(四)zookeeper的使用场景
作者:leesf 掌控之中,才会成功:掌控之外,注定失败. 出处:http://www.cnblogs.com/leesf456/p/6036548.html感谢原著公开这么好的博文供大家学习 ...
- zookeeper系列(二)zookeeper的使用--javaAPI
作者:leesf 掌控之中,才会成功:掌控之外,注定失败: 出处:http://www.cnblogs.com/leesf456/ (尊重原创,感谢作者整理的这么好,作者的部分内容添加了我的理解 ...
- Zookeeper 系列(五)Curator API
Zookeeper 系列(五)Curator API 一.Curator 使用 Curator 框架中使用链式编程风格,易读性更强,使用工程方法创建连接对象使用. (1) CuratorFramewo ...
- Zookeeper 系列(三)Zookeeper API
Zookeeper 系列(三)Zookeeper API 本节首先介绍 Zookeeper 的 Shell 命令,再对 Java 操作 Zookeeper 的三种方式进行讲解,本节先介绍 Zookee ...
- Zookeeper 系列(一)基本概念
Zookeeper 系列(一)基本概念 https://www.cnblogs.com/wuxl360/p/5817471.html 一.分布式协调技术 在给大家介绍 ZooKeeper 之前先来给大 ...
随机推荐
- rman全备份异机恢复
一.测试环境 [oracle@localhost ~]$ uname -a Linux localhost.localdomain -.el6.x86_64 # SMP Tue May :: EDT ...
- 【BZOJ】1070: [SCOI2007]修车
1070: [SCOI2007]修车 Description 同 一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需 ...
- .NET 轻量级 ORM 框架 - Dapper 介绍
Dapper简单介绍: Dapper is a single file you can drop in to your project that will extend your IDbConnect ...
- 我的PHP之旅--PHP的判断、循环语句
if语句 <?php if ($a = "some string") { // 就算括号中不是bool值,php也会自动转换为bool值 上一节写过各个类型转换bool值 / ...
- UIWebView与JS的深度交互-b
要实现这样一个需求:按照本地的CSS文件展示一串网络获取的带HTML格式的只有body部分的文本,需要自己拼写完整的 HTML.除此之外,还需要禁用获取的HTML文本中自带的 < img > ...
- mvc3.0中[ValidateInput(false)]失效的问题
在asp.net mvc3.0中[ValidateInput(false)]特性失效了,只需要在网站根目录中的web.config中做如下配置即可: <system.web> <ht ...
- 关于\t
tail -n 10000 sample_dbl.txt | python sitemap.py | sort -k 1 -t $'\t' | python sitecombiner.py > ...
- Matlab 文件命名规则
Matlab 文件命名规则 1.文件名命名要用英文字符,第一个字符不能是数字和下划线. 2.文件名不要取为matlab的一个固有函数,m文件名的命名尽量不要是简单的英文单词,最好是由大小写英文.数字. ...
- zoj 3765
一道区间更新.查询的题: 但是线段树不能做插入: 后来才知道用splay: splay用来做区间查询的话,先将l-1旋转到根节点,然后把r+1旋转到根节点的右节点: 这样的话,根节点的右节点的左子树就 ...
- POJ3714+最近点对
特判标记即可 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h& ...