为更好了解Zookeeper,对书本和网上资料汇总
本章首先介绍如何在不同的环境下安装并配置ZooKeeper服务、然后具体介绍如何通过ZooKeeper配置文件对ZooKeeper进行配置管理;最后介绍如何在不同环境下启动ZooKeeper服务。
安装ZooKeeper
ZooKeeper有不同的运行环境,包括,单机环境、集群环境和集群伪分布式环境。这里,我们将分别介绍不同环境下如何安装ZooKeeper服务,并简单介绍它们的区别与联系。
ZooKeeper可以在不同的系统上运行,下表是关于这方面的一个说明
软件要求
首先,安装ZooKeeper需要Java的支持,并且要求1.6以上的版本。此外,对于集群的安装,ZooKeeper需要至少三个节点,我们建议将三个节点部署到不同的机器上。例如,Yahoo!将ZooKeeper部署在Red Hat Linux机器上,每台机器使用多核CPU,2G的内存和80G的硬盘。
JDK的安装在此不做介绍。
注意:系统中,要求大多数机器处于可用状态。如果想要机器能够忍受m台机器的故障,那么整个集群至少需要2m+1台机器。因为此时剩余的m+1台才能构成系统的一个大多数集。例如,对于拥有三台机器的机群,系统能够在一台机器发生故障的情况下仍能提供服务。
另外,最好使用奇数台机器,例如,拥有四台机器的ZooKeeper只能处理一台机器的故障,如果两台机器发生故障,余下的两台机器并不能组成一个可用的ZooKeeper大多数(三台机器才能构成四台机器的大多数集);而如果ZooKeeper拥有五台机器,那么它就能处理两台机器的故障了。
单机环境下安装ZooKeeper
为了今后操作方便,我们需要对ZooKeeper的环境变量进行配置,方法如下,在/etc/profile文件中加入如下的内容:
#set ZooKeeper Enviroment
export ZOOKEEPER_HOME=$HADOOP_HOME/zookeeper-3.4.3(以3.4.3为例)
export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf
这里
$HADOOP_HOME代表Hadoop的安装目录,这是为了使用的方便,当然zookeeper-3.4.3目录可以根据需要随意放置。 需要注意的是ZooKeeper的运行并不依赖于Hadoop,也不依赖于HBase或其他与Hadoop相关的项目。
单机模式(7步)
Step1:配置JAVA环境。检验方法:执行java
–version和javac
–version命令。
Step2:下载并解压zookeeper。 从apache官网下载一个最新稳定版本:http://hadoop.apache.org/zookeeper/releases.html
Step3:重命名 zoo_sample.cfg文件 cp $HADOOP_HOME/zookeeper-3.4.3/conf/zoo_sample.cfg zoo.cfg
Step4:vi zoo.cfg,修改 dataDir=$HADOOP_HOME/zookeeper-3.4.3/data
Step5:创建数据目录:mkdir $HADOOP_HOME/zookeeper-3.4.3/data
Step6:启动zookeeper:执行 zkServer.sh start
Step7:检测是否成功启动:执行 bin/zkCli.sh 或 echo stat|nc localhost 2181
上面我们从zoo_sample.cfg得到了zoo.cfg。如果自己新建一个zoo.cfg,只需要包含如下内容:
#The number of milliseconds of each tick
tickTime=2000
#the directory where the snapshot is stored
dataDir=$HADOOP_HOME/zookeeper-3.4.3/data
#the port at which the clients will connect
clientPort=2181
tickTime:基本事件单元,以毫秒为单位。它用来指示个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tick Time 时间就会发送一个心跳,最小的session过期时间为两倍的tickTime;
dataDir:存储内存中数据库快照的位置,如果不设置参数,更新事物的日志将被存储到默认位置;
clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。使用单机模式时大家需要注意:这种配置方式下没有ZooKeeper副本,所以如果ZooKeeper服务器出现故障,ZooKeeper服务将会停止。
集群下安装ZooKeeper
为了获得可靠的ZooKeeper服务,用户应该在一个集群上部署ZooKeeper。只要集群上大多数的ZooKeeper服务启动了,那么总的ZooKeeper服务讲师可用的。
集群模式(8步)
Step1:配置JAVA环境。检验方法:执行java –version和javac –version命令。
Step2:下载并解压zookeeper。
Step3:重命名 zoo_sample.cfg文件
cp $HADOOP_HOME/zookeeper-3.4.3/conf/zoo_sample.cfg zoo.cfg
Step4:vi zoo.cfg,修改
dataDir=$HADOOP_HOME/zookeeper-3.4.3/data
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
这里要注意下server.1这个后缀,表示的是zoo1(也可以用ip表示)这个机器,在机器中的server id是1
Step5:创建数据目录:mkdir $HADOOP_HOME/zookeeper-3.4.3/data
Step6:在标识Server ID. 在$HADOOP_HOME/zookeeper-3.4.3/data目录中创建文件 myid 文件, 每个文件中分别写入当前机器的server id,例如zoo1这个机器,在$HADOOP_HOME/zookeeper-3.4.3/data目录的myid文件中写入数字1.
Step7:启动zookeeper:执行 1.$HADOOP_HOME/zookeeper-3.4.3/bin/zkServer.sh start
Step8:检测是否成功启动:执行 $HADOOP_HOME/zookeeper-3.4.3/bin/zkCli.sh 或 echo stat|nc localhost 2181
Zookeeper 的集群模式的安装和配置也不是很复杂,所要做的就是增加几个配置项。集群模式除了上面的三个配置项还要增加下面几个配置项:
#The number of milliseconds of each tick
tickTime=2000
#the directory where the snapshot is stored
dataDir=$HADOOP_HOME/zookeeper-3.4.3/data
#the port at which the clients will connect
clientPort=2181
#the number of ticks that the initial synchronization phase can take
initLimit=5
#the number of ticks that the pass between sending a request and getting an acknowledgement
syncLimit=2
server.1=192.168.211.1:2888:3888
server.2=192.168.211.2:2888:3888
initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒;
syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒;
server.id=host:port:port标识了不同ZooKeeper服务器的配置。每台服务器作为集群中的一部分应该知道集群中其他机器,用户可以从"server.id=host:port:port "中读取相关的信息。参数中host和port比较直观。id标识的是不同的服务器,在服务器的data(dataDir参数指定的目录)目录下创建一个文件名为myid的文件,这个文件中仅 含一行内容,它所指定的是自身的id值。比如,服务器"1" 应该在myid文件中写入"1"。而且这个id必须是集群中唯一的,大小在1到255之间。第一个port表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;第二个port表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
如果是伪集群的配置方式,由于host都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
在集群伪分布模式下安装ZooKeeper
了解Hadoop的知道可以在伪分布模式下模拟分布式Hadoop的运行。与它不同的是,ZooKeeper不但可以在单机上运行单机模式ZooKeeper,而且可以在单机上模拟集群模式ZooKeeper的运行,也就是将不同的节点运行在同一台机器上。我们索性将其称之为"集群伪分布模式",以区别单机模式。我们知道,伪分布模式下Hadoop的操作和分布式模式下有很大的不同,但是在集群伪分布模式下对ZooKeeper的操作却和集群模式下没本质的区别。显然,集群伪分布模式为我们体验ZooKeeper和做一些尝试性的实验提供了很大的方便。比如,我们在实验的时候,可以先使用少量数据在集群伪分布模式下进行测试。当测试可行的时候,再将其转移到集群模式下进行真实的数据实验。这样不但保证了它的可行性,同时大大提高了实验的效率。
那么,如何配置ZooKeeper的集群伪分布模式呢?其实很简单。在ZooKeeper的配置文档中,clientPort参数是用来设置客户端连接ZooKeeper的端口。在server:1=ip1:2887:3887中,IP1指示的是组成ZooKeeper服务的机器IP地址,2887为进行leader选举的端口,3887是组成ZooKeeper服务的机器之间的通信端口。在集群伪分布模式下我们使用每个配置文档模拟一台机器,也就是说,需要在单台机器上运行多个ZooKeeper实例。但是,必须要保证各个配置文档的各个端口不能冲突。
下面是我们所配置的集群伪分布模式,分别通过zoo.cfg,zoo2.cfg,zoo3.cfg来模拟有三台机器的ZooKeeper集群。
step1:copy zoo.cfg并修改如下:
zoo1.cfg如下:
#The number of milliseconds of each tick
tickTime=2000
#the directory where the snapshot is stored
dataDir=$HADOOP_HOME/zookeeper-3.4.3/data_1
#the location of the log file
dataLogDir=$HADOOP_HOME/zookeeper-3.4.3/logs_1
#the port at which the clients will connect
clientPort=2181
#the number of ticks that the initial synchronization phase can take
initLimit=5
#the number of ticks that the pass between sending a request and getting an acknowledgement
syncLimit=2
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
zoo2.cfg
#The number of milliseconds of each tick
tickTime=2000
#the directory where the snapshot is stored
dataDir=$HADOOP_HOME/zookeeper-3.4.3/data_2
#the location of the log file
dataLogDir=$HADOOP_HOME/zookeeper-3.4.3/logs_2
#the port at which the clients will connect
clientPort=2182
#the number of ticks that the initial synchronization phase can take
initLimit=5
#the number of ticks that the pass between sending a request and getting an acknowledgement
syncLimit=2
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
#The number of milliseconds of each tick
tickTime=2000
#the directory where the snapshot is stored
dataDir=$HADOOP_HOME/zookeeper-3.4.3/data_3
#the location of the log file
dataLogDir=$HADOOP_HOME/zookeeper-3.4.3/logs_3
#the port at which the clients will connect
clientPort=2183
#the number of ticks that the initial synchronization phase can take
initLimit=5
#the number of ticks that the pass between sending a request and getting an acknowledgement
syncLimit=2
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
Step2:创建数据目录:
mkdir /$HADOOP_HOME/zookeeper-3.4.3/data_1
mkdir /$HADOOP_HOME/zookeeper-3.4.3/data _2
mkdir /$HADOOP_HOME/zookeeper-3.4.3/data_3
mkdir /$HADOOP_HOME/zookeeper-3.4.3/logs_1
mkdir /$HADOOP_HOME/zookeeper-3.4.3/logs _2
mkdir /$HADOOP_HOME/zookeeper-3.4.3/logs_3
Step3:创建myid文件来指定对应的ZooKeeper服务器实例,标识Server ID
在/$HADOOP_HOME/zookeeper-3.4.3/data_1目录中创建myid 文件, myid文件中写入数字1,
在/$HADOOP_HOME/zookeeper-3.4.3/data_2目录中myid文件中写入数字2,
在/$HADOOP_HOME/zookeeper-3.4.3/data_3目录中myid文件中写入数字3
启动:
/$HADOOP_HOME/zookeeper-3.4.3/bin/ zkServer.sh start zoo1.cfg
/$HADOOP_HOME/zookeeper-3.4.3/bin/ zkServer.sh start zoo2.cfg
/$HADOOP_HOME/zookeeper-3.4.3/bin/ zkServer.sh start zoo3.cfg