zookeeper系列讲座 很全面

上传人:s****a 文档编号:119771747 上传时间:2022-07-16 格式:DOCX 页数:26 大小:51.47KB
返回 下载 相关 举报
zookeeper系列讲座 很全面_第1页
第1页 / 共26页
zookeeper系列讲座 很全面_第2页
第2页 / 共26页
zookeeper系列讲座 很全面_第3页
第3页 / 共26页
点击查看更多>>
资源描述
本篇文章结构:总共包括10个系列ZooKeeper 系列之一:ZooKeeper 简介ZooKeeper系列之二:ZooKeeper数据模型、命名空间以及节点的概念ZooKeeper系列之三:ZooKeeper的安装ZooKeeper系列之四:ZooKeeper的配量ZooKeeper系列之五:ZooKeeper的运行ZooKeeper系列之六:ZooKeeper四字命令ZooKeeper系列之七:ZooKeeper命令行工具ZooKeeper系列之八:ZooKeeper的简单操作ZooKeeper系列之九:ZooKeeperAPI简介及编程ZooKeeper系列之十:ZooKeeper的一致性保证及Leader选举ZooKeeper 系列之一一:ZooKeeper 简介ZooKeeper是一个为分布式应用所设计的分布的、开源的协调服务。分布式 的应用可以建立在同步、配置管理、分组和命名等服务的更高级别的实现的基 础之上。ZooKeeper意欲设计一个易于编程的环境,它的文件系统使用我们所 熟悉的目录树结构。ZooKeeper使用Java所编写,但是支持Java和C两种编 程语言。众所周知,协调服务非常容易出错,但是却很难恢复正常,例如,协调服务很容易处 于竞态以至于出现死锁。我们设计ZooKeeper的目的是为了减轻分布式应用程序所承担的 协调任务。ZooKeeper 系列之二:ZooKeeper数据模型、命名空间以及节点的概念ZooKeeper数据模型和层次命名空间提供的命名空间与标准的文件系统非常相似。一个名称是由通过斜线分隔开的路径名序列 所组成的。ZooKeeper中的每一个节点是都通过路径来识别。下图是Zookeeper中节点的数据模型,这种树形结构的命名空间操作方便且易于理解。图:ZooKeeper层次命名空间ZooKeeper中节点和临时节点ZooKeeper的节点是通过像树一样的结构来进行维护的,并且每一个节点通过路径来标示以 及访问。除此之外,每一个节点还拥有自身的一些信息,包括:数据、数据长度、创建时 间、修改时间等等。从这样一类既含有数据,又作为路径表标示的节点的特点中,可以看 出,ZooKeeper的节点既可以被看做是一个文件,又可以被看做是一个目录,它同时具有二 者的特点。为了便于表达,今后我们将使用Znode来表示所讨论的ZooKeeper节点。具体地说,Znode维护着数据、ACL(access control list,访问控制列表)、时间戳等交 换版本号等数据结构,它通过对这些数据的管理来让缓存生效并且令协调更新。每当Znode 中的数据更新后它所维护的版本号将增加,这非常类似于数据库中计数器时间戳的操作方 式。另外Znode还具有原子性操作的特点:命名空间中,每一个Znode的数据将被原子地读写。 读操作将读取与Znode相关的所有数据,写操作将替换掉所有的数据。除此之外,每一个 节点都有一个访问控制列表,这个访问控制列表规定了用户操作的权限。ZooKeeper中同样存在临时节点。这些节点与session同时存在,当session生命周期结束, 这些临时节点也将被删除。临时节点在某些场合也发挥着非常重要的作用。ZooKeeper系列之三:ZooKeeper 的安装ZooKeeper的安装模式分为三种,分别为:单机模式(stand-alone)、集群模式和集群伪 分布模式。ZooKeeper单机模式的安装相对比较简单,如果第一次接触ZooKeeper的话, 建议安装ZooKeeper单机模式或者集群伪分布模式。1)单机模式首先,从Apache官方网站下载一个ZooKeeper的最近稳定版本。http:/hadoop.apache.org/zookeeper/releases.html作为国内用户来说,选择最近的的源文件服务器所在地,能够节省不少的时间。http:/labs.renren.Com/apache-mirror/hadoop/zookeeper/ZooKeeper要求JAVA的环境才能运行,并且需要JAVA6以上的版本,可以从SUN官网 上下载,并对JAVA环境变量进行设置。除此之外,为了今后操作的方便,我们需要 对ZooKeeper的环境变量进行配置,方法如下,在/etc/profile文件中加入如下的内容:#Set ZooKeeper Enviromentexport ZOOKEEPER_HOME=/root/hadoop-0.20.2/zookeeper-3.3.1export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/confZooKeeper服务器包含在单个JAR文件中,安装此服务需要用户创建一个配置文档,并对 其进行设置。我们在ZooKeeper-*.*.*目录(我们以当前ZooKeeper的最新版3.3.1为 例,故此下面的ZooKeeper-*.*.* ”都将写为“ZooKeeper-3.3.1 ”)的 conf 文件 夹下创建一个zoo.cfg文件,它包含如下的内容:tickTime=2000dataDir=/var/zookeeperclientPort=2181在这个文件中,我们需要指定dataDir的值,它指向了一个目录,这个目录在开始的时候 需要为空。下面是每个参数的含义:tickTime :基本事件单元,以毫秒为单位。它用来指示心跳,最小的session过期时间 为两倍的tickTime.。dataDir :存储内存中数据库快照的位置,如果不设置参数,更新事务日志将被存储到默 认位置。clientPort :监听客户端连接的端口使用单机模式时用户需要注意:这种配置方式下没有ZooKeeper副本,所以如 果ZooKeeper服务器出现故障,ZooKeeper服务将会停止。以下代码清单A是我们的根据自身情况所设置的zookeeper配置文档:zoo.cfg代码清单A : zoo.cfg# The number of milliseconds of each ticktickTime=2000# the directory where the snapshot is stored.dataDir=/root/hadoop-0.20.2/zookeeper-3.3.1/snapshot/data# the port at which the clients will connectclientPort=21812)集群模式为了获得可靠的ZooKeeper服务,用户应该在一个集群上部署ZooKeeper。只要集群上 大多数的ZooKeeper服务启动了,那么总的ZooKeeper服务将是可用的。另外,最好使用 奇数台机器。如果zookeeper拥有5台机器,那么它就能处理2台机器的故障了。之后的操作和单机模式的安装类似,我们同样需要对JAVA环境进行设置,下载最新 的ZooKeeper稳定版本并配置相应的环境变量。不同之处在于每台机器 上conf/zoo.cfg配置文件的参数设置,参考下面的配置:tickTime=2000dataDir=/var/zookeeper/clientPort=2181initLimit=5syncLimit=2server.1=zoo1:2888:3888server.2=zoo2:2888:3888server.3=zoo3:2888:3888“ server.id=host:port:port. ”指示了不同的ZooKeeper服务器的自身标识,作为集 群的一部分的机器应该知道ensemble中的其它机器。用户可以从“ server.id=host:port:port. ”中读取相关的信息。在服务器的data( dataDir参 数所指定的目录)目录下创建一个文件名为myid的文件,这个文件中仅含有一行的内容, 指定的是自身的id值。比如,服务器“ 1 ”应该在myid文件中写入“ 1 ”。这个id值 必须是ensemble中唯一的,且大小在1到255之间。这一行配置中,第一个端口( port) 是从(follower)机器连接到主(leader)机器的端口,第二个端口是用来进 行leader选举的端口。在这个例子中,每台机器使用三个端口,分别是:clientPort, 2181 ; port , 2888 ; port , 3888 。我们在拥有三台机器的Hadoop集群上测试使用ZooKeeper服务,下面代码清单B是我 们根据自身情况所设置的ZooKeeper配置文档:代码清单B : zoo.cfg# The number of milliseconds of each ticktickTime=2000# The number of ticks that the initial# synchronization phase can takeinitLimit=10# The number of ticks that can pass between# sending a request and getting an acknowledgementsyncLimit=5# the directory where the snapshot is stored.dataDir=/root/hadoop-0.20.2/zookeeper-3.3.1/snapshot/d1# the port at which the clients will connect clientPort=2181server.1=IP1:2887:3887server.2=IP2:2888:3888server.3=IP3:2889:3889清单中的IP分别对应的配置分布式ZooKeeper的IP地址。当然,也可以通过机器名访 问zookeeper,但是需要在ubuntu的hosts环境中进行设置。读者可以查阅Ubuntu以 及Linux的相关资料进行设置。3)集群伪分布简单来说,集群伪分布模式就是在单机下模拟集群的ZooKeeper服务。那么,如何对配置ZooKeeper的集群伪分布模式呢?其实很简单,在zookeeper配置文 档中,clientPort参数用来设置客户端连接zookeeper的端口。server.1=IP1:2887:3887中,IP1指示的是组成ZooKeeper服务的机器IP地 址,2887为用来进行leader选举的端口,3887为组成ZooKeeper服务的机器之间通 信的端口。集群伪分布模式我们使用每个配置文档模拟一台机器,也就是说,需要在单台 机器上运行多个zookeeper实例。但是,我们必须要保证各个配置文档的clientPort不 能冲突。下面是我们所配置的集群伪分布模式,通过zoo1.cfg,zoo2.cfg,zoo3.cfg模拟了 三台机器的ZooKeeper集群。详见代码清单C :代码清单C : zoo1.cfg :# The number of milliseconds of each ticktickTime=2000# The number of ticks that the initial# synchronization phase can takeinitLimit=10# The number of ticks that can pass between# sending a request and getting an acknowledgementsyncLimit=5# the directory where the snapshot is stored.dataDir=/root/hadoop-0.20.2/zookeeper-3.3.1/d_1# the port at which the clients will connect clientPort=2181 server.1=localhost:2887:3887server.2=localhost:2888:3888server.3=localhost:2889:3889zoo2.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.dataDir=/root/hadoop-0.20.2/zookeeper-3.3.1/d_2# the port at which the clients will connect clientPort=2182#the location of the log filedataLogDir=/root/hadoop-0.20.2/zookeeper-3.3.1/logsserver.1=localhost:2887:3887server.2=localhost:2888:3888server.3=localhost:2889:3889zoo3.cfg :# The number of milliseconds of each tick tickTime=2000# The number of ticks that the initial# synchronization phase can takeinitLimit=10# The number of ticks that can pass between# sending a request and getting an acknowledgementsyncLimit=5# the directory where the snapshot is stored.dataDir=/root/hadoop-0.20.2/zookeeper-3.3.1/d_2# the port at which the clients will connectclientPort=2183#the location of the log filedataLogDir=/root/hadoop-0.20.2/zookeeper-3.3.1/logsserver.1=localhost:2887:3887server.2=localhost:2888:3888server.3=localhost:2889:3889从上述三个代码清单中可以看到,除了 clientPort不同之外,dataDir也不同。另外, 不要忘记在dataDir所对应的目录中创建myid文件来指定对应的zookeeper服务器实 例。这里ZooKeeper的安装已经说完了,下一节我们来谈一谈对ZooKeeper的参数配置 的理解。ZooKeeper系列之四:ZooKeeper 的配置ZooKeeper的功能特性通过ZooKeeper配置文件来进行控制管理(zoo.cfg配置文 件)。ZooKeeper这样的设计其实是有它自身的原因的。通过前面对ZooKeeper的配置 可以看出,对ZooKeeper集群进行配置的时候,它的配置文档是完全相同的(对于集群伪 分布模式来说,只有很少的部分是不同的)。这样的配置方使得在部署ZooKeeper服务的 时候非常地方便。另外,如果服务器使用不同的配置文件,必须要确保不同配置文件中的 服务器列表相匹配。在设置ZooKeeper配置文档的时候,某些参数是可选的,但是某些参数是必须的。这些必 须的参数就构成了 ZooKeeper配置文档的最低配置要求。下面是在最低配置要求中必须配置的参数:1)最低配置clientPort监听客户端连接的端口;dataDir存储内存中数据库快照的位置;注意应该谨慎地选择日志存放的位置,使用专用的日志存储设备能够大大地提高系统的性 能,如果将日志存储在比较繁忙的存储设备上,那么将会在很大程度上影响系统的性能。tickTime基本事件单元,以毫秒为单位。它用来控制心跳和超时,默认情况下最小的会话超时时间 为两倍的tickTime。2)高级配置下面是高级配置要求中可选的配置参数,用户可以使用下面的参数来更好地规 定ZooKeeper的行为:dataLogDir这个操作将管理机器把事务日志写入到“ dataLogDir ”所指定的目录,而不是dataDir ” 所指定的目录。这将允许使用一个专用的日志设备并且帮助我们避免日志和快照之间的竞 争。配置如下:#the location of the log filedataLogDir=/root/hadoop-0.20.2/zookeeper-3.3.1/log/data_logmaxClientCnxns这个操作将限制连接到ZooKeeper的客户端的数量,限制并发连接的数量,它通过IP来 区分不同的客户端。此配置选项可以用来阻止某些类别的Dos攻击。将它设置为0或者 忽略而不进行设置将会取消对并发连接的限制。例如,此时我们将maxClientCnxns的值设置为1 ,如下所示:#set maxClientCnxnsmaxClientCnxns=1启动ZooKeeper之后,首先用一个客户端连接到ZooKeeper服务器之上。然后,当第二个客户端尝试对ZooKeeper进行连接,或者某些隐式的对客户端的连接操作,将会触发ZooKeeper的上述配置。系统会提示相关信息,如下图1所示:2k: localhast:2L81(CDNNECTED) 0 2011-01-18 08:53:52,748 - WARN NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NI0ServerCnxniFactory246 - 丁叫Enn既tions fout /Y17. L - m日xL2QU-01-13 0S:5:05r792 - WARN NIOServerCxn.Factory:0.0.0.0/G.G.G.G:2181:NIOSe rverCnxn$Factory(324-6 - T口口c口nn巳tions fi-m /177.色.色.1 - max is 1图 1 : ZooKeeper maxClientCnxns 异常minSessionTimeout 和 maxSessionTimeout最小的会话超时时间以及最大的会话超时时间。其中,最小的会话超时时间默认情况下 为2倍的tickTme时间,最大的会话超时时间默认情况下为20倍的会话超时时间。在 启动时,系统会显示相应信息,见下图2所示,默认会话超时时间:INFO INFO INFO INFO INFO INFO INFOmain:Environmert(897 - Server environment!user.na(ne=roatmain:Envirormert997 - Server environment:user.ha(ne=/rootmair:ErvirormenW97 - Serv&r environment:user.dirZrootmain:ZooKeeperServe03660 - tickTim.e set to 2999main:ZooKeeperServen(a669 - ihinSessionTiineout set ta -1main:ZooKeeperServer67B - max.SessiqnTimeout set to -1- binding to pot Q.Q.E).。/。-臼一臼.臼:21图2 :默认会话超时时间从上图中可以看书,minSessionTimeout以及maxSessionTimeout的值均为-1,现在 我们来设置系统的最小会话超时时间以及最大会话超时时间,如下所示:#set minSessionTimeoutminSessionTimeout=1000#set maxSessionTImeoutmaxSessionTimeout=10000在配置minSessionTmeout以及maxSessionTimeout的值的时候需要注意,如果将此值设 置的太小的话,那么会话很可能刚刚建立便由于超时而不得不退出。一般情况下,不能将 此值设置的比tickTime的值还小。3)集群配置initLimit此配置表示,允许follower (相对于leader而言的客户端”)连接并同步到leader的 初始化连接时间,它以tickTime的倍数来表示。当超过设置倍数的tickTime时间,则 连接失败。syncLimit此配置表示,leader与follower之间发送消息,请求和应答时间长度。如果follower在设置的时间内不能与leader进行通信,那么此follower将被丢弃。ZooKeeper系列之五:ZooKeeper 的运行我们这里所介绍的是对应ZooKeeper系列之三:ZooKeeper的安装模式的运行。1)单机模式用户可以通过下面的命令来启动ZooKeeper服务:zkServer.sh start这个命令默认情况下执行ZooKeeper的conf文件夹下的zoo.cfg配置文件。当运行成功用户会看到类似如下的提示界面:rootubuntu:# zkServer.sh startJMX enabled by defaultUsing config: Zroot/hadoop-0.20.2/zookeeper-3.3.1/bin/./conzoo.cfgStarting zookeeper .STARTED.2011-01-19 10:04:42,300 - WARN main:QuorumPeerMain105 - Either no config or no quorum defined in config, running in standalone mode.2011-01-19 10:04:42,419 - INFO main:ZooKeeperServer660 - tickTime set to 20002011-01-19 10:04:42,419 - INFO main:ZooKeeperServer669 - minSessionTimeout set to -12011-01-19 10:04:42,419 - INFO main:ZooKeeperServer678 - maxSessionTimeout set to -12011-01-19 10:04:42,560 - INFO main:NIOServerCnxn$Factory143 - binding to port 0.0.0.0/0.0.0.0:21812011-01-19 10:04:42,806 - INFO main:FileSnap82 - Reading snapshot /root/hadoop-0.20.2/zookeeper-3.3.data/version-2/snapshot.2000000362011-01-19 10:04:42,927 - INFO main:FileSnap82 - Reading snapshot /root/hadoop-0.20.2/zookeeper-3.3.data/version-2/snapshot.2000000362011-01-19 10:04:42,950 - INFO main:FileTxnSnapLog208 - Snapshotting: 400000058从上面可以看出,运行成功后,系统会列出ZooKeeper运行的相关环境配置信息。2)集群模式3)集群伪分布模式在集群伪分布模式下,我们只有一台机器,但是要运行三个ZooKeeper服务实例。此时,如果再使用上述命令式肯定行不通的。这里,我 们通过下面三条命能够令来运行ZooKeeper系列之三:ZooKeeper的安装中我们配置的ZooKeeper服务。如下所示:zkServer.sh start zoo1.cfg zkServer.sh start zoo2.cfg zkServer.sh start zoo3.cfg在运行完第一条命令之后,读者将会发现一些系统错误提示,如下图1所示:2011-01- 17 23:18:21p947 - WARN Workersender Thread:QuarumCnxManagerT361 - Ca not ouen channel to 3 at election address localhost/127.B.O.1:3B89.ConnectException: Connection refusedsun.nio.ch.Net.connectfNative Method)sun.nio.ch.SocketChannellmpl.connecttSocketChannellmpI.javaj ava.nio.channels.Socketchannel.open tSocketChannel.j ava:146)org. apache, zookeeper, server. quaruM.QuorumCnxHanager .conrectOre (tjuorti CnxManager.j ava;347)atatatatat org.apache.zookeeper.server.quorum.QuoruraiCnxManager.toSerd(QuoruntCiixi anager.j ava :320)at org.apache.zookeeper.server.quorum.FastLeaderElectionSMessengerWorki rSender.process(FastLeaderElectian.j ava:353)at org.apache.zookeeper.server.quorum.FastLeaderElection$MessergerWorki rSender.run(FastLeaderElection.j ava:326*at java.lang.Thread.runThread.java:6192Q11-Q1- 17 23:18:22,169 - WARN QuorumPeer:/0:0:0:0:0:B:0:0:21S1:QLiorumCnxMnai ena361 - Cannot open channel to 2 at election address localhost/127.0.0.1:3888图1:集群伪分布异常提示产生如上图所示的异常信息是由于ZooKeeper服务的每个实例都拥有全局的配置信息,它们在启动的时候需要随时地进行Leader选举操作(此部分内容下面将会详细讲述)。此时第一个启动的Zookeeper需要和另外两个ZooKeeper实例进行通信。但是,另外两个ZooKeeper实例还 没有启动起来,因此将会产生上述所示的异常信息。我们直接将其忽略即可,因为当把图示中的“ 2号”和“ 3号” ZooKeeper实例启动起来之后,相应的异常信息就回自然而然地消失。ZooKeeper系列之六:ZooKeeper 四字命令ZooKeeper支持某些特定的四字命令字母与其的交互。它们大多是查询命令,用来获取ZooKeeper服务的当前状态及相关信息。用户在客户端可以通过telnet或nc向ZooKeeper提交相应的命令。ZooKeeper常用四字命令见下表1所示:ZooKeeper 四字 命令功能描述conf输出相关服务配置的详细信息。cons列出所有连接到服务器的客户端的完全的连接/会话的详细信息。包括“接受/发送”的 包数量、会话id、操作延迟、最后的操作执行等等信息。dump列出未经处理的会话和临时节点。envi输出关于服务环境的详细信息(区别于conf命令)。reqs列出未经处理的请求ruok测试服务是否处于正确状态。如果确实如此,那么服务返回imok”,否则不做任何相应。stat输出关于性能和连接的客户端的列表。wchs列出服务器watch的详细信息。wchc通过session列出服务器watch的详细信息,它的输出是一个与watch相关的会话的列 表。wchp通过路径列出服务器watch的详细信息。它输出一个与session相关的路径。下图1是ZooKeeper四字命令的简单用例:roottaubuntu-Iapt叩:echo ruok j nc IS.77.Z9.Z3 Z181 inio|(rootcaiibtintu-laptop:-# echo conf nc 10.77.29.23 2181 LienTForT=2iBidataDir/root/hadoop-Q.20.2/7Cjok.eeper-3.3.1/d l/vsrs.ion-2 datLogDir=/root/ha do op-fl. 20.2/zQok.eeper-3.3.I/d L/versian-2mdxClientCnnslQininSessionTiineout-4000ntax5essionTimeout=40000serverld=l5yFKLindt=5elect2oriAlg=3electionPort=3887quorumPort=2887peerType=6roottaubuntu-laptop! 坷图1: ZooKeeper四字命令用例ZooKeeper系列之七:当启动ZooKeeper服务成功之后,输入下述命令,连接到ZooKeeper服务:zkCli.sh -server 10.77.20.23:2181连接成功后,系统会输出ZooKeeper的相关环境以及配置信息,并在屏幕输出“Welcome to ZooKeeper”等信息。输入help之后,屏幕会输出可用的ZooKeeper命令,如下图1所示:Zk: 10.77.2Q.23:2181(CONNECTED) 1 help ZooKeeper -server host:port cmd args connect host:.port get path watch Is path watch set path data version delquota -nf-b path quit printwatches on off create -s -e path data act stat path watch close ls2 path watch history Ustquota path setAcl path act getAcl path sync path redo cmdnoadd己uth scheme 己nth delete path version setquota -n | -b val path图 1 : ZooKeeper 命令ZooKeeper系列之八:ZooKeeper的简单操作1 )使用云命令来查看当前ZooKeeper中所包含的内容:zk:10.77.20.23:2181(CONNECTED)1ls/zookeeper2 )创建一个新的znode,使用create/zkmyData 。这个命令创建了一个新的znode节点“zk ”以及与它关联的字 符串:zk:10.77.20.23:2181(CONNECTED)2create/zkmyDataCreated/zk3) 再次使用云命令来查看现在zookeeper中所包含的内容:zk:10.77.20.23:2181(CONNECTED)3ls/zk,zookeeper此时看到,zk节点已经被创建。4) 下面我们运行get命令来确认第二步中所创建的znode是否包含我们所创建的字符串:zk:10.77.20.23:2181(CONNECTED)4get/zkmyDataZxid=0x40000000ctime=TueJan1818:48:39CST2011Zxid=0x40000000cmtime=TueJan1818:48:39CST2011 pZxid=0x40000000ccversion=0dataVersion=0aclVersion=0ephemeralOwner=0x0dataLength=6numChildren=05 )下面我们通过set命令来对zk所关联的字符串进行设置:zk:10.77.20.23:2181(CONNECTED)5set/zkshenlan211314cZxid=0x40000000cctime=TueJan1818:48:39CST2011mZxid=0x40000000dmtime=TueJan1818:52:11CST2011pZxid=0x40000000ccversion=0dataVersion = 1aclVersion=0ephemeralOwner=0x0dataLength = 13numChildren=06 )下面我们将刚才创建的znode删除:zk:10.77.20.23:2181(CONNECTED)6delete/zk7 )最后再次使用云命令查看ZooKeeper所包含的内容:zk:10.77.20.23:2181(CONNECTED)7ls/zookeeper经过验证,zk节点已经被删除。ZooKeeper系列之九:ZooKeeperAPI简介及编程1)ZooKeeperAPI 简介ZooKeeperAPI共包含5个包,分别为:org.apache.zookeeper ,org.apache.zookeeper.data , org.apache.zookeeper.server , org.apache.zookeeper.ser ver.quorum 和 org.apache.zookeeper.server.upgrade 。其中org.apache.zookeeper 包含ZooKeeper 类,它我们编程时 最常用的类文件。这个类是ZooKeeper客户端库的主要类文件。如果要使用ZooKeeper服务,应用程序首先必须创建一个Zookeeper实例,这时就需要使用此类。一旦客户端和ZooKeeper服务建立起连接,ZooKeeper系统将会分配给 此连接回话一个ID值,并且客户端将会周期地向服务器发送心 跳来维持会话的连接。只要连接有效,客户端就可以调用ZooKeeperAPI来做相应的处理。它提供了表1所示几类主要方法,:表 1 : ZooKeeperAPI 描述功能描述create在本地目录树中创建一个节点delete删除一个节点exists测试本地是否存在目标节点get/set data从目标节点上读取/写数据get/set ACL获取/设置目标节点访问控制列表信息get children检索一个子节点上的列表sync等待要被传送的数据2)ZooKeeperAPI 的使用这里,笔者通过一个例子来简单介绍,如何使用ZooKeeperAPI编写自己的应用程序,见代码清单1 :代码清单1 : ZooKeeperAPI的使用I. importjava.io.IOException;2.3.importorg.apache.zookeeper.CreateMode;4.importorg.apache.zookeeper.KeeperException;5.importorg.apache.zookeeper.Watcher;6.importorg.apache.zookeeper.ZooDefs.Ids;7.importorg.apache.zookeeper.ZooKeeper;8.9. publicclassdemo(10. /会话超时时间,设置为与系统默认时间一致II. privatestaticfinalintSESSION_TIMEOUT=30000;12.13. /创建ZooKeeper 实例14. ZooKeeperzk;15.15. /创建Watcher实例16. Watcherwh = newWatcher()(17. publicvoidprocess(org.apache.zookeeper.WatchedEventevent)18. (20.System.out.println(event.toString();21. 22. ;23.23. /初始化ZooKeeper实例24. privatevoidcreateZKInstance()throwsIOException25. (26. zk=newZooKeeper(localhost:218r,demo.SESSION_TIMEOUT,thi s.wh);28.27. 30.28. privatevoidZKOperations()throwsIOException,InterruptedException,KeeperException29. (33.System.out.println(/n1.创建ZooKeeper 节点(znode : zoo2,数据:myData2,权限: OPEN_ACL_UNSAFE,节点类型:Persistent);34zk.create(7zoo2,myData2.getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);35.36System.out.println(7n2.查看是否创建成功:);37.System.out.println(newString(zk.getData(7zoo2,false,null);38.39.System.out.println(7n3.修改节点数据);40.zk.setData(7zoo2,shenlan211314.getBytes(),-1);41.42.System.out.println(7n4.查看是否修改成功:);43.System.out.println(newString(zk.getData(7zoo2,false,null);44.45.Systemoutprintln(7n5.删除节点);46.zk.delete(7zoo2广1);47.48.System.out.println(/n6.查看节点是否被删除:);49.System.out.println(态:+zk.exists(7zoo2,false) + );节点状50. 51.51. privatevoidZKClose()throwsInterruptedException52. (53. zk.close();54. 56.55. publicstaticvoidmain(Stringargs)throwsIOException,InterruptedException,KeeperException56. demodm = newdemo();57. dm.createZKInstance();58. dm.ZKOperations();59. dm.ZKClose();60. 61. 此类包含两个主要的ZooKeeper函数,分别为createZKInstance ()和ZKOperations ()。其中 createZKInstance ()函数负责对ZooKeeper实例zk进行初始化。ZooKeeper类有两个构造函数,我们这里使用“ZooKeeper ( StringconnectString, ,intsessionTimeout, , Watcherwatcher ) ”对其进行初始化。 因此,我们需要提供初始化所需的,连接字符串信息,会话超时 时间,以及一个watcher实例。17行到23行代码,是程序所 构造的一个watcher实例,它能够输出所发生的事件。ZKOperations()函数是我们所定义的对节点的一系列操作。 它包括:创建ZooKeeper节点(33行到34行代码)、查看 节点(36行到37行代码)、修改节点数据(39行到40行代 码)、查看修改后节点数据(42行到43行代码)、删除节点(45行到46行代码)、查看节点是否存在(48行到49行代 码)。另外,需要注意的是:在创建节点的时候,需要提供节点 的名称、数据、权限以及节点类型。此外,使用exists函数时, 如果节点不存在将返回一个null值。关于ZooKeeperAPI的更 多详细信息,读者可以查看ZooKeeper的API文档如下所示: http:/hadoop.apache.Org/zookeeper/docs/r3.3.1/api/ind ex.htmlZooKeeper系列之十:ZooKeeper的一至攵性保证及Leader选举1)-致性保证Zookeeper是一种高性能、可扩展的服务。Zookeeper的 读写速度非常快,并且读的速度要比写的速度更快。另外,在进 行读操作的时候,ZooKeeper依然能够为旧的数据提供服务。 这些都是由于ZooKeepe所提供的一致性保证,它具有如下特 点八、:顺序一致性客户端的更新顺序与它们被发送的顺序相一致。原子性更新操作要么成功要么失败,没有第三种结果。单系统镜像无论客户端连接到哪一个服务器,客户端将看到相同 的ZooKeeper 视图。可靠性一旦一个更新操作被应用,那么在客户端再次更新它之前, 它的值将不会改变。这个保证将会产生下面两种结果:1 .如果客户端成功地获得了正确的返回代码,那么说明更新已经成果。如果不能够获得返回代码(由于通信错误、超时等 等),那么客户端将不知道更新操作是否生效。2 .当从故障恢复的时候,任何客户端能够看到的执行成功 的更新操作将不会被回滚。实时性在特定的一段时间内,客户端看到的系统需要被保证是实时 的(在十几秒的时间里)。在此时间段内,任何系统的改变将被 客户端看到,或者被客户端侦测到。给予这些一致性保证,ZooKeeper更高级功能的设计与实 现将会变得非常容易,例如:leader选举、队列以及可撤销锁 等机制的实现。2 ) Leader 选举ZooKeeper需要在所有的服务(可以理解为服务器)中选举 出一个Leader,然后让这个Leader来负责管理集群。此时, 集群中的其它服务器则成为此Leader的Follower。并且, 当Leader故障的时候,需要ZooKeeper能够快速地 在Follower中选举出下一个Leader。这就是ZooKeeper的Leader机制,下面我们将简单介绍在ZooKeeper 中,Leader 选举(LeaderElection )是如何实现的。此操作实现的核心思想是:首先创建一个EPHEMERAL目录 节点,例如“/election ”。然后。每一个ZooKeeper服务器 在此目录下创建一个SEQUENCE EPHEMERAL类型的节点,例如“/election/n_ ”。在 SEQUENCE 标志下,ZooKeeper 将 自动地为每一个ZooKeeper服务器分配一个比前一个分配的 序号要大的序号。此时创建节点的ZooKeeper服务器中拥有最 小序号编号的服务器将成为Leader。在实际的操作中,还需要保障:当Leader服务器发生故障 的时候,系统能够快速地选出下一个ZooKeeper服务器作 为Leader。一个简单的解决方案是,让所有的follower监 视leader所对应的节点。当Leader发生故障时,Leader所 对应的临时节点将会自动地被删除,此操作将会触发所有监 视Leader的服务器的watch。这样这些服务器将会收 到Leader故障的消息,并进而进行下一次的Leader选举操作。 但是,这种操作将会导致“从众效应”的发生,尤其当集群中服 务器众多并且带宽延迟比较大的时候,此种情况更为明显。在Zookeeper中,为了避免从众效应的发生,它是这样来实 现的:每一个follower对follower集群中对应的比自己节点序 号小一号的节点(也就是所有序号比自己小的节点中的序号最大 的节点)设置一个watch。只有当follower所设置的watch被 触发的时候,它才进行Leader选举操作,一般情况下它将成为 集群中的下一个Leader。很明显,此Leader选举操作的速度 是很快的。因为,每一次Leader选举几乎只涉及单个follower的操作。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!