Zookeeper 为分布式应用提供了一个高效可靠的分布式协调服务,提供了诸如统一命名服务、配置管理和分布式锁等分布式的基础服务。它的实现是依赖于 ZAB 协议,实现了一种主备模式(master-slave)的架构来保持集群中数据的一致性。Zookeeper 使得分布式应用可以通过一个共享的树形结构的命名空间实现协调,且 zookeeper 将全量数据存储在内存中,以此来实现提高服务器的吞吐、减少延迟的目的。由于 zookeeper 将全量数据存储在内存中,并且直接服务于客户端的所有非事务请求,因此它尤其适合以读操作为主的应用场景。
zookeeper 集群中包括三个角色:Leader、Follow、Observer。其中 Leader 是通过选举确定的一台机器,为客户端提供读写功能,一个集群同一时间只能有一个实际上的 Leader。Follow 和 Observer 一样,在不影响写性能的前提下提升集群的读性能,但 Follow 会参加 Leader 的选举,Observer 不会参加任何的投票。Zookeeper 集群节点的数量为奇数个。它的节点有三种类型,分别是临时节点、持久节点和顺序节点。
最重要的功能是 Watcher 数据变更通知的功能,它是 Zookeeper 的核心功能。Watcher 可以监控目录节点的数据变化以及子目录节点的变化,一旦这些状态发生变化时,服务器就会通知所有设置在这个目录节点上的 watcher,从而每个客户端都很快知道它所关注的目录节点的状态,从而做出相应的反应。
它的应用场景有:统一命名服务,集群管理,master 选举,分布式屏障、分布式队列、分布式锁、分布式协调 / 通知等。
二、为什么选择 zookeeper?
首先,zookeeper 无论从性能、易用性还是稳定性来说,都已经达到了一个工业级产品的标准。在解决分布式数据一致性上,除了 zookeeper 外,目前还没有一个成熟稳定且被大规模应用的解决方案。
其次 zookeeper 是开放源代码的,同时也是免费的,目前已经有越来越多的大型分布式项目将 zookeeper 作为其核心组件,如 Hadoop、HBase、Solr 等。