下载Zookeeper
从官网或者镜像下载对应的发行包:
我这里直接使用wget命令下载3.4.8版本:
wget http://mirror.tcpdiag.net/apache/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz
解压Zookeeper
下载后的发行包是tar.gz
格式的zookeeper-3.4.8.tar.gz
使用tar命令解压:
tar zxvf zookeeper-3.4.8.tar.gz
配置Zookeeper
zookeeper支持两种运行模式:独立模式(standalone)和复制模式(replicated)。
真正用于生产环境的Zookeeper肯定都是使用复制模式的,这样做可以避免单点问题。想要使用复制模式,但由于没有富余的机器能够使用,所以可以在单台机器上通过配置来使用复制模式,从而模拟真实的集群环境。
由于Zookeeper集群是通过多数选举的方式产生leader的,因此,集群需要奇数个Zookeeper实例组成,也就是说至少需要3台(1台不能算"群" :-] )。
配置zoo.conf文件
首先,将zookeeper-3.4.8这个目录copy三份,分别为zookeeper-3.4.8-01、zookeeper-3.4.8-02、zookeeper-3.4.8-03,代表着3个实例。
然后,分别创建zoo.conf配置文件,放在对应实例下的conf/目录下,文件内容如下:
# 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.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/var/lib/zookeeper-01
# the port at which the clients will connect
clientPort=2181
# servers
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
下面说明一下需要注意的几点:
- dataDir这个是指定实例数据的存放路径,不同的实例要区分开。并且,注释中提醒不要设置为/tmp目录。比如可以分别设为:
/var/lib/zookeeper-01
/var/lib/zookeeper-02
/var/lib/zookeeper-03
- clientPort这个是供客户端连接本实例的端口号,不同的实例也要区分。比如,可以分别指定为:2181、2182、2183。
- server.{X}这个X可以取数字,用来标识集群中唯一的一个实例。配置了多少个server.{X}就表示集群中有多少个实例。后面值的格式为:
{host}:{port1}:{port2}
其中,{host}为实例所在的主机IP,这里由于都在一台机器上,所以都指定为本机地址;{port1}是集群中实例之间用于数据通信的端口;{port2}是集群中实例进行leader选举时使用的通信端口。对于同一实例{port1}和{port2}是不可相同的。对于同一台机器部署多个实例的情况,不同实例的同一种端口也是需要区分的。
配置myid文件
前面提到的server.{X}配置项中的{X}就是一个实例的myid,它需要被写在对应实例的{dataDir}/myid文件中。
下面需要在每一个实例指定的{dateDir}目录下创建一个名为myid的文件,文件的内容就是一个数字,对应server.{X}中的X。
比如,这里是这样配置的:
在/var/lib/zookeeper-01/myid文件中写入1;
在/var/lib/zookeeper-02/myid文件中写入2;
在/var/lib/zookeeper-03/myid文件中写入3。
创建启动和停止的脚本
对于多个实例,分别启动和停止比较麻烦,可以写一个脚本来自动完成这个工作。
start-zk-servers.sh的内容:
echo `/root/zookeeper-3.4.8-01/bin/zkServer.sh start`
echo `/root/zookeeper-3.4.8-02/bin/zkServer.sh start`
echo `/root/zookeeper-3.4.8-03/bin/zkServer.sh start`
stop-zk-servers.sh的内容:
echo `/root/zookeeper-3.4.8-01/bin/zkServer.sh stop`
echo `/root/zookeeper-3.4.8-02/bin/zkServer.sh stop`
echo `/root/zookeeper-3.4.8-03/bin/zkServer.sh stop`
启动集群
运行启动脚本:sh start-zk-servers.sh
默认地,在用户目录(~/)下面会生成Zookeeper的日志文件zookeeper.out
。从日志中可以看出leader选举的过程和结果。
停止集群
运行停止脚本:sh stop-zk-servers.sh
连接Zookeeper
开头提到了笔者用于实验的Zookeeper集群部署在远程的vps上,下面用本地的Zookeeper客户端连接一下试试。
在本地同样下载Zookeeper的发行包,并解压,进入目录执行下面的命令:(将{host}替换成远程主机的IP,端口取集群中任意一个实例的clientPort)
bin/zkCli.sh -server {host}:2181
连上之后就可以对节点进行一些简单的操作:
结语
由于刚接触Zookeeper,对原理和配置的最佳实践还不甚了解,所以,这篇文章应当作笔者学习过程中的记录,不一定适合生产环境,切记!