What is ZooKeeper?
ZooKeeper是什么?
ZooKeeper is a distributed, open-source coordination service for distributed applications.
ZooKeeper提供一个简单的原语集合,以便于分布式应用可以在它之上构建更高层次的同步服务。ZooKeeper的设计非常易于编程,它使用的是类似于文件系统那样的树形数据结构。
想正确的实现一个协作服务是出了名的难,最常见的错误就是竞争条件和死锁。ZooKeeper的动机就是解放开发分布式应用的程序员,让他们避免从零开始实现协作服务。
Design Goal
ZooKeeper is simple.
ZooKeeper维护着一个hierarchal的名字空间,这个名字空间的组织形式很想标准文件系统。分布式的进程可以通过操作这个共享的名字空间来协作。ZooKeeper的名字空间由称作znodes的data register组成,znodes和文件,路径很像。但是不同于典型的文件系统,ZooKeeper的数据都存放在内存中,这意味着ZooKeeper的吞吐量会很高,同时latency会比较低。
ZooKeeper的实现更重视high performance, highly available, strictly ordered access. 也就是说ZooKeeper要能够用于大型的分布式系统,同时要避免出现单点故障,还能够通过自身的有序性以便让client实现复杂的同步原语。
ZooKeeper is replicated.
分布式的系统不可避免的都会有备份。
ZooKeeper Service |
组成ZooKeeper service的所有server都必须知道其他server的存在。这些server在内存中维护着一个状态的镜像,还有持久存储的transaction logs和快照(在硬盘上)。只要集群中多数server可访问,那么ZooKeeper服务就可用。
Clients会连接到某一个ZooKeeper server上。client维护一个TCP连接,通过TCP连接, client发送请求,得到response,watch event,还有发送心跳。如果连接到某个server的TCP连接断了,client将会连接到另一个server上。
ZooKeeper is ordered.
ZooKeeper给每个update操作都附上了stamp,通过stamp来反映所有transaction的顺序。
ZooKeeper is fast.
ZooKeeper很快,尤其是在读操作占主导地位的服务中。ZooKeeper应用可以跑在上千台机器上,当读写操作的比例为10:1时,性能达到最佳。
Data model and the hierarchical namespace
ZooKeeper提供的名字空间非常像一个标准文件系统。name的形式和Unix的路径一样,由slash隔开。ZooKeeper的名字空间中的每个node都有一个path指定。
ZooKeeper’s Hierarchical Namespace |
Nodes and ephemeral nodes
ZooKeeper namespace的一个特点是:每个znode都可以存放数据或者连接child,就好像一个文件系统的文件同时可以是路径一样。(ZooKeeper被设计为用来存储coordination data:包括status imformation,configuration,location information等等,所以每个znode存放的数据通常是很小的,数量级在KB范畴)
Znode维护着一个stat结构,包括data changes,ACL changes的version number,还有timestamp。这样可以检查cache的有效性以及coordinated updates。每当一个znode的data改变了,version number就会增加。例如,只要一个client取了data,那么它同时也会受到这个data的version。
对每个znode中存储的data的读写操作都是原子的。读操作会拿到这个znode所关联的所有data bytes。而写操作会覆盖掉所有的data。每个node都有一个Access Control List来限制谁能做什么操作。
ZooKeeper还有临时node(ephemeral node)的概念。这种ephemeral znode只存在于创建该znode的session中。session结束了,这个znode也就被删除了。
Conditional updates and watches
ZooKeeper支持watches。Clients可以在某个znode上设置一个watch。这个znode发生的任何变化都会触发这个watch,随后watch被删除。当watch被触发时,client会受到一个packet说该znode已经被修改了。如果client和ZooKeeper server的连接断了,那么client会受到一个local notification。
Guarantees
ZooKeeper非常快,用起来也很简单。由于它的目标是作为更复杂的服务的基础架构,所以它提供了一系列的guarantee,包括:
- Sequential Consistency – 从同一个client来的updates动作会按照这些updates发送时的顺序执行。
- Atomicity – Updates要么成功,要么失败。不会有部分成功的结果。
- Single System Image – 无论client连接到了哪个server,只会看到相同的view。
- Reliability – 只要一个update成功执行了,那么在一个client覆盖此次update之前,该update的结果一直有效。
- Timeliness – 保证clients在一个确定的时限内能够观察到最新的系统数据。