ZooKeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization)、命名服务(Naming Service)、集群维护(Group Maintenance)等,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。ZooKeeper本身可以以Standalone模式安装运行,不过它的长处在于通过分布式ZooKeeper集群(一个Leader,多个Follower),基于一定的策略来保证ZooKeeper集群的稳定性和可用性,从而实现分布式应用的可靠性。
一、ZooKeeper的安装
1. 单机模式
下载zookeeper的安装包之后, 解压到合适目录. 进入zookeeper目录下的conf子目录, 重命名zoo_sample.cfg为zoo.cfg
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/data/zookeeperfile clientPort=2181
参数说明:
- tickTime: 这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳,单位毫秒.
- initLimit: follower和leader之间的最长心跳时间. 此时该参数设置为10, 说明时间限制为10倍tickTime, 即10*2000=20000ms=20s.
- syncLimit: 该参数配置leader和follower之间发送消息, 请求和应答的最大时间长度. 此时该参数设置为5, 说明时间限制为5倍tickTime, 即10000ms=10s.
- dataDir: 数据目录. 可以是任意目录.
- clientPort: 监听client连接的端口号.
- server.X=A:B:C 其中X是一个数字, 表示这是第几号server. A是该server所在的IP地址. B配置该server和集群中的leader交换消息所使用的端口. C配置选举leader时所使用的端口. 此参数在集群环境下配置
至此, zookeeper的单机模式已经配置好了. 启动server只需运行脚本:
通过jps命令可以查看ZooKeeper服务器进程,名称为QuorumPeerMain。
Server启动之后, 就可以启动client连接server了, 执行脚本:
关闭zookeeper:
2 集群模式
ZooKeeper集群中具有两个关键的角色:Leader和Follower。ZooKeeper集群中的包含多台server, 其中一台为leader, 集群中其余的server为follower. 集群中所有的结点作为一个整体对分布式应用提供服务,每个结点之间都互相连接,ZooKeeper采用一种称为Leader election的选举算法。如果ZooKeeper集群在运行过程中Leader出了问题,系统会采用该算法重新选出一个Leader。
第一步: 修改集群模式的配置, 需要在每一台都配置
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/data/zookeeperfile clientPort=2181 server.1=hd1:2888:3888 #hd1为hostname,详见上面的参数说明 server.2=hd2:2888:3888 server.3=hd3:2888:3888 server.4=hd4:2888:3888 server.5=hd5:2888:3888
第二步: 设置myid
在我们配置的dataDir指定的目录下面,创建一个myid文件,里面内容为一个数字,用来标识当前主机,conf/zoo.cfg文件中配置的server.X中X为什么数字,则myid文件中就输入这个数字,例如:
hadoop@hd2$ echo "2" > /data/zookeeperfile/myid
按照上述进行配置即可
第三步:启动ZooKeeper集群
在ZooKeeper集群的每个结点上,执行启动ZooKeeper的脚本,无先后顺序,如下所示:
$ bin/zkServer.sh start
由于ZooKeeper集群启动的时候,每个结点都试图去连接集群中的其它结点,先启动的肯定连不上后面还没启动的,所以日志部分的异常是可以忽略的。通过后面部分可以看到,集群在选出一个Leader后,最后稳定了。
第四步:安装验证
可以通过ZooKeeper的脚本来查看启动状态,包括集群中各个结点的角色(或是Leader,或是Follower),如下:
$ bin/zkServer.sh status
JMX enabled by default
Using config: /data/app/zookeeper-3.4.7/bin/../conf/zoo.cfg
Mode: leader
通过上面状态查询结果可见,hd2是集群的Leader,其余结点是Follower。
另外,可以通过客户端脚本,连接到ZooKeeper集群上。对于客户端来说,ZooKeeper是一个整体(ensemble),连接到ZooKeeper集群实际上感觉在独享整个集群的服务,所以,你可以在任何一个结点上建立到服务集群的连接,例如:
$ bin/zkCli.sh -server hd3:2181