过去,每个应用都是一个单独的程序,只运行在一台单CPU的计算机上。而今天,情况发生了变化。在这个大数据和云计算的时代,应用由许多独立的程序组成的,它们运行在各种各样的计算机上。

    协调这些独立的程序远比写一个只运行在单个计算机上的程序困难很多。开发者很容易就陷入了协调的逻辑之中,而缺少时间去正确的编写应用的本身的逻辑。或者反过来说,开发者花了很短的时间来处理协同部分,简单的写了一个应急的主协调器,但是它是非常脆弱的,变成了一个不可靠的失败点。

    Zookeeper被设计成鲁棒性的服务,允许应用开发者聚焦在他们的应用逻辑上而不是协同服务。受文件系统API的启发,Zookeeper提供了一个简单的API,允许开发者实现通用的协同任务,例如选举主服务器、管理组成员关系和管理元数据。Zookeeper提供应用层的库函数,有两个主要的实现-Java和C。同时,Zookeeper是一个Java实现的服务组件,运行在一个独立的服务集群上。由专门的服务集群来运行Zookeeper使得它有更强的容错性和扩展性。

    设计一个有Zookeeper服务的应用程序时,理想的做法是分离应用数据和协同数据。比如,WEB邮件服务的用户对他们的邮件的内容更感兴趣,而不关心哪一台服务器在处理哪个特定邮箱的请求。邮件的内容是应用数据,然而哪个邮箱映射到哪个特定的邮件服务器是部分的协同数据(或者称为元数据)。Zookeeper集群是处理后者的。