zookeeper集群搭建 Zookeeper cluster Set Up
准备环境
- 准备4个centos7虚拟机
- 下载zookeeper安装包
- 提前安装好jdk 安装jdk
zookeeper下载地址:http://mirrors.hust.edu.cn/apache/zookeeper/
集群规划
- node1: leader或follower
- node2: leader或follower
- node3: leader或follower
- node4: observer
leader:能接收所有的读写请求,也可以处理所有的读写请求,而且整个集群中的所有写数据请求都是由leader进行处理 follower:能接收所有的读写请求,但是读数据请求自己处理,写数据请求转发给leader observer:跟follower的唯一的区别就是没有选举权和被选举权
下载安装
wget http://mirrors.hust.edu.cn/apache/zookeeper/stable/apache-zookeeper-3.5.7-bin.tar.gz
tar zxvf apache-zookeeper-3.5.7-bin.tar.gz
# 加入环境变量path中
vim ~/.bash_profile
export ZOOKEEPER_HOME=/home/hadoop/apps/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
# 保存退出,然后source使其生效
source ~/.bash_profile
配置zoo.cfg文件
# 进入ZOOKEEPER_HOME/conf目录
# 复制zoo_sample.cfg为zoo.cfg
cp zoo_sample.cfg zoo.cfg
# 编辑zoo.cfg
vi zoo.cfg
# 集群各节点的心跳时间间隔,保持默认即可(2s)
tickTime=2000
# 此配置表示,允许follower连接并同步到leader的初始化连接时间
# 它以tickTime的倍数来表示
# 当超过设置倍数的tickTime时间,则连接失败
# 保持默认即可(10次心跳的时间,即20s)
initLimit=10
# follower与leader通信,从发送请求到接收到响应的等待时间的最大值,保持默认即可,即10s
# 如果10s内没有收到响应,本次请求就失败
syncLimit=5
# zookeeper的数据存放的位置,默认是/tmp/zookeeper,一定要改,因为tmp目录会不定时清空
dataDir=/root/hadoop/zkdata
# 客户端连接的端口号,保持默认即可
clientPort=2181
# 以下内容手动添加
# server.id=主机名:心跳端口:选举端口
# 注意:这里给每个节点定义了id,这些id写到配置文件中
# id为1-255之间的任意的不重复的数字,一定要记得每个节点的id的对应关系
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
server.4=node4:2888:3888:observer
hosts配置
为每个虚拟机配置hosts,以便后续根据主机名操作 如node1配置如下
192.168.37.200 node1
192.168.37.201 node2
192.168.37.202 node3
192.168.37.203 node4
其他节点依次配置
同步配置
其他虚拟机按同样配置设置好,或者直接复制到相应机器
scp -r /home/hadoop/apps/zookeeper node2:/home/hadoop/apps/
scp -r /home/hadoop/apps/zookeeper node3:/home/hadoop/apps/
scp -r /home/hadoop/apps/zookeeper node4:/home/hadoop/apps/
在配置的dataDir目录下新建myid文件,并写入id
mkdir -p /home/hadoop/zkdata
cd /home/hadoop/zkdata
echo 1 > myid # 这里的id根据上面的配置server.1这个确定相应节点的id
启动集群
每个节点都需要操作
zkServer.sh start
查看每个节点状态
zkServer.sh status
至此,zookeeper集群安装配置成功
修改zookeeper日志文件的保存路径
修改$ZOOKEEPER/bin/zkEnv.sh文件
# 在这里定义存放日志文件的目录
ZOO_LOG_DIR="/opt/beh/logs/zookeeper"
if [ "x${ZOO_LOG_DIR}" = "x" ]
then
ZOO_LOG_DIR="."
fi
# 将
if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
ZOO_LOG4J_PROP="INFO,CONSOLE"
fi
# 改为:
if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
fi
修改$ZOOKEEPER_HOME/conf/log4j.properties文件
zookeeper.root.logger=INFO, ROLLINGFILE
zookeeper.console.threshold=INFO
zookeeper.log.dir=/opt/beh/logs/zookeeper
zookeeper.log.file=zookeeper.log
zookeeper.log.threshold=DEBUG
zookeeper.tracelog.dir=/opt/beh/logs/zookeeper
zookeeper.tracelog.file=zookeeper_trace.log
log4j.appender.ROLLINGFILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold}
log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}
log4j.appender.ROLLINGFILE.MaxFileSize=512MB
log4j.appender.ROLLINGFILE.DataPattern='.'yyyy-MM-dd
log4j.appender.ROLLINGFILE.Threshold=info
log4j.appender.ROLLINGFILE.encoding=UTF-8
log4j.appender.ROLLINGFILE.layout.ConversionPattern=[%d{yyyy-MM-dd HH\:mm\:ss}]%-5p %c(line\:%L) %x-%m%n
#log4j.appender.ROLLINGFILE.MaxBackupIndex=10
log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout
修改$ZOOKEEPER_HOME/bin/zkServer.sh文件
_ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper.out"
修改为:
_ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper.log"