目录

Zookeeper 安装

macOS 环境

1
2
brew install zookeeper
# /usr/local/etc/zookeeper
# 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=/usr/local/var/run/zookeeper/data
dataDir=/usr/local/var/run/zookeeper/logs
# the port at which the clients will connect
clientPort=2181
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
zkServer start
zkServer status
# Mode: standalone
zkServer stop

zkCli -server localhost:2181
ls /
ls /zookeeper
get /zookeeper/quota
# 建了一个新的 znode 节点“ zk ”以及与它关联的字符串
create /zk "myData"
get /zk
# 对 zk 所关联的字符串进行设置
set /zk "zsl"

create /zk/node1 "abc"
get /zk/node1
ls /zk
# 删除 znode, 注意只有 znode 为空的时候才能删除
delete /zk/node1
delete /zk
# 退出命令行
quit

传递四个字母的字符串给ZooKeeper,ZooKeeper会返回一些有用的信息。

ZooKeeper 四字命令 功能描述
conf 输出相关服务配置的详细信息。
cons 列出所有连接到服务器的客户端的完全的连接 / 会话的详细信息。包括“接受 / 发送”的包数量、会话 id 、操作延迟、最后的操作执行等等信息。
dump 列出未经处理的会话和临时节点。
envi 输出关于服务环境的详细信息(区别于 conf 命令)。
reqs 列出未经处理的请求
ruok 测试服务是否处于正确状态。如果确实如此,那么服务返回“imok ”,否则不做任何相应。
stat 输出关于性能和连接的客户端的列表。
wchs 列出服务器 watch 的详细信息。
wchc 通过 session 列出服务器 watch 的详细信息,它的输出是一个与watch 相关的会话的列表。
wchp 通过路径列出服务器 watch 的详细信息。它输出一个与 session相关的路径。
1
echo conf |nc  localhost 2181

Linux 环境

zookeeper 下载

1
2
3
4
5
cd /opt
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz
tar -zxvf zookeeper-3.4.12.tar.gz -C /opt
# 修改环境变量
vi /etc/profile
# ZooKeeper配置
export ZOOKEEPER_INSTALL=/opt/zookeeper-3.4.12
export PATH=$PATH:$ZOOKEEPER_INSTALL/bin
1
2
3
4
5
source /etc/profile
cd conf
# 创建 Zookeeper 配置文件
cp zoo_example.cfg zoo.cfg
vi zoo.cfg
tickTime=2000 #ZooKeeper服务器心跳时间,单位为ms
initLimit=10 #投票选举心leader的初始化时间
syncLimit=5 #leader与follower心跳检测最大容忍时间,响应超过syncLimit*tickTime,leader认为follower死掉,从服务器列表中删除follower
clientPort=2181 #端口
dataDir=/var/zookeeper/data #数据目录
dataLogDir=/var/zookeeper/log #日志目录
1
2
3
4
5
6
mkdir -p /var/zookeeper/log
cd /var/zookeeper
mkdir data

cd /opt/zookeeper-3.4.12/bin
./zkServer.sh start

可以使用ZooKeeper自带的客户端工具来查看ZooKeeper的节点建立情况(bin/zkCli.sh)

docker 环境

1
docker run -d --name zookeeper  -p 2181:2181 -t wurstmeister/zookeeper

集群

集群模式下,需要配置一些参数,以下是常见的一些参数。

  1. data目录 用于存放进程运行数据。
  2. data目录下的myid文件 用于存储一个数值,用来作为该ZooKeeper Server进程的标识。
  3. 监听Client端请求的端口号
  4. 监听同ZooKeeper集群内其他Server进程通信请求的端口号
  5. 监听ZooKeeper集群内“leader”选举请求的端口号 该端口号用来监听ZooKeeper集群内“leader”选举的请求。注意这个是ZooKeeper集群内“leader”的选举,跟分布式应用程序无关。
myid Data目录 Client Server Leader 配置文件
1 /z1/data 2181 2222 2223 z1.cfg
2 /z2/data 2182 3333 3334 z2.cfg
3 /z3/data 2183 4444 4445 z3.cfg
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
cd /usr/local/etc/zookeeper
cp zoo.cfg zoo1.cfg

mkdir -p /usr/local/var/run/zookeeper/data1
mkdir -p /usr/local/var/run/zookeeper/data2
mkdir -p /usr/local/var/run/zookeeper/data3

echo '1'  >  /usr/local/var/run/zookeeper/data1/myid
echo '2'  >  /usr/local/var/run/zookeeper/data2/myid
echo '3'  >  /usr/local/var/run/zookeeper/data3/myid

vim /usr/local/etc/zookeeper/zoo1.cfg
vim /usr/local/etc/zookeeper/zoo2.cfg
vim /usr/local/etc/zookeeper/zoo3.cfg
tickTime=2000  
initLimit=10  
syncLimit=5 
dataDir=/usr/local/var/run/zookeeper/data1
clientPort=2182
# server.x中的“x”表示ZooKeeper Server进程的标识  
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
1
2
cp zoo.cfg zoo2.cfg
cp zoo.cfg zoo3.cfg
tickTime=2000  
initLimit=10  
syncLimit=5 
dataDir=/usr/local/var/run/zookeeper/data2
clientPort=2183
# server.x中的“x”表示ZooKeeper Server进程的标识  
server.1=127.0.0.1:2222:2225  
server.2=127.0.0.1:3333:3335  
server.3=127.0.0.1:4444:4445 
tickTime=2000  
initLimit=10  
syncLimit=5 
dataDir=/usr/local/var/run/zookeeper/data3
clientPort=2184
# server.x中的“x”表示ZooKeeper Server进程的标识  
server.1=127.0.0.1:2222:2225  
server.2=127.0.0.1:3333:3335  
server.3=127.0.0.1:4444:4445 

