前情提要

首先搭建 Zookeeper 是在 Linux 上进行搭建的,并且我这里介绍的是基于我之前搭建好了的 Hadoop 集群,继续搭建的 Zookeeper 集群。也就是说您需要有 Hadoop 集群的基础才能和我的对应。

也不过多赘述关于 IP,JDK 等的基础环境问题了。

我的 hadoop 集群:

1 号服务器 2 号服务器 3 号服务器
name hadoop103 hadoop103 hadoop103
IP 192.168.64.103 192.168.64.104 192.168.64.105
HDFS NameNode、DataNode DataNode SecondaryNameNode、DataNode
YARN NodeManager ResourceManager、NodeManager NodeManager

如果您和我不一样,您大概要知道,我的 hadoop103 对应的是您的哪个节点…

下载 Zookeeper

需要安装什么版本的 Zookeeper?

版本描述

根据官网描述,我们下载版本越新越好。

您已经有了 hadoop 的下载基础了,在 Ubuntu 里直接下载或是你主机浏览器中下载好再传到虚拟机你应该都了解了,不过多赘述。

官网地址https://zookeeper.apache.org/

地址页面

可以自己选择对应版本下载,我下载的是 3.7.1 版本(我访问网站时的最新稳当版本),下载地址(可直达):https://archive.apache.org/dist/zookeeper/zookeeper-3.7.1/

如图:

下载界面

点击 apache-zookeeper-3.7.1-bin.tar.gz 。点击即可下载。

下载完成后,移动到/usr/local目录下,过程于 hadoop 压缩包移动类似。

Zookeeper 安装

这里只在 hadoop103 搭建就好了,zookeeper 安装包可以用集群分发脚本发到两台从机上。

