一、什么是Zookeeper?
官方文档上这么解释zookeeper:
ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. All of these kinds of services are used in some form or another by distributed applications. Each time they are implemented there is a lot of work that goes into fixing the bugs and race conditions that are inevitable. Because of the difficulty of implementing these kinds of services, applications initially usually skimp on them, which make them brittle in the presence of change and difficult to manage. Even when done correctly, different implementations of these services lead to management complexity when the applications are deployed.
ZooKeeper是一种集中式服务,用于维护配置信息,命名,提供分布式同步和提供组服务。所有这些类型的服务都以分布式应用程序的某种形式使用。每次实施它们都需要做很多工作来修复不可避免的错误和竞争条件。由于难以实现这些类型的服务,应用程序最初通常会吝啬它们,这使得它们在变化的情况下变得脆弱并且难以管理。即使正确完成,这些服务的不同实现也会在部署应用程序时导致管理复杂性。
第一次接触Zookeeper的时候,看到这一大段话,说实话我是一脸懵逼的,说的什么,我完全不懂啊…… 后来我查阅了大量的资料,然后做了一些总结,Zookeeper可以用下面这句话来概括:
zookeeper=文件系统+监听通知机制。
1.1 文件系统
Zookeeper维护一个类似文件系统的数据结构:
每个子目录项如 app1 都被称作为 znode(目录节点),和文件系统一样,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的。
Zookeeper两种类型的节点:
-
持久化节点
-
临时节点
若要进一步细分可以分为四种:
• PERSISTENT-持久化目录节点
复制代码
客户端与zookeeper断开连接后,该节点依旧存在
• PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
复制代码
客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
• EPHEMERAL-临时目录节点
复制代码
客户端与zookeeper断开连接后,该节点被删除
• EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
复制代码
客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号
1.2 监听通知机制
客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。
二、Zookeeper能做什么?
以上已经对Zookeeper是什么做了简要介绍,貌似文件存储系统+监听通知机制跟什么配置中心、注册中心、集群管理、分布式协调八竿子打不着啊,完全联系不起来。
别急,我们先来看一组名词:
• Znode
每个节点称做一个ZNode。每个ZNode都可以通过其路径唯一标识,同时每个节点还可以存储少量数据。
节点可分为常规节点,临时节点和顺序节点
• Session
每个zk客户端与zk连接时会创建一个session,在设置的sessionTimeOut内,客户端会与zk进行心跳包的定时发送,从而感知每个客户端是否宕机,如果创建某个临时Znode的对应session销毁时,相应的临时节点也会被zk删除。
• Watcher
监听机制,监听某个Znode 当该znode发生变化时,会回调该watcher,但是这个watcher是一次性的,下次需要监听时还得再注册一次。
• 强一致性
分布式存储系统中对数据事务的描述,表示所有节点的数据将保持一致,Zookeeper能够保证集群部署时,各节点的数据保持一致。
复制代码
仔细思考一下,貌似能做很多事情:
-
既然能够存储信息,又能够做监听,那么可以当做发布-订阅系统来使用;
-
客户端与zk的连接是一个session,那么可以用Zookeeper来监听客户端的状态
-
zookeeper创建的临时节点在session关闭时会删除,那么可以用Zookeeper来保存某些跟客户端强相关的数据,自动清除后同步给相关节点。
由于篇幅问题,本篇不详细描述如何实现,将在下一篇进行描述。
原创作品,转载请注明出处。 学习资料:zookeeper.apache.org/