initLimit: zookeeper集群中的包含多台server, 其中一台为leader, 集群中其余的server为follower. initLimit参数配置初始化连接时, follower和leader之间的最长心跳时间. 此时该参数设置为5, 说明时间限制为5倍tickTime, 即5*2000=10000ms=10s.

syncLimit: 该参数配置leader和follower之间发送消息, 请求和应答的最大时间长度. 此时该参数设置为2, 说明时间限制为2倍tickTime, 即4000ms.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
zkServer start /usr/local/etc/zookeeper/zoo1.cfg

zkServer stop /usr/local/etc/zookeeper/zoo1.cfg
zkServer stop /usr/local/etc/zookeeper/zoo2.cfg
zkServer stop /usr/local/etc/zookeeper/zoo3.cfg

zookeeper-server-start /usr/local/etc/zookeeper/zoo1.cfg

zkServer status /usr/local/etc/zookeeper/zoo1.cfg

zkCli -server localhost:2182,localhost:2083,localhost:2084
ls /

集群模式

1
2
3
4
5
6
cd /opt
https://mirror-hk.koddos.net/apache/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz
tar -zxvf zookeeper-3.4.12.tar.gz -C /opt
cp -r  apache-zookeeper-3.6.2-bin  zookeeper2
cp -r  apache-zookeeper-3.6.2-bin  zookeeper3
ln -s  apache-zookeeper-3.6.2-bin  zookeeper1
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/var/run/zookeeper1/data
dataLogDir=/usr/local/var/run/zookeeper1/logs
clientPort=2182
server.1=localhost:2888:3888
server.2=localhost:2889:3889
server.3=localhost:2890:3890
clientPort=2183
clientPort=2184

在之前设置的dataDir 中新建myid文件, 写入一个数字, 该数字表示这是第几号server. 该数字必须和zoo.cfg文件中的server.X中的X一一对应.

1
2
3
4
5
6
vim /usr/local/var/run/zookeeper1/data/myid
1
vim /usr/local/var/run/zookeeper2/data/myid
2
vim /usr/local/var/run/zookeeper3/data/myid
3
1
2
3
4
5
6
cd /opt/zookeeper1
./bin/zkServer.sh start
cd ../zookeeper2
./bin/zkServer.sh start
cd ../zookeeper3
./bin/zkServer.sh start
  • zookeeper集群中的包含多台server, 其中一台为leader, 集群中其余的server为follower.
  • initLimit参数配置初始化连接时, follower和leader之间的最长心跳时间. 此时该参数设置为5, 说明时间限制为5倍tickTime, 即5*2000=10000ms=10s.
  • syncLimit: 该参数配置leader和follower之间发送消息, 请求和应答的最大时间长度. 此时该参数设置为2, 说明时间限制为2倍tickTime, 即4000ms.
  • server.X=A:B:C 其中X是一个数字, 表示这是第几号server. A是该server所在的IP地址. B配置该server和集群中的leader交换消息所使用的端口. C配置选举leader时所使用的端口
1
2
3
4
zkCli -server localhost:2182,localhost:2083,localhost:2084
ls /

quit

滚动文件文件

1
vim conf/log2j.properties
zookeeper.root.logger=INFO,ROLLINGFILE
1
vim bin/zkEnv.sh
1
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
  • zkEnv.sh是zk启动脚本的一部分,启动脚本在启动zk前执行这个zkEnv.sh来初始化设置一些启动相关的变量;
  • 更改这个脚本中的ZOO_LOG4J_PROP和上面 log4j.properties中的配置一致
1
./bin/zkServer.sh restart

日志会在 logs 目录下 如果想改变日志文件的名字,需要修改 zkServer.sh

1
vim bin/zkServer.sh
1
2
ZOO_LOG_FILE=zookeeper-$USER-server-$HOSTNAME.log
_ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper-$USER-server-$HOSTNAME.out"

找到start时执行的脚本代码,其中有这样一段代码:

1
2
3
4
nohup "$JAVA" $ZOO_DATADIR_AUTOCREATE "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" \
    "-Dzookeeper.log.file=${ZOO_LOG_FILE}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
    -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p' \
    -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &

将其中的"-Dzookeeper.log.dir=${ZOO_LOG_DIR}""-Dzookeeper.log.file=${ZOO_LOG_FILE}" 去掉。

每日滚动日志

zookeeper.root.logger=INFO,ROLLINGFILE
log4j.appender.ROLLINGFILE=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.ROLLINGFILE.MaxFileSize=10MB
# 设置滚动日志最多为10个
#log4j.appender.ROLLINGFILE.MaxBackupIndex=10 

修改zkEnv.sh

1
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"