一、什么是zookeeper

简介:zookeeper是一种用于分布式应用程序的高性能协调服务,提供一种集中式信息存储服务。分布式应用可以用它来实现诸如同步、配置管理、分组、命名服务等功能。
特点:数据存在内存中,类型文件系统的树形结构(文件和目录),高吞吐量和低延迟,集群高可靠。
作用:基于zookeeper可以实现分布式统一配置中心、服务注册中心、分布式锁等功能。
image.png

1.zookeeper = 文件系统+ 监听通知机制

1.1 文件系统

zookeeper维护一个类似文件系统的数据结构
zookeeper入门 - 图2
每个子目录项如 NameService 都被称作为 znode(目录节点),和文件系统一样,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的。

1.2监听机制

客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。

2.什么是分布式协调服务?

单机系统因处理能力上限、可用性、可靠性上面的考虑,变成分布式系统。
原来在单机进程中完成一件事的多个步骤,变为在多个计算机中完成,这时就需要协调各个计算节点做事的顺序。原来在单系统中资源竞争通过锁进行同步控制,现在变成了多个计算机进程间的资源竞争,也需要分布式协调。
我们可以把每个分布式系统中需要协调管理的公共基础部分抽取出来作为一个基础公共服务供人家使用,这就是分布式协调服务。

3.操作指令

image.png

4.Java API

image.png
ZooKeeper应用的开发主要通过Java客户端API去连接和操作 ZooKeeper集群。
可供选择的Java客户端API有:
·ZooKeeper官方的Java客户端API。
·第三方的Java客户端API。

4.1ZooKeeper官方的Java客户端API

ZooKeeper官方的客户端API提供了基本的操作。例如,创建会话、 创建节点、读取节点、更新数据、删除节点和检查节点是否存在等。不过,对于实际开发来说,ZooKeeper官方API有一些不足之处,具体如下:
·ZooKeeper的Watcher监测是一次性的,每次触发之后都需要重新进行注册
·会话超时之后没有实现重连机制。
·异常处理烦琐,ZooKeeper提供了很多异常,对于开发人员来说可 能根本不知道应该如何处理这些抛出的异常。
·仅提供了简单的byte[]数组类型的接口,没有提供Java POJO级别的序列化数据处理接口。
·创建节点时如果抛出异常,需要自行检查节点是否存在。
·无法实现级联删除。

4.2 ZkClient开源客户端

ZkClient是一个开源客户端,在ZooKeeper原生API接口的基础上进 行了包装,更便于开发人员使用。ZkClient客户端在一些著名的互联网开源项目中得到了应用,例如,阿里的分布式Dubbo框架对它进行了无缝集成。
ZkClient解决了ZooKeeper原生API接口的很多问题。例如, ZkClient提供了更加简洁的API,实现了会话超时重连、反复注册 Watcher等问题。虽然ZkClient对原生API进行了封装,但也有它自身的不足之处,具体如下:
·ZkClient社区不活跃,文档不够完善,几乎没有参考文档。
·异常处理简化(抛出RuntimeException)。
·重试机制比较难用。
·没有提供各种使用场景的参考实现。

4.3 Curator开源客户端

Curator是Netflix公司开源的一套ZooKeeper客户端框架,和ZkClient 一样它解决了非常底层的细节开发工作,包括连接、重连、反复注册 Watcher的问题以及NodeExistsException异常等。
Curator还为ZooKeeper客户端框架提供了一些比较普遍的、开箱即用的、分布式开发用的解决方案,例如Recipe、共享锁服务、Master选举机制和分布式计算器等,帮助开发者避免了“重复造轮子”的无效开发工作。
另外,Curator还提供了一套非常优雅的链式调用API,与ZkClient 客户端API相比,Curator的API优雅太多了。