多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
第一种:独立模式 [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调用 ![](https://box.kancloud.cn/0030b0e6edfd8f11a8903274dd69fb0a_814x535.png) 通过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 ![](https://box.kancloud.cn/12bf14c75946cb5d2462fe3767741c6e_580x199.png) 第二种:伪集群案例(伪分布)