安装前准备

  1. JDK(估计你安装好了,如果没有安装好,请参看:搭建Hadoop环境

  2. 下载 Zookeeper 安装包,弄到/usr/local目录下

  3. 解压安装包

    • 如果是 .tar.gz 后缀,则输入命令:

      1
      tar -zxf apache-zookeeper-3.7.1-bin.tar.gz -C /usr/local/
    • 如果是 .tar 后缀,则输入命令:

      1
      tar -xf apache-zookeeper-3.7.1-bin.tar -C /usr/local/
  4. 修改安装包名称

    1
    mv apache-zookeeper-3.7.1-bin zookeeper
  5. 配置 zookeeper 家目录

    这不需要,我只是为了方便:

    1
    vim ~/.bashrc

    输入 i 进入编辑模式,在上面添加:

    1
    export ZOOKEEPER_HOME=/usr/local/zookeeper

    刷新资源:

    1
    source ~/.bashrc

    这样之后就可以cd $ZOOKEEPER_HOME就跳转到/usr/local/zookeeper。不用担心长,输入$ZOOK直接按 Tab 键就能补全,这个是 Linux 的代码补全,只要没有重复的配置,你输入$Z都能按 Tab 补全了。

    并且以后如果 zookeeper 目录位置改变了,只需要改变环境变量文件中的这一处,不用到处改变。

准备工作完成的效果:

完成的效果

配置修改

  1. $ZOOKEEPER_HOME/conf目录下的zoo_sample.cfg修改为zoo.cfg

    1
    mv $ZOOKEEPER_HOME/conf/zoo_sample.cfg  $ZOOKEEPER_HOME/conf/zoo.cfg
  2. 打开 zoo.cfg 并求改 dataDir 的路径:

    1
    vim $ZOOKEEPER_HOME/conf/zoo.cfg # 打开

    按 i 编辑,修改如下内容:

    将原本的dataDir=/tmp/zookeeper,修改为:dataDir=/usr/local/zookeeper/zkData

    其他 zoo.cfg 的配置参数如果后续也没有提到,您有需要请自行配置。

  3. 创建 zkData 目录

    1
    mkdir $ZOOKEEPER_HOME/zkData

到这里其实就配置好了单机了。

操作 Zookeeper

这里也算是在做测试:

如果你在 zookeeper 根目录下,就可以不输入$ZOOKEEPER_HOME

  1. 启动 Zookeeper

    1
    $ZOOKEEPER_HOME/bin/zkServer.sh start
  2. 查看是否启动

    1
    jps

    查看是否启动

  3. 查看状态

    1
    $ZOOKEEPER_HOME/bin/zkServer.sh status

    查看状态

  4. 启动客户端

    1
    $ZOOKEEPER_HOME/bin/zkCli.sh
  5. 退出客户端

    1
    quit
  6. 停止(关闭)Zookeeper

    1
    $ZOOKEEPER_HOME/bin/zkServer.sh stop

集群安装

集群规划

三个节点:

hadoop103、hadoop104、hadoop105

这里不区分主机和从机,也不特别区分分工。

配置服务器编号

还是在 hadoop103 上操作:

$ZOOKEEPER_HOME/zkData目录下创建一个myid文件(注意,源码中只读取这个文件,除非你去改源码,否则只能是这个文件名)

1
touch $ZOOKEEPER_HOME/zkData/myid

编辑文件:

1
vim $ZOOKEEPER_HOME/zkData/myid

写入一个数字就行了,故名思义,myid 就是说我这个节点的编号,未来方便记,我这个 hadoop103,就写的 3;后面 hadoop104 的这里写 4;hadoop105 的这里写 5。等脚本分发过去之后再改。

配置 zoo.cfg 文件

打开文件:

1
vim $ZOOKEEPER_HOME/conf/zoo.cfg

新增配置(在文件最下面):

1
2
3
4
####################### cluster ##########################
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
server.5=hadoop105:2888:3888

解释一下:

1
server.A=B:C:D
  • A 是一个数字,表示这个是第几号服务器;对应集群模式下配置的一个文件 myid 里的内容,这个文件在 dataDir 目录下,这个文件里面有一个数据就是 A 的值,Zookeeper 启动时读取此文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是哪个 server。
  • B 是这个服务器的地址;也就是该服务器的 hostname 或 IP 地址。
  • C 是这个服务器 Follower 与集群中的 Leader 服务器交换信息的端口;
  • D 是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

    3.5.0 以上的 zookeeper 提供了一个内嵌的 Jetty 容器来运行 AdminServer,默认占用的是 8080 端口,AdminServer 主要是来查看 Zookeeper 的一些状态,如果机器上有其他程序(比如:Tomcat)占用了 8080 端口,会出现冲突,所以我添加你配置项:

1
2
# admin port
admin.serverPort=8081

把端口改到了 8081。

分发 zookeeper

如果您还没有编写集群分发脚本,请参看:集群分发脚本

1
xsync $ZOOKEEPER_HOME

然后分别去修改 hadoop104 和 hadoop105 的 myid 文件,和上面的修改方式一样,不赘述了。

值得一提的是,集群分发脚本是同步,如果未来 zoo.cfg 改变了,可不能再分发 $ZOOKEEPER_HOME了,应该单独分发zoo.cfg否则又得重新配置 myid 文件(因为分发之后 myid 的内容同步了)。

如果这一步报错,提到了:Permission denied那就是权限不够,不能在 hadoop104 和 hadoop105 上的/usr/local目录下创建文件夹 zookeeper。解决办法:先在两台服务器上创建好 zookeeper 文件夹,并修改拥有者。

注意,前面配置 Zookeeper 的家目录了的,注意后面两台也要配置。这里不建议xsync ~/.bashrc因为 hadoop103 上可能有些 Hadoop103 特有的配置。所以就另外两台单独加上配置就好了。安装前准备的第 5 点。

操作 Zookeeper 集群

也算是检查后集群搭建是否成功。

分别启动 zookeeper 和查看状态

这里暂时没法一台控制三台一起启动,所以进入每台服务器都要执行一下这个命令:

1
$ZOOKEEPER_HOME/bin/zkServer.sh start

三台都启动了之后再分别查看状态:

1
$ZOOKEEPER_HOME/bin/zkServer.sh status

状态

可以看到 hadoop104 的 Mode 是 leader,其他两个(hadoop103 和 hadoop105)是 follower。这种就是对的,即一 leader 多 follower。

如果启动过程报错了,请参看:搭建Zookeeper集群常见问题

Zookeeper 集群启停脚本

上面启动 zookeeper 服务,很麻烦,还要专门到几个服务器来启动。下面编写 zookeeper 集群启停脚本,和 Hadoop 的类似:

1
vim zk

其实直接 vim,如果没有的文件会自动创建。

编写内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash

case $1 in
"start"){
for i in hadoop103 hadoop104 hadoop105
do
echo ---------- zookeeper $i 启动 ------------
ssh $i "$ZOOKEEPER_HOME/bin/zkServer.sh start"
done
};;
"stop"){
for i in hadoop103 hadoop104 hadoop105
do
echo ---------- zookeeper $i 停止 ------------
ssh $i "$ZOOKEEPER_HOME/bin/zkServer.sh stop"
done
};;
"status"){
for i in hadoop103 hadoop104 hadoop105
do
echo ---------- zookeeper $i 状态 ------------
ssh $i "$ZOOKEEPER_HOME/bin/zkServer.sh status"
done
};;
esac

增加脚本执行权限:

1
chmod +x zk

使用:

  1. 启动集群:

    1
    zk start
  2. 查看集群状态:

    1
    zk status
  3. 关闭集群:

    1
    zk stop