本节讲解ZooKeeper三种模式的安装,分别为单机模式、伪分布模式和集群模式。
单机模式是指只部署一个ZooKeeper进程,客户端直接与该ZooKeeper进程进行通信。在单机模式下配置和安装ZooKeeper相对来说比较简单且易于理解。在开发测试环境下,如果没有较多的物理资源,可以使用单机模式。但是在生产环境下不可用单机模式,因为无论是系统可靠性还是读写性能,单机模式都不能满足生产的需求。
从Apache官网下载ZooKeeper的稳定版本,下载网址为:https://zookeeper.apache.org/releases.html。本书使用的是zookeeper-3.6.3版本。
ZooKeeper需要在Java环境上运行,并且是Java 6以上版本(建议使用Java 8),Java环境的安装此处不再赘述。
将下载的ZooKeeper安装文件apache-zookeeper-3.6.3-bin.tar.gz上传到操作系统的目录/opt/softwares/中,并进入该目录,将其解压到目录/opt/modules/,解压命令如下:
$ tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz –C /opt/modules/
为了以后的操作方便,可以对ZooKeeper的环境变量进行配置,在/etc/profile文件中加入以下内容:
export ZOOKEEPER_HOME=/opt/modules/apache-zookeeper-3.6.3-bin export PATH=$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf:$PATH
加入后执行source /etc/profile命令对环境变量文件进行刷新操作,使修改生效。
安装ZooKeeper服务还需要创建一个配置文件,在ZooKeeper安装目录下的conf文件夹中创建zoo.cfg文件,并向文件中添加以下内容:
tickTime=2000 dataDir=/opt/modules/apache-zookeeper-3.6.3-bin/data clientPort=2181
上述配置属性解析如下:
·tickTime:基本事件单元,用于指示一个心跳的时长,以毫秒为单位,默认是2000。
·dataDir:ZooKeeper数据文件的存储位置。
·clientPort:ZooKeeper供客户端连接的端口,默认是2181。
配置好后,执行以下命令,启动ZooKeeper服务:
$ zkServer.sh start
启动后如果要检查ZooKeeper服务是否已经启动,可以通过执行以下命令查看是否有2181端口号在监听服务:
$ netstat -at|grep 2181
ZooKeeper服务启动后就可以启动客户端进行连接了,命令如下:
$ zkCli.sh -server localhost:2181
所谓伪分布模式,就是在单台计算机上运行多个ZooKeeper实例,并组成一个集群。本节以启动三个ZooKeeper进程为例进行讲解。
将ZooKeeper安装文件解压到相应目录下,并配置环境变量,步骤参考单机模式。
在安装目录的conf文件夹下分别新建三个配置文件:zoo1.cfg、zoo2.cfg、zoo3.cfg。
zoo1.cfg内容如下:
initLimit=10 syncLimit=5 dataDir=/opt/modules/apache-zookeeper-3.6.3-bin/1.data dataLogDir=/opt/modules/apache-zookeeper-3.6.3-bin/1.logs clientPort=2181 server.1=192.168.170.133:20881:30881 server.2=192.168.170.133:20882:30882 server.3=192.168.170.133:20883:30883
zoo2.cfg内容如下:
initLimit=10 syncLimit=5 dataDir=/opt/modules/apache-zookeeper-3.6.3-bin/2.data dataLogDir=/opt/modules/apache-zookeeper-3.6.3-bin/2.logs clientPort=2182 server.1=192.168.170.133:20881:30881 server.2=192.168.170.133:20882:30882 server.3=192.168.170.133:20883:30883
zoo3.cfg内容如下:
initLimit=10 syncLimit=5 dataDir=/opt/modules/apache-zookeeper-3.6.3-bin/3.data dataLogDir=/opt/modules/apache-zookeeper-3.6.3-bin/3.logs clientPort=2183 server.1=192.168.170.133:20881:30881 server.2=192.168.170.133:20882:30882 server.3=192.168.170.133:20883:30883
上述配置属性解析可参考本章6.2.3节。
在ZooKeeper安装目录下分别建立1.data、2.data、3.data数据目录和1.logs、2.logs、3.logs日志目录,并分别在每个数据目录下新建myid文件,对1.data目录下的myid文件写入数字1,对2.data目录下的myid文件写入数字2,对3.data目录下的myid文件写入数字3。
分别执行以下命令启动ZooKeeper服务:
$ zkServer.sh start /opt/modules/apache-zookeeper-3.6.3-bin/conf/zoo1.cfg $ zkServer.sh start /opt/modules/apache-zookeeper-3.6.3-bin/conf/zoo2.cfg $ zkServer.sh start /opt/modules/apache-zookeeper-3.6.3-bin/conf/zoo3.cfg
分别执行以下命令查看服务状态:
$ zkServer.sh status /opt/modules/apache-zookeeper-3.6.3-bin/conf/zoo1.cfg $ zkServer.sh status /opt/modules/apache-zookeeper-3.6.3-bin/conf/zoo2.cfg $ zkServer.sh status /opt/modules/apache-zookeeper-3.6.3-bin/conf/zoo3.cfg
由于在ZooKeeper集群中,会有一个Leader服务器负责管理和协调其他集群服务器,因此服务器的数量通常都是单数,例如3、5、7等,这样数量为2n+1的服务器就可以允许最多n台服务器的失效。
本例仍然使用三个节点(centos01、centos02、centos03)搭建部署ZooKeeper集群,搭建步骤如下:
在centos01节点中,上传ZooKeeper安装文件apache-zookeeper-3.6.3-bin.tar.gz到目录/opt/softwares/中,并进入该目录,将其解压到目录/opt/modules/,解压命令如下:
$ tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz -C /opt/modules/
(1)在ZooKeeper安装目录下新建文件夹dataDir,用于存放ZooKeeper相关数据。
$ mkdir dataDir
(2)在ZooKeeper安装目录下的conf文件夹中新建配置文件zoo.cfg,加入以下内容:
tickTime=2000 initLimit=5 syncLimit=2 dataDir=/opt/modules/apache-zookeeper-3.6.3-bin/dataDir clientPort=2181 server.1=centos01:2888:3888 server.2=centos02:2888:3888 server.3=centos03:2888:3888
上述配置属性解析如下。
·initLimit:集群中的Follower服务器初始化连接Leader服务器时能等待的最大心跳数(连接超时时长)。默认为10,即如果经过10个心跳之后Follower服务器仍然没有收到Leader服务器的返回信息,则连接失败。本例中该参数值为5,参数tickTime为2000(毫秒),则连接超时时长为5×2000=10秒(即tickTime×initLimit=10秒)。
·syncLimit:集群中的Follower服务器与Leader服务器之间发送消息以及请求/应答时所能等待的最多心跳数。本例中,最多心跳时长为2×2000=4秒。
·server.id=host:port1:port2:标识不同的ZooKeeper服务器。ZooKeeper可以从“server.id=host:port1:port2”中读取相关信息。其中,id值必须在整个集群中是唯一的,且大小在1~255;host是服务器的名称或IP地址;第一个端口(port1)是Leader端口,即该服务器作为Leader时供Follower连接的端口;第二个端口(port2)是选举端口,即选举Leader服务器时供其他Follower连接的端口。
·dataDir:ZooKeeper存储数据的目录。
·clientPort:客户端连接ZooKeeper服务器的端口。ZooKeeper会监听这个端口,接收客户端的请求。
(3)在配置文件zoo.cfg中的参数dataDir指定的目录下(此处为ZooKeeper安装目录下的dataDir文件夹)新建一个名为myid的文件,这个文件仅包含一行内容,即当前服务器的id值,它与参数server.id中的id值相同。本例中,当前服务器(centos01)的id值为1,则应该在myid文件中写入数字1。ZooKeeper启动时会读取该文件,将其中的数据与zoo.cfg里写入的配置信息进行对比,从而获取当前服务器的身份信息。
centos01节点安装完成后,需要复制整个ZooKeeper安装目录到centos02和centos03节点,命令如下:
$ scp -r /opt/modules/apache-zookeeper-3.6.3-bin/ hadoop@centos02:/opt/modules/ $ scp -r /opt/modules/apache-zookeeper-3.6.3-bin/ hadoop@centos03:/opt/modules/
复制完成后,需要将centos02和centos03节点中的myid文件的值修改为对应的数字,即作出以下操作:
(1)修改centos02节点中的opt/modules/apache-zookeeper-3.6.3-bin/dataDir/myid文件中的值为2。
(2)修改centos03节点中的opt/modules/apache-zookeeper-3.6.3-bin/dataDir/myid文件中的值为3。
分别进入每个节点的ZooKeeper安装目录,执行以下命令启动各个节点的ZooKeeper:
$ bin/zkServer.sh start
启动时输出以下信息代表启动成功:
ZooKeeper JMX enabled by default Using config: /usr/local/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg Starting zookeeper ... STARTED
ZooKeeper集群的启动与Hadoop不同,其需要在每台装有ZooKeeper的服务器上都执行一次启动命令,这样才能使得整个集群启动起来。
分别在各个节点上执行以下命令,查看ZooKeeper服务的状态:
$ bin/zkServer.sh status
在centos01节点上查看服务状态,输出了以下信息:
ZooKeeper JMX enabled by default Using config: /usr/local/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg Mode: follower
在centos02服务器上查看服务状态,输出了以下信息:
ZooKeeper JMX enabled by default Using config: /usr/local/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg Mode: follower
在centos03服务器上查看服务状态,输出了以下信息:
ZooKeeper JMX enabled by default Using config: /usr/local/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg Mode: leader
由此可见,本例中centos03服务器上的ZooKeeper服务为Leader,其余两个ZooKeeper服务为Follower。
如果在查看启动状态时输出以下信息,说明ZooKeeper集群启动不成功,出现错误:
Error contacting service. It is probably not running.
此时需要修改ZooKeeper安装目录下的bin/zkEvn.sh文件中的以下内容:
if [ "x${ZOO_LOG4J_PROP}" = "x" ] then ZOO_LOG4J_PROP="INFO,CONSOLE" fi
将上述内容中的CONSOLE修改为ROLLINGFILE,使其将错误信息输出到日志文件,修改后的内容如下:
if [ "x${ZOO_LOG4J_PROP}" = "x" ] then ZOO_LOG4J_PROP="INFO,ROLLINGFILE" fi
修改完成后重新启动ZooKeeper集群,查看在ZooKeeper安装目录下生成的日志文件zookeeper.log,发现出现以下错误:
java.net.NoRouteToHostException: 没有到主机的路由。
产生上述错误的原因是,系统没有关闭防火墙,导致ZooKeeper集群间连接不成功。因此需要关闭系统防火墙(为了防止出错,在最初的集群环境配置时可以直接将防火墙关闭),CentOS 7关闭防火墙的命令如下:
systemctl stop firewalld.service systemctl disable firewalld.service
关闭各节点的防火墙后,重新启动ZooKeeper,再一次查看启动状态,发现一切正常了。
在centos01节点上(其他节点也可以),进入ZooKeeper安装目录,执行以下命令,连接ZooKeeper服务器,连接成功后可以输入ZooKeeper的Shell命令进行操作与测试:
$ bin/zkCli.sh -server centos01:2181