Zookeeper以它的稳定性,高并发并且简单易用,目前在很多分布式系统中作为协调服务的中间件。Zookeeper官方文档很全面,目前,最新稳定版本为3.4.8:
网上关于Zookeeper的文档也非常多而且繁杂,但是,在各方面深入到骨髓的文章不多,博主手机了网上很多关于zk的资料,在这里整理总结并输出。最后,利用zookeeper开发一个分布式ID生成器为服务作为例子。
为什么Zookeeper会出现?
在典型的Master-Worker架构中, Worker需要告诉Master自己可以接受任务, 然后Master将分配任务给Worker。 又例如,在多线程上下文中有用的同步原语在分布式系统中同样也有用,但有一个重要的区别, 在无共享架构中,不同的机器除了共享网络外,不会共享其他任何东西。
同步原语中最常用的就是事件机制,时间一般有三种状态:
- wait- 执行中的线程被挂起直到事件为真。如果执行wait时事件已为真,则空操作。
- set- 设置事件状态为真,所有等待此事件的线程变为可调度。
- clear- 设置事件状态为假。
虽然有很多消息传递算法可以实现同步原语,但是通过一些提供共享存储和有序属性的组件来实现会更容易一些, Zookeeper就是这样做的。
就像螺丝刀对螺丝,螺丝刀可以转动螺丝,但这并不能完全说明它的功能,更重要的是它可以组装我们的家具和电子设备等。 而Zookeeper则可以在 分布式系统中帮助我们协调任务。Zookeeper是伴随Hadoop产生的, 而Hadoop生态系统中,很多项目都是以动物来命名,如Pig,Hive等, 似乎像一个动物园,这样就得到动物园管家的名称”Zookeeper”。
Apache Zookeeper 是由 Apache Hadoop 的 Zookeeper 子项目发展而来,现在已经成为了 Apache 的顶级项目。Zookeeper 为分布式系统提供了高效可靠且易于使用的协同服务,它可以为分布式应用提供相当多的服务,诸如统一命名服务,配置管理,状态同步和组服务等。 Zookeeper 接口简单,开发人员不必过多地纠结在分布式系统编程难于处理的同步和一致性问题上,你可以使用 Zookeeper 提供的现成(off-the-shelf)服务来实现分布式系统的配置管理,组管理,Leader 选举等功能。
Zookeeper可解决的问题
Master-Worker架构是比较有代表性的,其中阐述了很多常用的功能,如 Master选举,跟踪可用的Worker,维护应用元数据。 在Master-Worker架构,我们需要解决三个关键的问题:
- Master崩溃。Master一旦崩溃,系统将不能在分配新任务或者重新分配来自Worker的任务。
- Worker崩溃。Worker一旦崩溃,那么分配给它的任务将不能被完成。
- 通信失败。Master和Worker之间不能交换信息,Worker将不能学习分配给它的新任务。
针对上面的问题,我们需要做到以下几点
- Master选举。让可用的Master分配任务给Worker的过程是至关重要的。
- 崩溃检测。Master必须能检测Worker什么时候崩溃或者不可连接。
- 组成员管理。Master必须能知道哪些Worker可以执行任务。
- 元数据管理。Master和Worker必须能以可靠的方式存储任务分配和执行状态的信息。
通过Zookeeper Client API我们可以做什么:
- 强一致,有序性和持久化操作。
- 典型的同步原语实现。
- 在分布式系统中,更容易处理往往不正确的并发行为。
- Zookeeper 维护了大规模分布式系统中的常用对象,比如配置信息,层次化命名空间等
Zookeeper不能做什么:
Zookeeper不适合用于大容量存储。对于大容量存储 ,我们完全可以考虑使用数据库或者分布式文件系统等,重要的是,我应该将业务数据 和 用于协调和控制的数据分离。Zookeeper本身并没有提供如 Master选举,跟踪活动进程的功能,而是提供一些实现这些功能的工具。
应用了Zookeeper的一些比较出名的应用有:
- Apache HBase。HBase中,Zookeeper用于选举集群Master,跟踪可用的Server,和保存集群元数据。
- Apache Kafka。Kafka中,Zookeeper用于崩溃检测,实现Topic发现,和维护Topic的生产和消费状态。
- Apache Solr。Solr中,Zookeeper用于存储集群的元数据信息及协调元数据的更新。
- Yahoo!Fetching Server。Fetching Service中,Zookeeper用于Master选举,崩溃检测,元数据保存。
- Facebook Messages。Messages中,Zookeeper用于实现分片和故障迁移的控制器,和服务发现。