Zookeeper官方文档特别强调,由于FreeBSD系统的JVM对Java的NIO Selector支持的不是很好,所以不建议在该系统上部署生产环境的Zookeeper服务器。

zookeeper使用

1,下载Zookeeper安装包。

下载地址为:http://zookeeper.apache.org/releases.html。注意用户可以选择稳定版本进行下载,下载后会得到一个文件名类似于zookeeper-x.x.x.tar.gz的文件,解压到一个目录,例如/opt/zookeeper-3.4.3/目录下,同时我们约定,在下文中使用%ZK_HOME%代表该目录。

2.配置文件zoo.cfg。

初次使用Zookeeper,需要将%ZK_HOME%/conf目录下的zoo_sample.cfg文件重命名为zoo.cfg,并且按照如下代码进行简单配置即可:

tickTime=2000

dataDir=/var/lib/zookeeper/

clientPort=2181

initLimit=5

syncLimit=2

server.1=IP1:28883888

server.2=IP2:2888:3888

server.3=IP3:2888:3888

关于Zookeeper的参数配置,将在后面做详细讲解,这里只是简单地说下

  • 在集群模式下,集群中的每台机器都需要感知到整个集群是由那几台机器组成的,在配置文件中,可以按照这样的格式进行配置,每一行都代表一个机器配置:server.id=host:port:port    其中,id被称为Server ID,用来标识该机器在集群中的机器序号。同时,在每台Zookeeper机器上,我们都需要在数据目录(即dataDir参数指定的那个目录)下创建一个myid文件,该文件只有一行内容,并且是一个数字,即对应于每台机器的Server ID数字。
  • 在ZooKeepe的设计中,集群中所有机器上zoo.cfg文件的内容都应该是一致的。因此最好使用SVN或是GIT把此文件管理起来,确保每台机器都能共享到一份相同的配置。
  • 上面提到了,myid文件中只有一个数字,即一个Server ID。例如,server.1的myid文件内容就是“1”。注意,请确保每个服务器的myid文件中的数字不同,并且和自己坐在机器的zoo.cfg中server.id=host:port:port的id值一致。另外,id的范围是1~255.

3.创建myid文件。

在dataDir所配置的目录下,创建一个名为myid的文件,在该文件的第一行写上一个数字,和zoo.cfg中当前机器的编号对应上。

4.安装相同的步骤,为其他机器配置zoo.cfg和myid文件。

5.启动ZooKeeper服务

至此,所有的选项都已经基本配置完毕,可以使用%ZK_HOME%bin目录下的zkServer.sh脚本进行服务器的启动,如下:

$sh zkServer.sh start

JMX enabled by default

Using config:/opt/zookeeper-3.4.3/bin/../conf/zoo.cfg

Starting zookeeper .... STARTED

6.验证服务器。

启动完成后,可以使用如下命令来检查服务器启动是否正常:

$telnet 127.0.0.1 2181

Trying 127.0.0.1....

Connected to localhost.localdomain(127.0.0.1).

Escape character is '^]'

stat

Zookeeper version:3.4.3-1240972,built on 12/28/2016 10:48 GMT

Clients:

/127.00.1:502557[0](queued=0,recved=1,sent=0)


latency min/avg/max:0/1/4489

Received:8444689

Sent:993100

Outstanding:0

Zxid:0x600084344

Mode:leader

Node count:37

上面就是通过Telnet方式,使用stat命令进行服务器启动的验证,如果出现和上面类似的输出信息,就说明服务器已经正常启动了。


运行服务

启动服务

常见启动Zookeeper服务的方式由两种:

java命令行:

具体方法是在Zookeeper3.4.3版本中的%ZK_HOME%目录下执行如下命令:

$java -cp zookeeper -3.4.3.jar:lib/slf4j-api-1.6.1.jar:lib/slf4j-log4j12-1.6.1.jar:lib/log4j-1.2.15.jar:conf org.apache.zookeeper.server.quorum.QuorumPeerMain conf/zoo.cfg

使用ZooKeeper自带的启动脚本来启动ZooKeeper:

在%ZK_HOME%bin目录下有几个有用的脚本。

zkCleanup:清理ZooKeeper历史数据,包括事务日志文件和快照数据文件

zkCli:ZooKeeper的一个简易客户端

zkEnv:设置ZooKeeper的环境变量

zkServer:ZooKeeper服务器的启动,停止和重启脚本


常见异常

在启动的时候,通常会碰到一些异常,下面将对这些常见的异常进行讲解。

端口被占用:

在启动ZooKeeper的时候,可能出现如下“端口被占用”的异常,导致服务器无法正常启动:

java.net.BindException:Address already in user这个异常时java程序员最熟悉的异常之一,导致这个异常的原因通常是因为2181端口被占用。通常的做法就是说检查当前机器上哪个进程正在占用这个端口,确认其端口占用的必要性,将该进程停止后,再一次启动ZooKeeper即可。也可以编辑%ZK_HOME%conf/zoo.cfg文件,更换ZooKeeper的clientPort配置,例如,可以将其设置为2080:

。。。

dataDir=/var/lib/zookeeper/

clientPort=2080

initLimit=5

......

磁盘没有剩余空间:

无论是在ZooKeeper启动还是正常运行过程中,都有可能出现如下“磁盘没有剩余空间”的异常,一旦遇到这个异常,ZooKeeper会立即执行Failover策略,从而退出进程:

java.io.IOException:No space left on device遇到这个问题,通常的做法就是清理磁盘。当然,为了避免以后再次遇到此类磁盘空间满的问题,需要加上对ZooKeeper机器的此案使用量监控和Zookeeper日的自动起立。关于ZooKeeper日志清理,我们在后面介绍。

无法找到myid文件:

ERROR[main:QuorumPeerMain@85]-Invalid config,exiting abnormally

............................

Coused by: java.lang.IllegalArgumentException:/tmp/zookeeper/myid file is missing

。。。。。。。。。。。。。。。。。。。

对于这个问题,只需在数据目录下创建好一个myid文件即可。

集群中其他机器leader选举端口未开:

在集群模式部署下服务器逐台启动的过程中,会碰到类似于下面这样的异常:

- Cannot open channel to 2 at election address /122.228.242.241.3888

这是由于在启动过程中,虽然当前机器启动了,但其他机器还没有启动完成,因此无法和其他机器在响应端口上进行连接。对于这个问题,只要快速启动集群中的其他机器即可。另外,上面的异常中表明了是3888这个端口无法创建连接,这是因为ZooKeeper默认使用3888端口进行Leader选举过程中的投票通信,关于ZooKeeper的Leader选举,后面会详细讲解。

Logo

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

更多推荐