首先能够从Zookeeper Release这里下载你须要的版本。html
Zookeeper的运行是比较简单的,由于Zookeeper已经提供了相应的在Windows和Linux下启动的脚本。java
下载下来以后,首先解压到你想要的目录。解压以后的(Windows)目录以下:node
图1:Zookeeper目录apache
而后能够进入conf目录下,能够看到一个zoo_sample.cfg的文件。能够拷贝该文件命名为zoo.cfg这个是Zookeeper启动时默认读取的配置文件。服务器
能够看到配置文件中已经有几个参数以下:分布式
#tickTime就是心跳时间,单位是毫秒。进一步说就是Zookeeper的客服端和服务器端通讯是#基于TCP长链接的, #为了确认Zookeeper客服端还活着每隔tickTime时间长度 #Zookeeper服务器端就发送一个心跳包来检查客户端的状态 tickTime=2000 #dataDir主要就是用来存放Zookeeper的数据快照和更新日志的 #快照就是Zookeeper在运行时的内存中的数据拷贝,Zookeeper会对所用的 #跟新操做都记录其日志,日志的文件就放在dataDir所指的目录下 #值得注意的是dataDir所指定的目录必定要是存在的,若是不存在Zookeeper服务器则启动不了 dataDir=/tmp/zookeeper #clientPort就是Zookeeper可客服端通讯所使用的端口 clientPort=2181
上面三个是Zookeeper最基本的配置,每个Zookeeper服务器都应该有。至于initTime和syncLimit两个参数是使用Zookeeper集群的时候才会使用。在后面的集群配置时在详细介绍。spa
配置后上面的三个参数以后就能够启动Zookeeper服务了。在Zookeeper的bin目录下能够看到有一些启动相关的脚本,以下图所示:日志
图2:Zookeeper启动脚本code
后缀是.sh的是Linux的脚本。这里使用Windows的脚本。首先启动Zookeeper服务器端,直接双击zkServerNaNd就能够了。若是没有出错,就会以下图三所示的界面。server
图3:Zookeeper服务端启动
图4:Zookeeper客户端启动
而后启动Zookeeper客户端。一样只须要双击zkCliNaNd就能够了,若是没有出现错误就会出现如上图4所示的命令窗口。接下来就能够利用Zookeeper提供的客户端作一些增删改的操做。
在介绍Zookeeper的使用以前,先来了解一下Zookeeper的用途。Zookeeper是一个高可靠的分布式协做服务。这个介绍太抽象了,至少对于当初没有什么经验的我是如此。我看了n次也没有弄明白是什么意思,因此有时候方向是很是重要的因素,没有相关的基础背景知识在努力也没有什么效率。
咱们先来假设一个场景,咱们有不少的服务,这些服务是分布式的。若是服务和分布式这个概念仍是比较抽象。咱们在细化一些,如今有不少台机器,每一台机器上有一些配置文件,每一台机器上有一些应用要共享这些配置文件,这些应用可能会对本身和其余机器上的这些配置文件执行读取、修改、添加和删除等操做。
进一步的思考着中间涉及到的操做,首先不一样机器之间的通讯,须要监听不一样机器的配置文件的数据变化,须要对操做进行同步等等。假设咱们有n台机器,这样每一台机器就要和其余的n-1台机器通讯,代价是至关昂贵的。
转换一下思路,想想观察者模式。因而咱们用一台机器来做为中心统一管理这些配置文件假设咱们把这个中心叫作注册中心。这样就从不一样机器之间的相互通讯,转换为了所用的机器和注册中心的通讯。那么问题来了当随着机器的增多,注册中心的压力会也来也大。而且注册中心可能出现故障。因而咱们须要集群,让多台机器组成有一个注册中心。可是集群之间要对所用机器提供一致的服务。数据的一致性怎么解决。若是本身解决这些问题的话,有太多的难点了,并且很是容易出错。例如为了所用的机器读到的配置文件都是一致的,就要解决不一样注册中心上的配置文件的同步问题。要对注册中心配置进行修改就要考虑到锁的问题,由于是集群。就要考虑分布式锁的问题。
Zookeeper就解决了这些问题,Zookeeper对数据进行了抽象。Zookeeper的数据组织是一个树结构,每个节点是一个Znode。咱们只须要对咱们关心的Znode进行操做就能够了。其余的事情Zookeeper都帮助咱们处理好了。
下面咱们来使用Zookeeper提供给咱们的客户端来作一些简单的操做,能够直接是用户help来查看有哪一些命令:
图5:Zookeeper help
ls / #查看有哪些节点 create /test create #建立一个名字为test数据为create的节点 get /test #获取名字为test的节点 set /test update #把名字为test的节点的数据改成 update delete /test #删除名字为test的节点
Zookeeper集群就是为了解决链接到Zookeeper的机器太多,Zookeeper服务器压力太多的问题。Zookeeper集群仍是对外提供一致的服务。因此对于客户端是没有太大的区别的,至于不一样机器的数据的一致性等问题这是Zookeeper解决的。
下面就简单的介绍一些Zookeeper的伪集群的配置,首先是上面提到过的intiTime和synLimit:
#initTime 就是集群中的Leader与Follower直接的心跳时间,这个和集群的管理相关的 #syncLimi是Leader和Follower直接发送信息的最大时间长度,注意initTime和syncLimit #都是tickTime的倍数。例如initLimit=5 ,那么intiLimit的值就是5给tickTime的时间 initLimit=10 syncLimit=5 而后就是每一台服务器的一些信息: #其中server.x x就是为了标识每一台服务器的id。而后是该服务器对应的ip地址,以后是 #zookeeper服务器 Leader与Follower之间通讯的端口 #最后是从新选取Leader的端口server.1=127.0.0.1:8881:7771 server.2=127.0.0.1:8882:7772 server.3=127.0.0.1:8883:7773
配置集群还有很重要的一点就是要在所配置的dataDir目录下创建一个myid的文件里面放上该服务器的id就是配置文件server.x对应的x的值。
咱们把Zookeeper拷贝三份以下图所示:
图6:Zookeeper伪集群
而后三个Zookeeper钟的配置分别对应为:
zk1: tickTime=2000 dataDir=D:/zookeeper/data/zk1 clientPort=2181 initLimit=10 syncLimit=5 server.1=127.0.0.1:8881:7771 server.2=127.0.0.1:8882:7772 server.3=127.0.0.1:8883:7773
zk2: tickTime=2000 dataDir=D:/zookeeper/data/zk2 clientPort=2182 initLimit=10 syncLimit=5 server.1=127.0.0.1:8881:7771 server.2=127.0.0.1:8882:7772 server.3=127.0.0.1:8883:7773
zk3: tickTime=2000 dataDir=D:/zookeeper/data/zk3 clientPort=2183 initLimit=10 syncLimit=5 server.1=127.0.0.1:8881:7771 server.2=127.0.0.1:8882:7772 server.3=127.0.0.1:8883:7773
注意由于这里配置的是在一台机器上的伪集群,因此所用的端口号才不一致,在真正的集群中最好吧这些端口号配为一致,方便管理。
接下来要作的事情就是启动对应机器的启动脚本就能够了,Zookeeper集群对于客户端是透明的,若是在java程序中使用的能够利用Zookeeper提供的zookeeper.jar包来连接Zookeeper服务器。
参考:
http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html
http://zookeeper.apache.org/doc/trunk/zookeeperProgrammers.html