Zookeeper-Zookeeper client

当我写完Zookeeper leader选举后,准备看看Zookeeper的存储和处理客户端请求的时候发现,如果能看看Zookeeper的API是不是在理解后面的过程更好些呢。

Zookeeper的client是通过Zookeeper类提供的。前面曾经说过,Zookeeper给使用者提供的是一个类似操作系统的文件结构,只不过这个结构是分布式的。可以理解为一个分布式的文件系统。我们可以通过Zookeeper来访问这个分布式的文件系统。

Zookeeper的client api给我们提供以下这些API:

1. create

在给定的path上创建节点,这个path就像文件系统的路径,比如/myapp/data/1,在创建节点的时候还可以指定节点的类型:是永久节点,永久顺序节点,临时节点,临时顺序节点。这个节点类型是非常强大的。永久节点一经创建就永久保留了,就像我们在文件系统上创建一个普通文件,这个文件的生命周期跟创建它的应用没有任何关系。而临时节点呢,当创建这个临时节点的应用与zookeeper之间的会话过期之后就会被zookeeper自动删除了。这个特性是实现很多功能的关键。比如我们做集群感知,我们的应用启动的时候将自己的ip地址作为临时节点创建在某个节点下面。当我们的应用因为某些原因,比如网络断掉或者宕机,它与zookeeper的会话就会过期了,过期后这个临时节点就删除了。这样我们就可以通过这个特性来感知到我们的服务的集群有哪些机器是活者的。那么顺序节点又是什么呢。一般,如果我们在指定的path上创建节点,如果这个节点已经被创建了,则会抛出一个NodeExistsException的异常。如果我们在指定的路径上创建顺序节点,则Zookeeper会自动的在我们给定的path上加上一个顺序编号。这个特性就是实现分布式锁的关键。假设我们有几个节点共享一个资源,我们这几个节点都想争用这个资源,那我们就都向某个路径创建临时顺序节点。然后顺序最小的那个就获得锁,然后如果某个节点释放了锁,那顺序第二小的那个就获得锁,以此类推,这样一个分布式的公平锁就实现了。

除此之外,每个节点上还可以保存一些数据。

2. delete 删除给定节点。删除节点的时候还可以给定一个version,只有路径和version都匹配的时候节点才会被删除。有了这个version在分布式环境种我们就可以用乐观锁的方式来确保一致性。比如我们先读取一下节点,获得了节点的version,然后删除,如果删除成功了则说明在这之间没有人操作过这个节点,否则就是并发冲突了。

3. exists 这个节点会返回一个Stat对象,如果给定的path不存在的话则返回null。这个方法有一个关键参数,可以提供一个Watcher对象。Wathcer是Zookeeper强大功能的源泉。Watcher就是一个事件处理器,一个回调。比如这个exists方法,调用后,如果别人对这个path上的节点进行操作,比如创建,删除或设置数据,这个Wather都会接收到对应的通知。

4. setData/getData 设置或获取节点的数据,getData也可以设置Watcher

5. getChildren 获取子节点,可以设置Watcher

6. sync zookeeper是一个集群,创建节点的时候只要半数以上的节点确认就认为是创建成功了,但是如果读取的时候正好读取到一个落后的节点上,那就有可能读取到旧的数据,这个时候可以执行一个sync操作,这个操作可以确保读取到最新的数据。

zookeeper的client api基本上介绍完了。zookeeper强大的功能都是通过这些API来实现的,zookeeper通过一个简单的文件系统数据模型对外提供服务。通过临时节点,Watcher等手段我们可以实现一些在分布式环境种很难做到的事情。

时间: 2024-11-05 12:19:53

Zookeeper-Zookeeper client的相关文章

ZooKeeper server &&client

写了一个关于zookeepeer应用的简单demo 服务端定时的向zookeeper集群注册,客户端监听zookeeper服务节点变化,一旦变化,立刻响应,更新服务端列表 服务端代码: #include <zookeeper/zookeeper.h> #include <zookeeper/zookeeper_log.h> #include <iostream> using namespace std; zhandle_t* zkhandle = NULL; const

Zookeeper——JAVA Client

