第一種:獨立模式
[root@distr01 conf]# cp zoo_sample.cfg zoo.cfg
[root@distr01 conf]# vim zoo.cfg
# 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=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=
解釋:
tickTime:Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳,單位毫秒
initLimit:Zookeeper的Leader 接受客戶端(Follower)初始化連接時最長能忍受多少個心跳時間間隔數。當已經超過 5個心跳的時間(也就是tickTime)長度后 Zookeeper 服務器還沒有收到客戶端的返回信息,那么表明這個客戶端連接失敗。總的時間長度就是 5*2000=10 秒
syncLimit:表示 Leader 與 Follower 之間發送消息時請求和應答時間長度,最長不能超過多少個tickTime 的時間長度,總的時間長度就是 2*2000=4 秒。
clientport: 客戶端連接端口(server提供給客戶端連接的)
dataDir: 數據目錄
dataLogDir: 日志目錄
第二種:集群模式
除了以上參數外,還需要額外增加如下:
server.n=host:port1:port
數字n必須是myid中的值
port1: leader端口,供follower連接的端口
port2: 選舉端口 選舉leader時供其他follower連接的端口
環境:
三臺機器:
A: 10.2.13.191 distr01.51yuki.cn
B: 10.2.13.190 distr02.51yuki.cn
C: 10.2.13.188 distr03.51yuki.cn
第一步:安裝zookeeper腳本
~~~
#!/bin/bash
#decsription install zookeeper
SOFTDIR=/usr/local/src
ZKVER=3.4.9
DATADIR=/opt/data/zookeeper
DATALOGDIR=/opt/log/zookeeper.log
#create zk datadir
[ ! -d $DATADIR ] && mkdir -p $DATADIR
[ ! -d $DATALOGDIR ] && mkdir -p $DATALOGDIR
#install java environment
cd $SOFTDIR && [ ! -f jdk-8u131-linux-x64.rpm ] && wget http://soft.51yuki.cn/jdk-8u131-linux-x64.rpm && yum -y localinstall jdk-8u131-linux-x64.rpm
#install zookeeper
cd $SOFTDIR && [ ! -f zookeeper-${ZKVER}.tar.gz ] && wget http://soft.51yuki.cn/zookeeper-${ZKVER}.tar.gz
cd /usr/local
if [ ! -d zookeeper-${ZKVER} ];then
cd $SOFTDIR && tar xf zookeeper-${ZKVER}.tar.gz -C /usr/local
ln -s /usr/local/zookeeper-${ZKVER} /usr/local/zookeeper
fi
#configure zookeeper env variables
echo -e "export ZOOKEEPER_HOME=/usr/local/zookeeper\n export PATH=${ZOOKEEPER_HOME}/bin:$PATH" > /etc/profile.d/zookeeper.sh
source /etc/profile.d/zookeeper.sh
#configure zookeeper
cd /usr/local/zookeeper/conf
cat >zoo.cfg <<EOF
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/data/zookeeper
dataLogDir=/opt/log/zookeeper
clientPort=2181
#maxClientCnxns=60
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
EOF
~~~
第二步:填寫myid
[root@distr01 conf]# cd /opt/data/zookeeper/
[root@distr01 zookeeper]# echo 01 > myid
[root@distr02 ~]# cd /opt/data/zookeeper/
[root@distr02 zookeeper]# echo 02 > myid
[root@distr03 ~]# cd /opt/data/zookeeper/
[root@distr03 zookeeper]# echo 03 > myid
第三步:配置zoo.cfg (三臺機器一樣)
[root@distr01 conf]# cat zoo.cfg |grep -v ^#
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/data/zookeeper
dataLogDir=/opt/log/zookeeper.log
clientPort=2181
server.01=distr01:2888:3888
server.02=distr02:2888:3888
server.03=distr03:2888:3888
[root@distr01 conf]# scp zoo.cfg root@10.2.13.190:/usr/local/zookeeper/conf/
root@10.2.13.190's password:
zoo.cfg 100% 1046 1.0KB/s 00:00
[root@distr01 conf]# scp zoo.cfg root@10.2.13.188:/usr/local/zookeeper/conf/
root@10.2.13.188's password:
zoo.cfg
第四步:啟動zookeeper 服務器
distr01和distr02類似操作
[root@distr03 zookeeper]# vim /etc/profile.d/zookeeper.sh
[root@distr03 zookeeper]# source /etc/profile.d/zookeeper.sh
[root@distr03 zookeeper]# zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@distr03 zookeeper]#
查看:
[root@distr03 zookeeper]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader
[root@distr02 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[root@distr01 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
模擬distr03機器故障
[root@distr03 ~]# zkServer.sh stop
這個時候distr01就變成leader咯
[root@distr01 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader
然后distr03修復后,然后上線,就是follower
[root@distr03 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
測試:
zk四字符客戶端指令
[root@huancun02 ~]# echo conf | nc 10.2.13.191 2181
clientPort=2181
dataDir=/opt/data/zookeeper/version-2
dataLogDir=/opt/log/zookeeper.log/version-2
tickTime=2000
maxClientCnxns=60
minSessionTimeout=4000
maxSessionTimeout=40000
serverId=1
initLimit=10
syncLimit=5
electionAlg=3
electionPort=3888
quorumPort=2888
peerType=0
[root@huancun02 ~]# echo ruok | nc 10.2.13.191 2181
imok
[root@huancun02 ~]# echo envi | nc 10.2.13.191 2181
Environment:
zookeeper.version=3.4.9-1757313, built on 08/23/2016 06:50 GMT
host.name=distr01.51yuki.cn
java.version=1.8.0_131
java.vendor=Oracle Corporation
java.home=/usr/java/jdk1.8.0_131/jre
java.class.path=/usr/local/zookeeper/bin/../build/classes:/usr/local/zookeeper/bin/../build/lib/*.jar:/usr/local/zookeeper/bin/../lib/slf4j-log4j12-1.6.1.jar:/usr/local/zookeeper/bin/../lib/slf4j-api-1.6.1.jar:/usr/local/zookeeper/bin/../lib/netty-3.10.5.Final.jar:/usr/local/zookeeper/bin/../lib/log4j-1.2.16.jar:/usr/local/zookeeper/bin/../lib/jline-0.9.94.jar:/usr/local/zookeeper/bin/../zookeeper-3.4.9.jar:/usr/local/zookeeper/bin/../src/java/lib/*.jar:/usr/local/zookeeper/bin/../conf:
java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
java.io.tmpdir=/tmp
java.compiler=<NA>
os.name=Linux
os.arch=amd64
os.version=3.10.0-514.el7.x86_64
user.name=root
user.home=/root
user.dir=/root
[root@huancun02 ~]# echo cons |nc 10.2.13.191 2181
/10.2.13.197:54306[0](queued=0,recved=1,sent=0)
[root@huancun02 ~]# echo reqs |nc 10.2.13.191 2181
[root@huancun02 ~]# echo stat |nc 10.2.13.191 2181
Zookeeper version: 3.4.9-1757313, built on 08/23/2016 06:50 GMT
Clients:
/10.2.13.197:54310[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0/0
Received: 12
Sent: 11
Connections: 1
Outstanding: 0
Zxid: 0x200000000
Mode: leader
Node count: 4
利用客戶端zkCli.sh (客戶端需要安裝zookeeper不要啟動服務,而使用客戶端)
[root@huancun02 ~]# zkCli.sh -server 10.2.13.191:2181
~~~
WatchedEvent state:SyncConnected type:None path:null
[zk: 10.2.13.191:2181(CONNECTED) 0]
[zk: 10.2.13.191:2181(CONNECTED) 0]
[zk: 10.2.13.191:2181(CONNECTED) 0] clear
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
[zk: 10.2.13.191:2181(CONNECTED) 1] h
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
[zk: 10.2.13.191:2181(CONNECTED) 2] ls /
[zookeeper]
[zk: 10.2.13.191:2181(CONNECTED) 3] cd /zookeeper
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
[zk: 10.2.13.191:2181(CONNECTED) 4] ls /zookeeper
[quota]
[zk: 10.2.13.191:2181(CONNECTED) 5] ls /zookeeper/quota
[]
[zk: 10.2.13.191:2181(CONNECTED) 6] ll
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
[zk: 10.2.13.191:2181(CONNECTED) 7] ls /zookeeper/quota
[]
[zk: 10.2.13.191:2181(CONNECTED) 8] create /mydata helloozk
Created /mydata
[zk: 10.2.13.191:2181(CONNECTED) 9] ls /
[zookeeper, mydata]
[zk: 10.2.13.191:2181(CONNECTED) 10] ls /mydata
[]
[zk: 10.2.13.191:2181(CONNECTED) 11] get /mydata
helloozk
cZxid = 0x200000002
ctime = Tue Feb 27 15:24:12 CST 2018
mZxid = 0x200000002
mtime = Tue Feb 27 15:24:12 CST 2018
pZxid = 0x200000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 0
[zk: 10.2.13.191:2181(CONNECTED) 12] set /mydata myworld
cZxid = 0x200000002
ctime = Tue Feb 27 15:24:12 CST 2018
mZxid = 0x200000003
mtime = Tue Feb 27 15:25:49 CST 2018
pZxid = 0x200000002
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0
[zk: 10.2.13.191:2181(CONNECTED) 13] create /mydata/distr01 distr01_data
Created /mydata/distr01
[zk: 10.2.13.191:2181(CONNECTED) 14] create /mydata/distr02 distr02_data
Created /mydata/distr02
[zk: 10.2.13.191:2181(CONNECTED) 15] create /mydata/distr03 distr03_data
Created /mydata/distr03
[zk: 10.2.13.191:2181(CONNECTED) 16] ls /root
Node does not exist: /root
[zk: 10.2.13.191:2181(CONNECTED) 17] ls /mydata
[distr02, distr03, distr01]
[zk: 10.2.13.191:2181(CONNECTED) 18] get /mydata/distr0
distr02 distr03 distr01
[zk: 10.2.13.191:2181(CONNECTED) 18] get /mydata/distr01
distr01_data
cZxid = 0x200000004
ctime = Tue Feb 27 15:27:00 CST 2018
mZxid = 0x200000004
mtime = Tue Feb 27 15:27:00 CST 2018
pZxid = 0x200000004
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 0
[zk: 10.2.13.191:2181(CONNECTED) 19] get /mydata/distr02
distr02_data
cZxid = 0x200000005
ctime = Tue Feb 27 15:27:06 CST 2018
mZxid = 0x200000005
mtime = Tue Feb 27 15:27:06 CST 2018
pZxid = 0x200000005
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 0
[zk: 10.2.13.191:2181(CONNECTED) 20] get /mydata/distr03
distr03_data
cZxid = 0x200000006
ctime = Tue Feb 27 15:27:11 CST 2018
mZxid = 0x200000006
mtime = Tue Feb 27 15:27:11 CST 2018
pZxid = 0x200000006
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 0
[zk: 10.2.13.191:2181(CONNECTED) 22] delete /mydata/distr0
distr02 distr03 distr01
[zk: 10.2.13.191:2181(CONNECTED) 22] delete /mydata/distr03
[zk: 10.2.13.191:2181(CONNECTED) 23] ls /mydata
[distr02, distr01]
~~~
客戶端API調用

通過eclispe創建一個java項目,然后在該java項目上創建一個類庫lib,然后把服務器上這些目錄
zookeeper-3.4.9.jar
jline-0.9.94.jar
log4j-1.2.16.jar
netty-3.10.5.Final.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.1.jar
拷貝到Lib文件上 ,然后右擊build

第二種:偽集群案例(偽分布)