ZooKeeper是一个开源的分布式应用协调服务,用于在分布式应用各个节点之间进行协调,并通过稳健的同步技术维护共享数据。Zookeeper集群中节点个数一般为奇数个(>=3,本文搭建的 Zookeeper集群节点个数(奇数)为3个),这样做的好处是:若Zookeeper集群中的 Master 节点挂掉,只要剩余节点的个数在半数以上,就可以推举新的Master节点,继续对外提供服务。

部署ZooKeeper搭建Hadoop高可用完全分布式集群 hadoop中zookeeper_zookeeper

                           zookeeper 与Hadoop HA

ZooKeeper的安装与配置

1 环境准备

ip

主机名

用户

192.168.5.101

l1

hadoop/.root

192.168.5.102

l2

hadoop/.root

192.168.5.103

l3

hadoop/.root

ZooKeeper官网地址:http://zookeeper.apache.org/

ZooKeeper 下载地址(CDH版)http://archive.cloudera.com/cdh5/cdh/5/zookeeper-3.4.5-cdh5.15.1.tar.gz

zooKeeper服务器是用Java创建的,它在JVM上运行,所以,在安装ZooKeeper之前需要先安装JDK。JDK 的安装参见 

2 安装ZooKeeper

将 ZooKeeper 安装到 /hadoop/zookeeper-3.4.5目录下

[hadoop@l1 zookeeper-3.4.5]$ pwd  #安装包上传到此路径下
/hadoop/zookeeper-3.4.5
[hadoop@l1 zookeeper-3.4.5]$ vim /etc/profile   #配置Path
# set zookeeper
export ZOOKEEPER_HOME=/hadoop/zookeeper-3.4.5
PATH=$PATH:$ZOOKEEPER_HOME/bin

3 配置ZooKeeper

 3.1配置zoo.cfg

将在3个节点服务器的$ZOOKEEPER_HOME/conf目录下的zoo_sample.cfg文件改名为zoo.cfg,并修改其配置:

# 切换到Zookeeper的操作用户
[root@l1 zookeeper-3.4.5]# su hadoop
# 切换到Zookeeper的/conf目录
[hadoop@hadoop34 zookeeper-3.4.12]$ cd $ZOOKEEPER_HOME/conf
[root@l1 zookeeper-3.4.5]$ ls
configuration.xsl  log4j.properties  zoo_sample.cfg
# 将zoo_sample.cfg重命名为zoo.cfg
[root@l1 zookeeper-3.4.5]$ mv zoo_sample.cfg zoo.cfg
# 提前创建好Zookeeper的快照及日志存放目录
[root@l1 zookeeper-3.4.5]$ mkdir -p /hadoop/zookeeper-3.4.12/data
# 编辑zoo.cfg配置文件
[hadoop@hadoop34 conf]$ vim zoo.cfg
# 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=/hadoop/zookeeper-3.4.5/data
# the port at which the clients will connect
clientPort=2181
# 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
server.1=l1:2888:3888
server.2=l2:2888:3888
server.3=l3:2888:3888

上述配置中各个参数的含义见下表:

参数名    说明
tickTime    默认值:3000(ms),不支持系统属性方式配置。用于配置zookeeper集群中节点之间维持心跳的时间间隔,同时,它也是zookeeper中最小的时间长度单元,很多运行时的时间间隔都是使用它的倍数来表示的。
initLimit    Zookeeper集群中的Leader 节点接收其他Follower节点初始化连接等待的最大时间(10*tickTime),如果Leader 节点在这段时间内还未接收到Follower节点的返回信息,则连接失败。
syncLimit    Zookeeper集群中的Leader 节点和其他Follower节点通信的最大等待时间(5*tickTime)。
dataDir    无默认值,必须配置。服务器存储快照文件目录。默认情况下,如果没有配置dataLogDir,那么事务日志也会存储在这个目录中。建议将事务日志目录独立配置。
clientPort    无默认值,必须配置,不支持系统属性方式配置。当前服务器对外提供服务端口,客户通过此端口与服务器建立连接,一般设置为2181。集群中不需要统一端口,可任意配置端口。
server.A=B:C:D    A:节点在集群中的唯一ID,需要与dataDir/myid文件中的内容保持一致,取值范围为1~255。
B:节点的服务器IP地址。
C:集群中Follower节点与Leader 节点之间通信的端口。
D:当集群中的Follower节点宕机或出现故障时,集群进行重新选举Leader时所使用的端口。

如果不想在3个节点上重复修改zoo.cfg配置文件,可以使用如下命令将修改好的配置文件直接远程拷贝到集群的其他节点上。

[hadoop@l1 zookeeper-3.4.5]$ scp /hadoop/zookeeper-3.4.5/conf/zoo.cfg hadoop@l2://hadoop/zookeeper-3.4.5/conf/zoo.cfg 
[hadoop@l1 zookeeper-3.4.5]$ scp /hadoop/zookeeper-3.4.5/conf/zoo.cfg hadoop@l3://hadoop/zookeeper-3.4.5/conf/zoo.cfg

3.2 创建myid

分别在3个节点服务器的dataDir目录下各创建一个名称为myid的文件,其内容即为节点的ID值。

# 与zoo.cfg文件里面的server.1保持一致
[hadoop@l1 conf]$ echo "1" > /hadoop/zookeeper-3.4.5/data/myid
# 与zoo.cfg文件里面的server.1保持一致
[hadoop@l2 conf]$ echo "2" > /hadoop/zookeeper-3.4.5/data/myid
# 与zoo.cfg文件里面的server.2保持一致
[hadoop@l3 conf]$ echo "3" > /hadoop/zookeeper-3.4.5/data/myid

4启动并测试ZooKeeper

 挨个启动所有的ZooKeeper节点,使用如下命令:

[hadoop@l1 zookeeper-3.4.5]$ $ZOOKEEPER_HOME/bin/zkServer.sh start
JMX enabled by default
Using config: /hadoop/zookeeper-3.4.5/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

 

然后,在各个节点输入jps命令,会出现如下进程:


QuorumPeerMain


3个节点全部启动完成之后,查看各个节点的运行状态:

# l1
[hadoop@l1 conf]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /hadoop/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: follower
# l2
[hadoop@l2 conf]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /hadoop/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: leader
# l3
[hadoop@l3 conf]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /hadoop/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: follower

此时,l2 这台服务器为Leader节点,我们停止掉它上面运行的ZooKeeper服务来模拟Leader节点宕机的情况。

[hadoop@l2 conf]$ zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /hadoop/zookeeper-3.4.5/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED

再次查看剩余两个节点的运行状态:

# l1
[hadoop@l1 conf]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /hadoop/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: leader

# l3
[hadoop@l3 conf]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /hadoop/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: follower

l1这台服务器被选举为了ZooKeeper集群新的Leader节点,至此,Zookeeper集群搭建并测试完成。