Apache ZooKeeper是一个非常出色的分布式协调系统,在配置管理、命名服务、分布式同步等方面应用广泛。其基本思想来源于Google的Chubby,可以认为是其开源实现。在Hadoop生态系统中,ZooKeeper发挥着非常作用的作用,kafka等很多系统都依赖于ZooKeeper提供服务。ZooKeeper通过选举产生一个Leader,其他节点作为Follower。Leader发生故障时会自动重新选举,具备很高的可用性。
ZooKeeper集群组成如下,写操作都由Leader来完成,如果其他节点接受到写操作,会自动转发给Leader:
ZooKeeper的数据模型通过ZNode组成类似文件系统的目录结构;
本文描述一个3节点集群的搭建步骤,分别为master,slave1,slave2.
在master节点上:
#wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.3.6/zookeeper-3.3.6.tar.gz
# tar zxvf zookeeper-3.3.6.tar.gz
# mv zookeeper-3.3.6 /home/zookeeper-3.3.6
ZooKeeper的配置集中在conf/zoo.cfg文件中,基础的配置包括一些时间参数,数据目录,机器其他节点等。
cd /home/zookeeper-3.3.6/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
下面是一个基本的配置
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
dataDir=/home/data/zookeeper/data
dataLogDir=/home/data/zookeeper/log
# the port at which the clients will connect
clientPort=2181
#集群节点组成
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
tickTime是ZooKeeper很多地方用到的一个时间单位,其他时间配置很多以这个为单位来计算。这配置为2秒钟。
initLimit是ZooKeeper启动时,Follower节点从Leader节点同步数据允许的最长时间。
syncLimit时节点通信时请求响应的最长时间。
dataDir和dataLogDir分别配置存储ZooKeeper数据和事务日志的目录。
clientPort是ZooKeeper对外提供服务的端口,客户端通过该端口连接ZooKeeper。
节点组成部分配置的是集群中各个节点的信息,1,2,3分别表示各个节点的id,每个节点的数据目录下需要配置一个叫myid的文件,指定该ZooKeeper节点的id,下面会提到。右边分别是主机、集群通信端口(Follower联系Leader的时候连接到该端口),最后一个端口是选举Leader的时候使用的端口。
创建数据和日志目录:
mkdir /home/data/zookeeper
mkdir /home/data/zookeeper/data
mkdir /home/data/zookeeper/log
配置id:
vim /home/data/zookeeper/data/myid
文件内容:
1
将master的ZooKeeper复制到slave1和slave2:
scp -rp /home/zookeeper-3.3.6/ root@slave1:/home
scp -rp /home/zookeeper-3.3.6/ root@slave2:/home
scp中的r
参数表示复制的是个目录,p
保留权限等信息。
同时需要在132和134创建相应的目录,然后myid文件分别为2,3. 具体做法参考前文。
在3台机器上分别启动ZooKeeper。
使用bin目录中的脚本启动ZooKeeper,主要目录前面的./。
cd /home/zookeeper-3.3.6/bin/
./zkServer start
测试,使用zkCli.sh连接到ZooKeeper:
./zkCli.sh
没有提供主机和端口,默认连接到本地的2181端口:
help
命令可以获取帮助,ls
列出当前ZooKeeper中的节点列表。
如果安装了HBase,在HBase管理界面可以看到使用了搭建的ZooKeeper集群:
(完)