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
|
集群
集群模式下,需要配置一些参数,以下是常见的一些参数。
- data目录
用于存放进程运行数据。
- data目录下的myid文件
用于存储一个数值,用来作为该ZooKeeper Server进程的标识。
- 监听Client端请求的端口号
- 监听同ZooKeeper集群内其他Server进程通信请求的端口号
- 监听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
|
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
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"
|