Zookeeper是一个集中式服务,主要负责分布式服务调度,它用来完成配置管理、名字服务、提供分布式锁以及集群管理等工作。
- 配置管理
应用程序中经常有一些配置,比如数据库连接等。一般我们都是使用配置文件的方式,在代码中引入这些配置文件。这种方式是适合只有一台服务器的时候。当我们有很多服务器时,就需要寻找一种集中管理配置的方法,而不是在每个服务器上存放配置文件。我们在这个集中的地方修改了配置,所有需要配置的服务都能读取配置。一般我们用一个集群来提供这个配置服务以提升可靠性。
Zookeeper保证了配置在集群中的一致性,它使用Zab这种一致性协议来提供一致性。现在有很多开源项目使用Zookeper来维护配置,比如在HBase中,客户端就是链接一个Zookeeper,获取必要的HBase集群的配置信息,然后才可以进一步操作。在开源的消息队列Kafka中,也是用Zookeeper来维护broker的信息。
- 名字服务
DNS把域名对应到IP地址,从而为我们提供了名字服务。在应用系统中我们有时也会需要这类的名字服务,特别是在服务特别多的时候。我们只需要访问一个共同的地方,它提供统一的入口。
- 分布式锁
Zookeeper是一个分布式协调服务。我们利用Zookeeper来协调多个分布式进程之间的活动。在一个分布式环境中,为了提高可靠性,集群中的每台服务器上都部署着同样的服务。我们使用分布式锁,在某个时刻只让一个服务去干活,当这个服务出问题时就将锁释放,并立即切换到另外的服务上。比如HBase的Master就是采用这种机制。在Zookeeper中是通过选举leader完成的分布式锁。
- 集群管理
在分布式的集群中,经常会由于各种原因,比如硬件故障、软件故障、网络故障,有新的节点加入进来,也有老的节点退出集群。这个时候,集群中其他机器需要感知到这种变化,然后格努这种变化作出对应的决策。比如:一个分布式的SOA架构中,服务是一个集群提供的,当消费者访问某个服务时,就需要确定哪些节点可以提供该服务。Kafka的队列就采用了Zookeeper作为消费者的上下线管理。
- 总结
Zookeeper就是一种可靠的、可扩展的、分布式的、可配置的协调机制,用来统一分布式系统的状态。