ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序能够基于它实现同步服务,配置维护和命名服务等。Zookeeper是hadoop的一个子项目,其发展历程无需赘述。在分布式应用中,因为工程师不能很好地使用锁机制,以及基于消息的协调机制不适合在某些应用中使用,所以须要有一种可靠的、可扩展的、分布式的、可配置的协调机制来统一系统的状态。Zookeeper的目的就在于此。html
通俗来说,ZooKeeper只是一个持久化存储工具。这个存储工提供了增删改查之外的一些分布式系统在进行通讯时须要的基础特性,如具备父子关系的树形数据节点,节点临时性,节点顺序性,节点修改事件的发布订阅,zk集群高可用和强一致等等。这些特性就像是基础的加减乘除,开发人员利用zk的这些基础特性,与业务进行组合,能够实现诸多分布式系统须要的功能,如命名服务,分布式锁,分布式服务的动态发布的订阅等等。所以,zk的应用场景是丰富的,在分布式系统的业务开发过程当中,只要咱们有足够的想象力,老是可以利用那些加减乘除构建出咱们须要的业务。因此说zk值得身到处处都是分布式的互联网时代的咱们学习和掌握。掌握zk是当代java开发同窗们必备的一个基础技能,就像是mysql和redis同样。
本文不会手把手教学zk的api,而是用一种俯视的姿态来理解zk。理解完了以后,写代码须要的就只有想象力和google了。真正作到了无招胜有招,不教api赛过教api。java
首先,zk服务端是纯java实现,这一点就会让诸多java开发同窗感到畏手畏脚,以为zk的学习是否是要去瞅源码啊,那岂不是很难。这种先入为主的观念是错误的。除非你想到zk项目仓库提交代码作贡献,否则做为单纯使用者的你是不用去关注zk服务端的实现的。能够类比mysql,mysqld是c语系的实现,那么在平常工做使用中除了想要拔高学习,你有想过去看看它的源码吗?所以,和msyql同样,zk服务端对于咱们普通开发人员来讲实际上是透明的,咱们只须要在项目中集成zk的sdk也就是相似mysql 驱动,驱动利用传输层网络协议与服务端通讯,而咱们就能够利用驱动暴露的接口进行业务开发。
基于上面的假设,zk和mysql同样,都是提供持久化存储服务的工具,只是除了增删改查外各自提供的特性不一样。那么接下来就很好理解了。python
zk的安装运维不是本文的重点。这部份内容参考zookeeper安装便可。本质上来讲其实就是配置部署一个java应用,这个应用能够集群部署用来提升可用性。至于集群间读写分离,数据同步等内容对于使用者来讲是透明的,由zk集群实例依照zab协议自动进行。其中的实例角色如领导者,观察者,追随者在集群启动过程当中自动选举产生。如无绝对必要,那就让子弹飞吧。mysql
和mysql同样,zk的客户端分为两个部分。一个是基于命令行的黑窗口。一个是zk链接驱动。zk是java实现,那么zk命令行的启动须要JRE。在zk的bin
目录下,根据平台执行cli
启动脚本便可打开命令行客户端,默认链接localhost。该客户端有许多命令,同时支持自动补全。这部分通常在调试阶段使用,用的也不多。详细
除此以外,就是用于和本身的项目集成的zk 驱动了。和msyql同样,虽然zk服务端是纯java实现,可是zk驱动提供了多种语言的实现,如python,c,java等,能够和多种语言生态的应用进行整合,利用tcp等传输层协议与服务端通讯,提供操做zk的接口。mysql也如此,给各个语言生态的应用提供了驱动,与服务端通讯,提供了操做mysql数据的接口。
本文主要讲解zk在java生态中的使用。linux