Zookeeper技术介绍ZooKeeper是一个分布式的、开源的分布式应用协调服务,是Google的Chubby的开源实现,是Hadoop和Hbase的重要组件。它是一种为分布式应用程序提供一致服务的软件。其功能包括:配置维护、域名服务、分布式同步、群组服务等。ZooKeeper的目标是封装复杂易错的关键服务,为用户提供简单易用的接口和系统具有高性能和稳定的功能。ZooKeeper包括一组提供Java和C接口的简单原语。在ZooKeeper代码版本中,提供了分布式排他锁、选举、队列的接口。代码在zookeeper-3.4.3\src\recipes中。其中,分布式锁和队列有Java和C两个版本,选举只有Java版本。主要功能是解决分布式应用中经常遇到的一些数据管理问题,如集群管理、统一命名管理、分布式配置管理、分布式消息队列、分布式锁、分布式通知协调官网:https://zookeeper.apache。org/zookeeper架构zk集群中有一个Leader,一个或多个follower,他们相互通信,然后有一个client访问zkserver。服务器端具有快速失败功能。一旦master失效,slave就会被选举为新的master。主从模式是目前最常见的模式。zookeeper命名空间由节点NODE组成,类似于一个文件系统,其中每个节点相当于一个目录和一个文件,路径作为唯一标识。与文件系统不同,每个节点都有对应的数据内容,还可以有子节点,用于存储协调数据,比如状态、配置、位置信息等,每个节点存储的数据量很小,在知识库级别。watches介绍zk对节点的增删改查可以触发监听watch事件,是一次性触发。当它监控的数据发生变化时,它会通知客户端Zookeeper已经安装部署完毕。四台服务器zk-00110.0.0.8zk-00210.0.0.9zk-00310.0.0.10zk-client10.0.0.100下载安装JDK环境tarzxfjdk-8u60-linux-x64.tar.gzmvjdk1.8.0_60/usr/local/jdkexportJAVA_HOME=/usr/local/jdkexportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexportPATH=$JAVA_HOME/bin:$PATHsource/etc/profilejava-version[root@zk-001~]#java-versionjavaversion"1.8.0_60"Java(TM)SERuntimeEnvironment(build1.8.0_60-b27)JavaHotSpot(TM)64-BitServerVM(build25.60-b23,mixedmode)下载并安装zookeeperwgethttp://www.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gztarzxfzookeeper-3.4.6.tar.gzmvzookeeper-3.4.6/usr/local/zookeeper[root@zk-001~]#cd/usr/local/zookeeper/configuration环境变量exportZOOKEEPER_HOME=/usr/local/zookeeperexportPATH=$ZOOKEEPER_HOME/bin:$PATHsource/etc/profileZookeeper配置三种配置模式1、伪分布式模式2、全分布式3、独立模式独立模式配置[root@zk-001zookeeper]#cdconf/[root@zk-001conf]#lltotal12-rw-rw-r--110001000535Feb202014configuration.xsl-rw-rw-r--1100010002161Feb202014log4j.properties-rw-rw-r--110001000922Feb202014zoo_sample.cfg[root@zk-001conf]#cpzoo_sample.cfgzoo.cfg[root@zk-001conf]#vimzoo.cfg#每个ticktickTime的毫秒数=2000**#心跳检测周期(毫秒)**#快照存放目录#不要用/tmp存放,这里的/tmp只是#examplesakes.dataDir=/tmp/zookeeper**#存放数据目录**#客户端连接的端口clientPort=2181**#客户端连接的端口**集群模式配置tickTime=2000initLimit=10syncLimit=5//server.n=host:port1:port2N必须是myid的值在myid文件中位于dataDIR目录下,只能是一个n值//port1:leader端口,作为leader时follower连接的端口//port2:选举端口,选举leader时,follower连接端口server.1=s1:2888:3888server.2=s2:2888:3888server.3=s3:2888:3888zk集群故障处理算法为2n+1,最好部署在奇数上的机器,如果相同在一台服务器上配置多个实例时,一定要注意端口冲突。可以这样写server.1=s1:2888:3888server.2=s2:2889:3889server.3=s3:2887:3887配置过程如下配置hosts文件vim/etc/hosts10.0.0.8zk-00110.0.0.9zk-00210.0.0.10zk-003配置每个服务器配置文件[root@zk-001conf]#mkdir/tmp/zookeeper[root@zk-001conf]#cd/tmp/zookeeper/[root@zk-001zookeeper]#echo8>myid[root@zk-001conf]#egrep-v"^#|^$"zoo.cfgtickTime=2000initLimit=10syncLimit=5dataDir=/tmp/zookeeperclientPort=2181server.8=zk-001:2888:3888server.9=zk-002:2888:3888server.10=zk-003:2888:3888[root@zk-002~]#mkdir/tmp/zookeeper[root@zk-002~]#cd/tmp/zookeeper/[root@zk-002zookeeper]#echo9>myid[root@zk-002zookeeper]#lltotal4-rw-r--r--1根root2May1315:51myid[root@zk-002zookeeper]#cd/usr/local/zookeeper/conf/[root@zk-002conf]#cpzoo_sample.cfgzoo.cfg[root@zk-002conf]#vimzoo.cfgtickTime=2000initLimit=10syncLimit=5dataDir=/tmp/zookeeperclientPort=2181server.8=zk-001:2888:3888server.9=zk-002:2888:3888server.10=zk-003:2888:3888[root@zk-003~]#mkdir/tmp/zookeeper[root@zk-003~]#cd/tmp/zookeeper/[root@zk-003zookeeper]#echo10>myid[root@zk-003zookeeper]#cd/usr/local/zookeeper/conf/[root@zk-003conf]#cpzoo_sample.cfgzoo.cfg[root@zk-003conf]#vimzoo.cfgtickTime=2000initLimit=10syncLimit=5dataDir=/tmp/zookeeperclientPort=2181server.8=zk-001:2888:3888server.9=zk-002:2888:3888server.10=zk-003:2888:3888启动服务[root@zk-001bin]#zkServer.shstartJMXenabledbydefaultUsingconfig:/usr/local/zookeeper/bin/../conf/zoo.cfgStartingzookeeper...STARTED[root@zk-002bin]#zkServer.shstartJMX默认启用使用配置:/usr/local/zookeeper/bin/。./conf/zoo.cfgStartingzookeeper...STARTED[root@zk-003bin]#zkServer.shstartJMXenabledbydefaultUsingconfig:/usr/local/zookeeper/bin/../conf/zoo.cfgStartingzookeeper...开始查看状态[root@zk-001conf]#zkServer.shstatusJMXenabledbydefaultUsingconfig:/usr/local/zookeeper/bin/../conf/zoo.cfgMode:follower[root@zk-002conf]#zkServer.shstatusJMXenabledbydefaultUsingconfig:/usr/local/zookeeper/bin/../conf/zoo.cfgMode:follower[root@zk-003conf]#zkServer.shstatusJMXenabledbydefaultUsingconfig:/usr/local/zookeeper/bin/../conf/zoo.cfgMode:leader#可以看到已经选举出leader,说明配置正确。测试leader失效后的切换情况。[root@zk-003conf]#jps2694Jps2430QuorumPeerMain[root@zk-003conf]#kill2430[root@zk-003conf]#jps2724Jps[root@zk-002conf]#zkServer.shstatusJMX启用defaultUsingconfig:/usr/local/zookeeper/bin/../conf/zoo.cfgMode:follower[root@zk-001conf]#zkServer.shstatusJMXenabledbydefaultUsingconfig:/usr/local/zookeeper/bin/../conf/zoo.cfgMode:leader可以看到serverzk-001已经被选为新的leaderZookeeperclient四字符命令conf配置信息cons连接信息dump未处理的会话节点envi环境信息reqs未处理的请求stat统计信息wchsserver查看详细信息wchplist指定路径下的服务器信息[root@zk-003~]#echoconf|nc10.0.0.82181clientPort=2181dataDir=/tmp/zookeeper/version-2dataLogDir=/tmp/zookeeper/version-2tickTime=2000maxClientCnxns=60minSessionTimeout=4000maxSessionTimeout=40000serverId=8initLimit=10syncLimit=5electionAlg=3electionPort=3888quorumPort=2888peerType=0[root@zk-003~]#echoenvi|nc10.0.0.82181Environment:zookeeper.version=3.4.6-1569965,buildon02/20/201409:09GMThost.name=zk-001java.version=1.8.0\_121java.vendor=OracleCorporationjava.home=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jrejava.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.7.0.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.6.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/libjava.io.tmpdir=/tmpjava.compiler=
