ZooKeeper安装(windows环境下):

注意:启动时需要扫描zookeeper的配置文件,在这里按照要求书写该配置文件即可
ZooKeeper:分布式应用程序的分布式协调服务
ZooKeeper是一种用于分布式应用程序的分布式开源协调服务。它公开了一组简单的原语,分布式应用程序可以构建这些原语,以实现更高级别的服务,以实现同步,配置维护以及组和命名。它被设计为易于编程,并使用在熟悉的文件系统目录树结构之后设计的数据模型。它在Java中运行,并且具有Java和C的绑定。
众所周知,协调服务很难做到。他们特别容易出现比赛条件和死锁等错误。ZooKeeper背后的动机是减轻分布式应用程序从头开始实施协调服务的责任。
设计目标
ZooKeeper很简单。ZooKeeper允许分布式进程通过共享的层级命名空间相互协调,该命名空间的组织方式与标准文件系统类似。名称空间由数据寄存器组成 - 在ZooKeeper用语中称为znodes - 这些与文件和目录类似。与专为存储而设计的典型文件系统不同,ZooKeeper数据保存在内存中,这意味着ZooKeeper可以实现高吞吐量和低延迟数量。
ZooKeeper实现非常重视高性能,高可用性,严格有序的访问。ZooKeeper的性能方面意味着它可以在大型分布式系统中使用。可靠性方面使其不会成为单点故障。严格的排序意味着可以在客户端实现复杂的同步原语。
ZooKeeper被复制。与它协调的分布式进程一样,ZooKeeper本身也可以在称为集合的一组主机上进行复制。
| ZooKeeper服务 |
![]() |
组成ZooKeeper服务的服务器必须彼此了解。它们维护内存中的状态图像,以及持久性存储中的事务日志和快照。只要大多数服务器可用,ZooKeeper服务就可用。
客户端连接到单个ZooKeeper服务器。客户端维护TCP连接,通过该连接发送请求,获取响应,获取监视事件以及发送心跳。如果与服务器的TCP连接中断,则客户端将连接到其他服务器。
ZooKeeper是订购的。ZooKeeper使用反映所有ZooKeeper事务顺序的数字标记每个更新。后续操作可以使用该顺序来实现更高级别的抽象,例如同步原语。
ZooKeeper很快。它在“读取主导”工作负载中特别快。ZooKeeper应用程序在数千台计算机上运行,并且在读取比写入更常见的情况下表现最佳,比率大约为10:1。
数据模型和分层命名空间
ZooKeeper提供的名称空间非常类似于标准文件系统。名称是由斜杠(/)分隔的路径元素序列。ZooKeeper名称空间中的每个节点都由路径标识。
| ZooKeeper的分层命名空间 |
![]() |
节点和短暂节点
与标准文件系统不同,ZooKeeper命名空间中的每个节点都可以包含与之关联的数据以及子项。这就像拥有一个允许文件也是目录的文件系统。(ZooKeeper旨在存储协调数据:状态信息,配置,位置信息等,因此存储在每个节点的数据通常很小,在字节到千字节范围内。)我们使用术语 znode来说明我们正在谈论ZooKeeper数据节点。
Znodes维护一个stat结构,其中包括数据更改,ACL更改和时间戳的版本号,以允许缓存验证和协调更新。每次znode的数据更改时,版本号都会增加。例如,每当客户端检索数据时,它也接收数据的版本。
存储在命名空间中每个znode的数据以原子方式读取和写入。读取获取与znode关联的所有数据字节,写入替换所有数据。每个节点都有一个访问控制列表(ACL),限制谁可以做什么。
ZooKeeper也有短暂节点的概念。只要创建znode的会话处于活动状态,就会存在这些znode。会话结束时,znode将被删除。当您想要实现[tbd]时,短暂节点很有用。
代码:
public class ZookeeperDemo2 { //连接地址信息 private static String ADDRESS = "127.0.0.1:2181"; //超时session private static int TIMEOUT_SESSION = 5000; public static void main(String[] args) throws IOException, InterruptedException, KeeperException { ZooKeeper zk = new ZooKeeper(ADDRESS, TIMEOUT_SESSION, new Watcher() {
//事件监听 public void process(WatchedEvent event) { if (event.getState() == Event.KeeperState.SyncConnected) { if (event.getType() == Event.EventType.None) { //测试 try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.err.println("******zookeeper 启动连接.....******"); } } } }); String result = zk.create("/zkdemo02", "demo02".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); System.err.println("******zk创建节点:result:"+result+" ********"); Thread.sleep(3000); zk.close(); } }
返回结果:

思考:watcher通知的方法还未走完,线程往下执行,说明该监听方法类似于异步通知的方式,在做该逻辑处理时,需要状态处理时,加上信号量,阻塞操作
总结:
zookeeper特性 :拥有临时节点与持久化节点的概念---->如果是持久化节点,数据将一直保存至内存中.若是临时节点,在连接关闭以后,立即清除节点信息
Watcher事件通知---->对Zookeeper操作时,返回操作信息.是异步的,如果要对某事件进行操作,需要阻塞线程
下一章用zookeeper实现分布式锁.....


浙公网安备 33010602011771号