先来看官方对什么是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是一种集中式服务,用于维护配置信息、命名、提供分布式同步和提供组服务。所有这些类型的服务都以某种形式被分布式应用程序使用。每次实现它们时,都会有大量的工作用于修复不可避免的bug和竞争条件。由于实现这类服务的困难,应用程序最初通常会忽略它们,这使得它们在发生变化时变得脆弱,难以管理。即使操作正确,这些服务的不同实现在部署应用程序时也会导致管理复杂性。
意思大致是ZooKeeper专门用于 configuration information(配置信息), naming(命名), distributed synchronization(分布式同步), group services(分组服务);这些属于可复用的基础能力,如果每个系统都开发这样一套就会有大量的工作和bug,而且开发前期往往会忽略这些问题,到后期就很难维护,所以为了避免问题和重复造*,用ZooKeeper。
进一步来看官方overview对zk的描述
ZooKeeper的设计点主要有以下部分:
简单:
ZooKeeper允许分布式进程通过共享的分层namespace相互协调,该namespace的组织方式类似于标准文件系统。namespace由数据寄存器组成——用ZooKeeper的说法,称为znode——这些寄存器类似于文件和目录。与为存储而设计的典型文件系统不同,ZooKeeper数据保存在内存中,这意味着ZooKeeper可以实现高吞吐量和低延迟数。
ZooKeeper的实现使高性能、高可用性和严格有序的访问成为可能。ZooKeeper的性能方面意味着它可以用于大型分布式系统。可靠性方面使其不会成为单点故障。严格的排序意味着复杂的同步原语可以在客户端实现。
复制:
与它所协调的分布式进程一样,ZooKeeper本身旨在通过一组称为ensemble的主机进行复制。
ZooKeeper的servers之间都知道相互之间的存在。它们维护状态的内存image,以及持久存储中的事务日志和快照。只要大多数服务器都可用,ZooKeeper服务就会可用。
客户端连接到单个server。客户端维护一个TCP连接,通过该连接发送请求、获取响应、获取watch event和发送心跳。如果与服务器的TCP连接中断,客户端将连接到其他server。
有序:
ZooKeeper在每次更新上都贴上一个数字,该数字反映了所有ZooKeeper事务的顺序。后续操作可以使用顺序实现higher-level abstractions,例如synchronization primitives。
快速:
它在“以读取为主”的工作负载中速度特别快。ZooKeeper应用程序在数千台机器上运行,在读操作比写操作更常见的情况下,它的性能最好,比率约为10:1。