zookeeper通常以“复制模式”运行于一个计算机集群上,这个计算机集群被称为一个“集合体”。zookeeper通过复制来实现高可用性,只要集合体中半数以上的机器处于可用状态,它就可以提供服务。出于这个原因,一个集合体通常包含奇数台机器。
安装过程
本文选择了在slave1,slave2和slave3三台机器上安装
将zookeeper解压到/usr/local目录下,并配置环境变量
sudo nano /etc/profile
在最下面加上2行
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.6
export PATH=$ZOOKEEPER_HOME/bin:$PATH
然后在conf中新建zoo.cfg文件,输入以下内容:
# 客户端心跳时间(毫秒)
tickTime=2000
# 允许心跳间隔的最大时间
initLimit=10
# 同步时限
syncLimit=5
# 数据存储目录
dataDir=/usr/local/zookeeper-3.4.6/data
# 数据日志存储目录
dataLogDir=/usr/local/zookeeper-3.4.6/data/log
# 端口号
clientPort=2181
# 集群节点和服务端口配置
server.1=hadoop-slave1:2888:3888
server.2=hadoop-slave2:2888:3888
server.3=hadoop-slave3:2888:3888
创建zookeeper的数据存储目录和日志存储目录
cd /usr/local/zookeeper-3.4.6
mkdir -p data/log
在data目录中创建一个文件myid,输入内容为1
echo "1" >> data/myid
修改zookeeper的日志输出路径(注意CDH版与原生版配置文件不同)
sudo nano bin/zkEnv.sh
if [ "x${ZOO_LOG_DIR}" = "x" ]
then
ZOO_LOG_DIR="$ZOOKEEPER_HOME/logs"
fi
if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
fi
修改zookeeper的日志配置文件
sudo nano conf/log4j.properties
zookeeper.root.logger=INFO,ROLLINGFILE
log4j.appender.ROLLINGFILE=org.apache.log4j.DailyRollingFileAppender
创建日志目录
sudo mkdir logs
将这个zookeeper-3.4.6的目录复制到其他的两个节点上,并修改他们的myid为2和3。
然后使用bin目录下的zkServer.sh start
分别启动三个zookeeper,按1,2,3的顺序。使用jps
命令查看,若有QuorumPeerMain则说明服务正常启动,没有的话,使用zkServer.sh start-foreground
查看一下哪里出了问题。
我在安装过程中遇到的问题
- zookeeper启动不了
使用sudo ./zkServer.sh start-foreground
运行zookeeper,显示line 131:exec java: not found
解决办法:cd /usr/local sudo chown –R hadoop-sna zookeeper-3.4.6 sudo chgrp –R hadoop-sna zookeeper-3.4.6
改一下用户权限即可(我觉得这是我掉进的一个很有意义的坑。。。)
- 打开logs文件夹里面的zookeeper.log显示connection refused错误
原因:一般来说这是配置的问题,我出现这个问题的主要原因是,我在zoo.cfg中写了三个server,但是只在server1上启动zkServer.sh所以会出现connection refused。
事实上只在一个机器上启动zookeeper时,使用zkServer.sh status
查看状态时,会看到的错误,但是这并不是说明你的zookeeper有问题,只是那两个还没启动好而已,当3台机器的zookeeper都启动后,3台机器会自动进行投票,选出一个leader两个follower,此时再用zkServer.sh status
查看状态的时候就可以看到这台机器是leader还是follower了。