Zookeeper(二)ZooKeeper服务器的安装与启动
Zookeeper官方文档特别强调,由于FreeBSD系统的JVM对Java的NIO Selector支持的不是很好,所以不建议在该系统上部署生产环境的Zookeeper服务器。zookeeper使用1,下载Zookeeper安装包。下载地址为:http://zookeeper.apache.org/releases.html。注意用户可以选择稳定版本进行下载,下载后会得到一个文件名类
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选举,后面会详细讲解。
更多推荐
所有评论(0)