前言
- 集群主机:hadoop101、hadoop102、hadoop103
- 操作系统:CentOS 7
- Zookeeper版本:3.4.14
- JDK版本:1.8.0_221
- 所有配置操作都必须在同一用户下
1. 下载Zookeeper
在Zookeeper官网提供的镜像网站上下载合适版本,本次下载的版本是3.4.14
2. 安装Zookeeper
直接使用普通用户将压缩包解压到目标路径下即可,本次解压路径为/opt/module/
,具体命令如下:
[tomandersen@hadoop101 software]$ tar -xzvf zookeeper-3.4.14.tar.gz -C /opt/module/
注意:本次实验中此路径已经使用root用户将所有权给了用户tomandersen,默认是root用户才能访问,如果要使用相同路径,记得先排查确保文件所属用户,避免后续因为权限而出现混乱。为了避免麻烦,建议使用自定义路径
3. 配置conf/zoo.cfg
1)将conf
文件夹下的zoo_sample.cfg
文件更名为zoo.cfg
:
[tomandersen@hadoop101 software]$ mv zoo_sample.cfg zoo.cfg
2)然后编辑zoo.cfg
,修改其中参数,具体参数可参考如下:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/module/zookeeper-3.4.14/zkData
dataLogDir=/opt/module/zookeeper-3.4.14/logs/transaction
clientPort=2181
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
# The zookeeper cluster setting
server.1=hadoop101:2888:3888
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
其中需要特别说明的参数:
- dataLogDir:在默认的配置中并没有此参数的相关描述,但在官方文档中描述到,此参数用于设置 事务日志(transaction log) 存放路径,将
dataLogDir
和dataDir
设置于不同存储设备对于Zookeeper的吞吐率有较大影响。所以这里即便是没有设置多余的设备用于存储日志,也建议将其分开存储 - autopurge.snapRetainCount和autopurge.purgeInterval:这两个参数配合起来就是在每间隔1个小时清洗一次快照snapshot和对应的事务日志transaction log,只保存最新的三个版本的快照和其对应的事务日志
- server.<myid>=<host>:2888:3888:此参数专门用于设置Zookeeper集群,其中
<myid>
指的是zookeeper服务器ID,主要通过dataDir
路径下的myid
文件来确定,此文件需要自己手动创建,文件中内容只能有对应服务器ID,不能有任何多余内容。<host>
则指的是zookeeper服务器主机ip,由于此前已经在/etc/hosts
中设置了映射,所有此处直接使用设置的主机名hadoop101 hadoop102 hadoop103
,其中2888
和3888
分别指的是zookeeper集群仲裁模式(完全分布式)下Leader
和Follower
通信端口,以及zookeeper集群选取Leader时各个服务器之间的通信端口
4. 设置myid
官方文档原文:
- You attribute the server id to each machine by creating a file named myid, one for each server, which resides in that server’s data directory, as specified by the configuration file parameter dataDir.
- The myid file consists of a single line containing only the text of that machine’s id. So myid of server 1 would contain the text “1” and nothing else. The id must be unique within the ensemble and should have a value between 1 and 255. IMPORTANT: if you enable extended features such as TTL Nodes (see below) the id must be between 1 and 254 due to internal limitations.
总而言之:
- 文件
myid
必须在dataDir
路径下,其中内容只能是单个整数,且myid
的值必须与zoo.cfg
中的配置相对应,myid
的值必须在1~255之间,且唯一
1)在dataDir路径下创建myid:
[tomandersen@hadoop101 zookeeper-3.4.14]$ echo 1 > zkData/myid
2)将zookeeper文件夹分发给集群主机:
[tomandersen@hadoop101 module]$ scp -r zookeeper-3.4.14/ hadoop102:/opt/module/
[tomandersen@hadoop101 module]$ scp -r zookeeper-3.4.14/ hadoop103:/opt/module/
这里可以写个分发脚本,因为本次实验集群数量较少,所以直接手敲了
3)分别设置集群各个主机的myid:
这里就不再赘述了,设置方式和规则与前述相同
5. 配置群起脚本
1)Zookeeper中没有设置群起脚本,需要自行编写。本次使用ssh工具来实现远程调用zkServer脚本启动Zookeeper集群。具体可参考如下:
1 #!/bin/bash
2 # 此脚本用于启动zookeeper集群,使用方式和zkServer.sh相同
3
4 # 判断输入参数个数
5 if (($# != 1)); then
6 echo "Wrong parameters!"
7 exit 1
8 fi
9 # 获取当前用户
10 user=$(whoami)
11 # 集群的ip地址
12 cluster="hadoop101 hadoop102 hadoop103"
13
14 # 根据输入参数调用对应功能
15 case $1 in
16 "start")
17 for host in $cluster; do
18 ssh $user@$host "source /etc/profile;$ZOOKEEPER_HOME/bin/zkServer.sh start"
19 done
20 ;;
21 "status")
22 for host in $cluster; do
23 ssh $user@$host "source /etc/profile;$ZOOKEEPER_HOME/bin/zkServer.sh status"
24 done
25 ;;
26 "stop")
27 for host in $cluster; do
28 ssh $user@$host "source /etc/profile;$ZOOKEEPER_HOME/bin/zkServer.sh stop"
29 done
30 ;;
31 *)
32 echo "Worong parameter!"
33 exit 1
34 ;;
35 esac
注意:其中环境变量$ZOOKEEPER_HOME
已经在/etc/profile
中配置为zookeeper对应安装路径
2)运行群起脚本,测试集群是否正常运行
- 启动集群
[tomandersen@hadoop101 bin]$ zkCluster-server.sh start
- 查看集群状态
[tomandersen@hadoop101 bin]$ zkCluster-server.sh status
- 关闭集群
[tomandersen@hadoop101 bin]$ zkCluster-server.sh stop
如果启动失败,可以查看启动脚本的当前路径下的zookeeper.out文件,其中记录有错误原因。此文件为Zookeeper的运行日志。相关zookeeper日志介绍可以参考:Zookeeper中日志文件种类