Zookeeper 为分布式系统提供一次性的服务,管理和协调分布式系统的工作,保证系统的高有效性。为什么需要它?因为分布式系统很容易出错,特别是在处理竞争和死锁的过程中。

提供的功能包括:配置维护、名字服务、分布式同步、组服务等。


Client就是分布式系统中的节点,他们可以在ZooKeeper中设置监控,如果ZooKeeper中的目录节点存储的数据修改了,就会通知client。

设计目标:
  • 简单
  • 可复制

为什么叫做zookeeper?因为分布式系统就像一个动物园。。。

例子:
搜索引擎服务器集群:
  • 20个搜索引擎服务器:每一个负责总索引中的一部分的搜索任务
  • 2个总服务器(主备各一个):负责向搜索引擎服务器发出搜索请求,并合并结果
  • 1个web服务器:向总服务器发送搜索请求
20个搜索引擎服务器中,如果有5个正在生成索引,那么Zookeeper可以自动感知,并把搜索请求转向其他服务器。

安装和配置:
找到一个stable版本的下载地址:

解压:tar -zxvf zookeeper-3.4.6.tar.gz
创建软连接:ln -s zookeeper-3.4.6 zookeeper

在同一个机器中配置三个实例(Ensemble):
# cd zookeeper/conf/

配置第一个:
# cp zoo_sample.cfg zoo1.cfg
# vi   zoo1.cfg
配置内容:
tickTime=2000
clientPort=2181 
initLimit=5
syncLimit=2
dataDir=/var/lib/zookeeperdata/1 
server.1=localhost:2888:3888
server.2=localhost:2889:3889
server.3=localhost:2890:3890

各个参数的意义:
  • tickTime:心跳检测的时间间隔(毫秒),缺省:2000
  • clientPort:其他应用(比如solr)访问ZooKeeper的端口,缺省:2181
  • initLimit:初次同步的阶段(followers连接到leader的阶段),允许的时长(tick数量),缺省:10
  • syncLimit:允许followers同步到ZooKeeper的时长(tick数量),缺省:5
  • dataDir:数据(比如所管理的配置文件)的存放路径,初始时应该为空
  • server.X:X是ensemble中一个服务器的id,后面指定该server的hostname、第一个端口号用于ZooKeeper之间的通信、第二个端口用于和其他应用之间的通信

配置第二个:
# cp zoo1.cfg zoo2.cfg
修改:dataDir=/var/lib/zookeeperdata/2
修改:clientPort=2182

配置第三个:
# cp zoo1.cfg zoo3.cfg
修改:dataDir=/var/lib/zookeeperdata/3
修改:clientPort=2183

创建相应的dataDir目录和myid文件:
# cd /var/lib
# mkdir zookeeperdata
# cd zookeeperdata
# mkdir 1
# mkdir 2
# mkdir 3
# echo "1" > 1/myid
# echo "2" > 2/myid
# echo "3" > 3/myid

启动ZooKeeper:
# cd <ZOOKEEPER_HOME>
# bin/zkServer.sh start ./conf/zoo1.cfg
# bin/zkServer.sh start ./conf/zoo2.cfg
# bin/zkServer.sh start ./conf/zoo3.cfg

启动结果:
JMX enabled by default
Using config: /opt/app/zookeeper/bin/../conf/zoo1.cfg
Starting zookeeper ... STARTED

JMX enabled by default
Using config: /opt/app/zookeeper/bin/../conf/zoo2.cfg
Starting zookeeper ... STARTED

JMX enabled by default
Using config: /opt/app/zookeeper/bin/../conf/zoo3.cfg
Starting zookeeper ... STARTED

查看状态:
用jps命令查看进程:
# jps
24617 QuorumPeerMain (这个就是zookeeper进程)

/opt/app/zookeeper/bin/zkServer.sh status zoo1.cfg
JMX enabled by default
Using config: /opt/app/zookeeper/bin/../conf/zoo1.cfg
Error contacting service. It is probably not running.

说明有错误, 查看日志文件:
# cd <zookeeper_home>
# less  zookeeper.out
java.net.BindException: 地址已在使用
杀掉当前进程:
# kill -9 24617

再重启那三个实例后,查看状态:
# /opt/app/zookeeper/bin/zkServer.sh status zoo1.cfg
JMX enabled by default
Using config: /opt/app/zookeeper/bin/../conf/zoo1.cfg
Mode: follower
# /opt/app/zookeeper/bin/zkServer.sh status zoo2.cfg
JMX enabled by default
Using config: /opt/app/zookeeper/bin/../conf/zoo2.cfg
Mode: leader
# /opt/app/zookeeper/bin/zkServer.sh status zoo3.cfg
JMX enabled by default
Using config: /opt/app/zookeeper/bin/../conf/zoo3.cfg
Mode: follower

一切正常!

# echo mntr | nc localhost 2181


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