一.zookeeper简介     一款管理分布式应用程序的协调服务系统 二.zookeeper应用场景          网上也有很多介绍,可以参见    http://blog.csdn.net/xinguan1267/article/details/38422149 本文主要介绍基于java的客户端开发 三.基于JAVA客户端实战 3.1Client      // 创建一个与服务器的连接 需要(服务端的 ip+端口号)(session过期时间)(Watcher监听注册)   ZooKee

[Big Data - ZooKeeper] ZooKeeper: A Distributed Coordination Service for Distributed Applications

ZooKeeper ZooKeeper: A Distributed Coordination Service for Distributed Applications Design Goals Data model and the hierarchical namespace Nodes and ephemeral nodes Conditional updates and watches Guarantees Simple API Implementation Uses Performanc

Zookeeper之Zookeeper的Client的分析

1)几个重要概念 ZooKeeper:客户端入口 Watcher:客户端注册的callback ZooKeeper.SendThread: IO线程 ZooKeeper.EventThread: 事件处理线程,处理各类消息callback ClientCnxnSocketNIO:继承自ClientCnxnSocket,专门处理IO 2)zookeeper初始化 应用提供watch实例 实例化zookeeper 实例化socket,默认使用ClientCnxnSocketNIO,可通过zookee

zookeeper python client

安装 zookeeper wget http://mirror.bit.edu.cn/apache/zookeeper/stable/zookeeper-3.4.6.tar.gz tar -xvzf zookeeper-3.4.6.tar.gz cd zookeeper-3.4.6/src/c ./configure sudo make install 安装zkpython wget https://pypi.python.org/packages/source/z/zkpython/zkpyt

zookeeper:zookeeper到底是啥

今天为了把zookeeper的客户端和服务器运行起来,需要先下载一个jre,安装以后需要把zookeeper的配置文件简单配一下就能启动了,运行 \bin\zkServer.cmd 和 \bin\zkCli.cmd 都是控制台程序. 主要的命令有 ls path create path data acl get path set path 其它的今天没试.. 其实就是类似redis的一个程序,可以存储和获取一些数据,数据类型貌似没有redis多,没有redis强大,但是主要功能是同步数据,多个应

Zookeeper全解析——Client端(转)

Zookeeper的Client直接与用户打交道,是我们使用Zookeeper的interface.了解ZK Client的结构和工作原理有利于我们合理的使用ZK,并能在使用中更早的发现问题.本文将在研究源码的技术上讲述ZK Client的工作原理及内部工作机制. 在看完ZK Client的大致架构以后我希望能有一种简单的方式描述ZK Client的基本结构,想来想去我觉得还是图片比较能反映情况,于是我画了这张大致的结构图: 我想既然我画了这张图,就让我们从这张图开始讲起吧. 模块: 我们可以认

Spring Cloud ZooKeeper集成Feign的坑2,服务调用了一次后第二次调用就变成了500,错误:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.n

错误如下: 2017-09-19 15:05:24.659 INFO 9986 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]56528192: startup date [Tue Sep 19 15:05:24 CST 2017]; root of context hierarchy 2017-09-19 15:05:24.858 INFO 9986 --

分布式队列ZooKeeper的实现

一.背景 有一些时候,多个团队需要共同完成一个任务,比如,A团队将Hadoop集群计算的结果交给B团队继续计算,B完成了自己任务再交给C团队继续做.这就有点像业务系统的工作流一样,一环一环地传下 去,直到最后一部分完成.在业务系统中,我们经常会用SOA的架构来解决这种问题,每个团队在ESB(企业服务股总线)服务器上部署自己的服务,然后通过消息中间件完成调度任务.对亍分步式的多个 Hadoop集群系统的协作,同样可以用这种架构来做只要把消息中间件引擎换成支持分步式的消息中间件的引擎就行了. 本文楼

Ubuntu 安装zookeeper

下载zookeeper   Zookeeper下载 下载以后将文件迁移到/home/Hadoop/文件夹下面 [email protected]:~/Downloads$ sudo mv zookeeper-3.4.9.tar.gz /home/Hadoop tar -zxvf解压 [email protected]:/home/Hadoop$ sudo tar -zxvf zookeeper-3.4.9.tar.gz 将文件夹zookeeper-3.4.9改成zookeeper [email