ZooKeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization)、命名服务(Naming Service)、集群维护(Group Maintenance)等,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。ZooKeeper本身可以以Standalone模式安装运行,不过它的长处在于通过分布式ZooKeeper集群(一个Leader,多个Follower),基于一定的策略来保证ZooKeeper集群的稳定性和可用性,从而实现分布式应用的可靠性。
一、实验环境
- 三台PC机模拟实验
- 操作系统:ubuntu 12.04
- 机器ip:192.168.38.142 192.168.38.145 192.168.38.146
二、ZooKeeper Standalone模式
- 下载安装包 http://zookeeper.apache.org/下载最新稳定版本:3.4.4
- 解压到~/opt/zookeeper-3.4.4/
- 配置 将zookeeper-3.4.4/conf目录下面的 zoo_sample.cfg拷贝一份,命名为zoo.cfg。单机版配置如下:
tickTime=2000initLimit=10syncLimit=5dataDir=/data/zookeeperclientPort=2181
- 下面启动ZooKeeper服务器进程: bin/zkServer.sh start
- 通过jps命令可以查看ZooKeeper服务器进程,名称为QuorumPeerMain。
- 测试完成 bin/zkCli.sh -server localhost:2181 显示客户端连接成功信息,接着,可以使用help查看Zookeeper客户端可以使用的基本操作命令。
三、ZooKeeper Distributed模式
主机名称到IP地址映射配置
ZooKeeper集群中具有两个关键的角色:Leader和Follower。集群中所有的结点作为一个整体对分布式应用提供服务,集群中每个结点之间都互相连接,所以,在配置的ooKeeper集群的时候,每一个结点的host到IP地址的映射都要配置上集群中其它结点的映射信息。
ZooKeeper采用一种称为Leader election的选举算法。在整个集群运行过程中,只有一个Leader,其他的都是Follower,如果ZooKeeper集群在运行过程中Leader出了问题,系统会采用该算法重新选出一个Leader。因此,各个结点之间要能够保证互相连接,必须配置上述映射。ZooKeeper集群启动的时候,会首先选出一个Leader,在Leader election过程中,某一个满足选举算的结点就能成为Leader。 这里测试没有设置ip地址映射,直接使用ip地址。
- 修改ZooKeeper配置文件:
tickTime=2000initLimit=10syncLimit=5dataDir=/data/zookeeperclientPort=2181server.1=192.168.38.142:2888:3888server.2=192.168.38.145:2888:3888server.3=192.168.38.146:2888:3888
- 设置myid。在我们配置的dataDir指定的目录下面,创建一个myid文件,里面内容为一个数字,用来标识当前主机,conf/zoo.cfg文件中配置的server.X中X为什么数字,则myid文件中就输入这个数字。
- 启动ZooKeeper集群
在ZooKeeper集群的每个结点上,执行启动ZooKeeper服务的脚本,如下所示: bin/zkServer.sh start
- 测试完成。
查看日志文件zookeeper.out可以看到,由于ZooKeeper集群启动的时候,每个结点都试图去连接集群中的其它结点,先启动的肯定连不上后面还没启动的,所以上面日志前面部分的异常是可以忽略的。通过后面部分可以看到,集群在选出一个Leader后,最后稳定了。可以通过ZooKeeper的脚本来查看启动状态,包括集群中各个结点的角色(或是Leader,或是Follower) bin/zkServer.sh status
- 另外,可以通过客户端脚本,连接到ZooKeeper集群上。对于客户端来说,ZooKeeper是一个整体(ensemble),连接到ZooKeeper集群实际上感觉在独享整个集群的服务,所以,你可以在任何一个结点上建立到服务集群的连接。
参考资料
- http://zookeeper.apache.org/doc/r3.4.4/zookeeperStarted.html
- http://www.blogjava.net/hello-yun/archive/2012/05/03/377250.html
- ZooKeeper典型使用场景一览 http://www.kuqin.com/system-analysis/20111120/315148.html