一、Zookeeper的基本安装与配置
首先可以从这里下载你需要的版本。
Zookeeper的运行是比较简单的,因为Zookeeper已经提供了相应的在Windows和Linux下启动的脚本。
下载下来之后,首先解压到你想要的目录。解压之后的(Windows)目录如下:
图1:Zookeeper目录
然后可以进入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集群的时候才会使用。在后面的集群配置时在详细介绍。
配置后上面的三个参数之后就可以启动Zookeeper服务了。在Zookeeper的bin目录下可以看到有一些启动相关的脚本,如下图所示:
图2:Zookeeper启动脚本
后缀是.sh的是Linux的脚本。这里使用Windows的脚本。首先启动Zookeeper服务器端,直接双击zkServerNaNd就可以了。如果没有出错,就会如下图三所示的界面。
图3:Zookeeper服务端启动
图4:Zookeeper客户端启动
然后启动Zookeeper客户端。同样只需要双击zkCliNaNd就可以了,如果没有出现错误就会出现如上图4所示的命令窗口。接下来就可以利用Zookeeper提供的客户端做一些增删改的操作。
二、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的节点的数据改为 updatedelete /test #删除名字为test的节点
三、Zookeeper的集群的配置
Zookeeper集群就是为了解决连接到Zookeeper的机器太多,Zookeeper服务器压力太多的问题。Zookeeper集群还是对外提供一致的服务。所以对于客户端是没有太大的区别的,至于不同机器的数据的一致性等问题这是Zookeeper解决的。
下面就简单的介绍一些Zookeeper的伪集群的配置,首先是上面提到过的intiTime和synLimit:
#initTime 就是集群中的Leader与Follower直接的心跳时间,这个和集群的管理相关的#syncLimi是Leader和Follower直接发送信息的最大时间长度,注意initTime和syncLimit#都是tickTime的倍数。例如initLimit=5 ,那么intiLimit的值就是5给tickTime的时间initLimit=10syncLimit=5然后就是每一台服务器的一些信息:#其中server.x x就是为了标识每一台服务器的id。然后是该服务器对应的ip地址,之后是 #zookeeper服务器 Leader与Follower之间通信的端口 #最后是重新选取Leader的端口server.1=127.0.0.1:8881:7771server.2=127.0.0.1:8882:7772server.3=127.0.0.1:8883:7773
配置集群还有很重要的一点就是要在所配置的dataDir目录下建立一个myid的文件里面放上该服务器的id就是配置文件server.x对应的x的值。
我们把Zookeeper拷贝三份如下图所示:
图6:Zookeeper伪集群
然后三个Zookeeper钟的配置分别对应为:
zk1:tickTime=2000dataDir=D:/zookeeper/data/zk1clientPort=2181initLimit=10syncLimit=5server.1=127.0.0.1:8881:7771server.2=127.0.0.1:8882:7772server.3=127.0.0.1:8883:7773
zk2:tickTime=2000dataDir=D:/zookeeper/data/zk2clientPort=2182initLimit=10syncLimit=5server.1=127.0.0.1:8881:7771server.2=127.0.0.1:8882:7772server.3=127.0.0.1:8883:7773
zk3:tickTime=2000dataDir=D:/zookeeper/data/zk3clientPort=2183initLimit=10syncLimit=5server.1=127.0.0.1:8881:7771server.2=127.0.0.1:8882:7772server.3=127.0.0.1:8883:7773
注意因为这里配置的是在一台机器上的伪集群,所以所用的端口号才不一致,在真正的集群中最好吧这些端口号配为一致,方便管理。
接下来要做的事情就是启动对应机器的启动脚本就可以了,Zookeeper集群对于客户端是透明的,如果在java程序中使用的可以利用Zookeeper提供的zookeeper.jar包来链接Zookeeper服务器。
参考: