ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:191.84KB ,
资源ID:16634874      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16634874.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(zookeeper原理Word文档下载推荐.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

zookeeper原理Word文档下载推荐.docx

1、全局有序是指如果在一台效劳器上消息a在消息b前发布,那么在所有Server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面。2 ZooKeeper的工作原理Zookeeper的核心是原子播送,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式选主和播送模式同步。当效劳启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步以后,恢复模式就完毕了。状态同步保证了leader和Server具有一样的系统状态。为了保证事务的

2、顺序一致性,zookeeper采用了递增的事务id号zxid来标识事务。所有的提议proposal都在被提出的时候加上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期。低32位用于递增计数。每个Server在工作过程中有三种状态:LOOKING:当前Server不知道leader是谁,正在搜寻LEADING:当前Server即为选举出来的leaderFOLLOWING:leader已经选举出来,当前Server与之同步2.1 选主流程当leade

3、r崩溃或者leader失去大多数的follower,这时候zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的Server都恢复到一个正确的状态。Zk的选举算法有两种:一种是基于basic paxos实现的,另外一种是基于fast paxos算法实现的。系统默认的选举算法为fast paxos。先介绍basic paxos流程:1 .选举线程由当前Server发起选举的线程担任,其主要功能是对投票结果进展统计,并选出推荐的Server;2 .选举线程首先向所有Server发起一次询问(包括自己);3 .选举线程收到回复后,验证是否是自己发起的询问(验证zxid是否一致),然后

4、获取对方的id(myid),并存储到当前询问对象列表中,最后获取对方提议的leader相关信息(id,zxid),并将这些信息存储到当次选举的投票记录表中;4. 收到所有Server回复以后,就计算出zxid最大的那个Server,并将这个Server相关信息设置成下一次要投票的Server;5. 线程将当前zxid最大的Server设置为当前Server要推荐的Leader,如果此时获胜的Server获得n/2 + 1的Server票数, 设置当前推荐的leader为获胜的Server,将根据获胜的Server相关信息设置自己的状态,否那么,继续这个过程,直到leader被选举出来。通过流程

5、分析我们可以得出:要使Leader获得多数Server的支持,那么Server总数必须是奇数2n+1,且存活的Server的数目不得少于n+1.每个Server启动后都会重复以上流程。在恢复模式下,如果是刚从崩溃状态恢复的或者刚启动的server还会从磁盘快照中恢复数据和会话信息,zk会记录事务日志并定期进展快照,方便在恢复时进展状态恢复。选主的具体流程图如下所示:fast paxos流程是在选举过程中,某Server首先向所有Server提议自己要成为leader,当其它Server收到提议以后,解决epoch和zxid的冲突,并承受对方的提议,然后向对方发送承受提议完成的消息,重复这个流程

6、,最后一定能选举出Leader。其流程图如下所示:2.2 同步流程选完leader以后,zk就进入状态同步过程。1. leader等待server连接;2 .Follower连接leader,将最大的zxid发送给leader;3 .Leader根据follower的zxid确定同步点;4 .完成同步后通知follower 已经成为uptodate状态;5 .Follower收到uptodate消息后,又可以重新承受client的请求进展效劳了。流程图如下所示:2.3 工作流程Leader主要有三个功能:1 .恢复数据;2 .维持与Learner的心跳,接收Learner请求并判断Learne

7、r的请求消息类型;3 .Learner的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据不同的消息类型,进展不同的处理。PING消息是指Learner的心跳信息;REQUEST消息是Follower发送的提议信息,包括写请求与同步请求;ACK消息是Follower的对提议的回复,超过半数的Follower通过,那么commit该提议;REVALIDATE消息是用来延长SESSION有效时间。Leader的工作流程简图如下所示,在实际实现中,流程要比下列图复杂得多,启动了三个线程来实现功能。Follower主要有四个功能:1. 向Leader发送请求PI

8、NG消息、REQUEST消息、ACK消息、REVALIDATE消息;2 .接收Leader消息并进展处理;3 .接收Client的请求,如果为写请求,发送给Leader进展投票;4 .返回Client结果。Follower的消息循环处理如下几种来自Leader的消息:1 .PING消息: 心跳消息;2 .PROPOSAL消息:Leader发起的提案,要求Follower投票;3 .COMMIT消息:效劳器端最新一次提案的信息;4 .UPTODATE消息:说明同步完成;5 .REVALIDATE消息:根据Leader的REVALIDATE结果,关闭待revalidate的session还是允许其

9、承受消息;6 .SYNC消息:返回SYNC结果到客户端,这个消息最初由客户端发起,用来强制得到最新的更新。Follower的工作流程简图如下所示,在实际实现中,Follower是通过5个线程来实现功能的。对于observer的流程不再表达,observer流程和Follower的唯一不同的地方就是observer不会参加leader发起的投票。主流应用场景:Zookeeper的主流应用场景实现思路除去官方示例(1)配置管理集中式的配置管理在应用集群中是非常常见的,一般商业公司部都会实现一套集中的配置管理中心,应对不同的应用集群对于共享各自配置的需求,并且在配置变更时能够通知到集群中的每一个机器

10、。Zookeeper很容易实现这种集中式的配置管理,比方将APP1的所有配置配置到/APP1 znode下,APP1所有机器一启动就对/APP1这个节点进展监控(zk.exist(/APP1,true),并且实现回调方法Watcher,那么在zookeeper上/APP1 znode节点下数据发生变化的时候,每个机器都会收到通知,Watcher方法将会被执行,那么应用再取下数据即可(zk.getData(,false,null);以上这个例子只是简单的粗颗粒度配置监控,细颗粒度的数据可以进展分层级监控,这一切都是可以设计和控制的。(2)集群管理应用集群中,我们常常需要让每一个机器知道集群中或依

11、赖的其他某一个集群哪些机器是活着的,并且在集群机器因为宕机,网络断链等原因能够不在人工介入的情况下迅速通知到每一个机器。Zookeeper同样很容易实现这个功能,比方我在zookeeper效劳器端有一个znode叫/APP1SERVERS,那么集群中每一个机器启动的时候都去这个节点下创立一个EPHEMERAL类型的节点,比方server1创立/APP1SERVERS/SERVER1(可以使用ip,保证不重复),server2创立/APP1SERVERS/SERVER2,然后SERVER1和SERVER2都watch /APP1SERVERS这个父节点,那么也就是这个父节点下数据或者子节点变化都

12、会通知对该节点进展watch的客户端。因为EPHEMERAL类型节点有一个很重要的特性,就是客户端和效劳器端连接断掉或者session过期就会使节点消失,那么在某一个机器挂掉或者断链的时候,其对应的节点就会消失,然后集群中所有对/APP1SERVERS进展watch的客户端都会收到通知,然后取得最新列表即可。另外有一个应用场景就是集群选master,一旦master挂掉能够马上能从slave中选出一个master,实现步骤和前者一样,只是机器在启动的时候在APP1SERVERS创立的节点类型变为EPHEMERAL_SEQUENTIAL类型,这样每个节点会自动被编号我们默认规定编号最小的为mas

13、ter,所以当我们对/APP1SERVERS节点做监控的时候,得到效劳器列表,只要所有集群机器逻辑认为最小编号节点为master,那么master就被选出,而这个master宕机的时候,相应的znode会消失,然后新的效劳器列表就被推送到客户端,然后每个节点逻辑认为最小编号节点为master,这样就做到动态master选举。Zookeeper 监视Watches 简介Zookeeper C API 的声明和描述在 include/zookeeper.h 中可以找到,另外大局部的 Zookeeper C API 常量、结构体声明也在 zookeeper.h 中,如果如果你在使用 C API 是遇

14、到不明白的地方,最好看看 zookeeper.h,或者自己使用 doxygen 生成 Zookeeper C API 的帮助文档。Zookeeper 中最有特色且最不容易理解的是监视(Watches)。Zookeeper 所有的读操作getData(),getChildren(), 和exists()都 可以设置监视(watch),监视事件可以理解为一次性的触发器, 官方定义如下: a watch event is one-time trigger, sent to the client that set the watch, which occurs when the data for wh

15、ich the watch was set changes。对此需要作出如下理解:一次性触发One-time trigger当设置监视的数据发生改变时,该监视事件会被发送到客户端,例如,如果客户端调用了 getData(/znode1, true) 并且稍后 /znode1 节点上的数据发生了改变或者被删除了,客户端将会获取到 /znode1 发生变化的监视事件,而如果 /znode1 再一次发生了变化,除非客户端再次对 /znode1 设置监视,否那么客户端不会收到事件通知。发送至客户端Sent to the clientZookeeper 客户端和效劳端是通过 socket 进展通信的,由

16、于网络存在故障,所以监视事件很有可能不会成功地到达客户端,监视事件是异步发送至监视者的,Zookeeper 本身提供了保序性(ordering guarantee):即客户端只有首先看到了监视事件后,才会感知到它所设置监视的 znode 发生了变化(a client will never see a change for which it has set a watch until it first sees the watch event). 网络延迟或者其他因素可能导致不同的客户端在不同的时刻感知某一监视事件,但是不同的客户端所看到的一切具有一致的顺序。被设置 watch 的数据The d

17、ata for which the watch was set这意味着 znode 节点本身具有不同的改变方式。你也可以想象 Zookeeper 维护了两条监视链表:数据监视和子节点监视(data watches and child watches) getData() and exists() 设置数据监视,getChildren() 设置子节点监视。 或者,你也可以想象 Zookeeper 设置的不同监视返回不同的数据,getData() 和 exists() 返回 znode 节点的相关信息,而 getChildren() 返回子节点列表。因此, setData() 会触发设置在某一节点

18、上所设置的数据监视(假定数据设置成功),而一次成功的 create() 操作那么会出发当前节点上所设置的数据监视以与父节点的子节点监视。一次成功的 delete() 操作将会触发当前节点的数据监视和子节点监视事件,同时也会触发该节点父节点的child watch。Zookeeper 中的监视是轻量级的,因此容易设置、维护和分发。当客户端与 Zookeeper 效劳器端失去联系时,客户端并不会收到监视事件的通知,只有当客户端重新连接后,假设在必要的情况下,以前注册的监视会重新被注册并触发,对于开发人员来说 这通常是透明的。只有一种情况会导致监视事件的丧失,即:通过 exists() 设置了某个

19、znode 节点的监视,但是如果某个客户端在此 znode 节点被创立和删除的时间间隔与 zookeeper 效劳器失去了联系,该客户端即使稍后重新连接 zookeeper效劳器后也得不到事件通知。Zookeeper C API 常量与局部结构(struct)介绍与 ACL 相关的结构与常量:struct Id 结构为:structIdchar*scheme;id;struct ACL 结构为:ACLint32_tperms;struct ACL_vector 结构为:ACL_vectorcount;*data;与 znode 访问权限有关的常量constintZOO_PERM_READ; /

20、允许客户端读取 znode 节点的值以与子节点列表。ZOO_PERM_WRITE;/ 允许客户端设置 znode 节点的值。ZOO_PERM_CREATE; /允许客户端在该 znode 节点下创立子节点。ZOO_PERM_DELETE;/允许客户端删除子节点。ZOO_PERM_ADMIN; /允许客户端执行 set_acl()。ZOO_PERM_ALL;/允许客户端执行所有操作,等价与上述所有标志的或(OR) 。与 ACL IDs 相关的常量Id ZOO_ANYONE_ID_UNSAFE; /(world,anyone)Id ZOO_AUTH_IDS;/ (auth,)三种标准的 ACL1、

21、structACL_vectorZOO_OPEN_ACL_UNSAFE;/(ZOO_PERM_ALL,ZOO_ANYONE_ID_UNSAFE)2、structACL_vector ZOO_READ_ACL_UNSAFE;/ (ZOO_PERM_READ, ZOO_ANYONE_ID_UNSAFE)3、structACL_vector ZOO_CREATOR_ALL_ACL; /(ZOO_PERM_ALL,ZOO_AUTH_IDS)与 Interest 相关的常量:ZOOKEEPER_WRITE,ZOOKEEPER_READ这 两个常量用于标识感兴趣的事件并通知 zookeeper 发生了哪些

22、事件。Interest 常量可以进展组合或OR来标识多种兴趣(multiple interests: write, read),这两个常量一般用于 zookeeper_interest() 和 zookeeper_process()两个函数中。与节点创立相关的常量:ZOO_EPHEMERAL,ZOO_SEQUENCEzoo_create 函数标志,ZOO_EPHEMERAL用来标识创立临时节点,ZOO_SEQUENCE用来标识节点命名具有递增的后缀序号(一般是节点名称后填充 10 位字符的序号,如 /xyz0000000000, /xyz0000000001, /xyz0000000002,

23、.),同样地,ZOO_EPHEMERAL,ZOO_SEQUENCE可以组合。与连接状态Stat 相关的常量以下常量均与 Zookeeper 连接状态有关,他们通常用作监视器回调函数的参数。ZOOAPI const intZOO_EXPIRED_SESSION_STATEZOO_AUTH_FAILED_STATEZOO_CONNECTING_STATEZOO_ASSOCIATING_STATEZOO_CONNECTED_STATE与监视类型(Watch Types)相关的常量以下常量标识监视事件的类型,他们通常用作监视器回调函数的第一个参数。ZOO_CREATED_EVENT; / 节点被创立(

24、此前该节点不存在),通过 zoo_exists() 设置监视。ZOO_DELETED_EVENT; / 节点被删除,通过 zoo_exists() 和 zoo_get() 设置监视。ZOO_CHANGED_EVENT; / 节点发生变化,通过 zoo_exists() 和 zoo_get() 设置监视。ZOO_CHILD_EVENT; / 子节点事件,通过zoo_get_children() 和 zoo_get_children2()设置监视。ZOO_SESSION_EVENT; / 会话丧失ZOO_NOTWATCHING_EVENT; / 监视被移除。Zookeeper C API 错误码介

25、绍ZOO_ERRORSZOK正常返回ZSYSTEMERROR系统或效劳器端错误(System and server-side errors),效劳器不会抛出该错误,该错误也只是用来标识错误围的,即大于该错误值,且小于 ZAPIERROR 都是系统错误。ZRUNTIMEINCONSISTENCY运行时非一致性错误。ZDATAINCONSISTENCY数据非一致性错误。ZCONNECTIONLOSSZookeeper 客户端与效劳器端失去连接ZMARSHALLINGERROR在marshalling和unmarshalling数据时出现错误(Error while marshalling or u

26、nmarshalling data)ZUNIMPLEMENTED该操作未实现(Operation is unimplemented)ZOPERATIONTIMEOUT该操作超时(Operation timeout)ZBADARGUMENTS非法参数错误(Invalid arguments)ZINVALIDSTATE非法句柄状态(Invliad zhandle state)ZAPIERRORAPI 错误(API errors),效劳器不会抛出该错误,该错误也只是用来标识错误围的,错误值大于该值的标识 API 错误,而小于该值的标识 ZSYSTEMERROR。ZNONODE节点不存在(Node d

27、oes not exist)ZNOAUTH没有经过授权(Not authenticated)ZBADVERSION版本冲突(Version conflict)ZNOCHILDRENFOREPHEMERALS临时节点不能拥有子节点(Ephemeral nodes may not have children)ZNODEEXISTS节点已经存在(The node already exists)ZNOTEMPTY该节点具有自身的子节点(The node has children)ZSESSIONEXPIRED会话过期(The session has been expired by the server

28、)ZINVALIDCALLBACK非法的回调函数(Invalid callback specified)ZINVALIDACL非法的ACL(Invalid ACL specified)ZAUTHFAILED客户端授权失败(Client authentication failed)ZCLOSINGZookeeper 连接关闭(ZooKeeper is closing)ZNOTHING并非错误,客户端不需要处理效劳器的响应(not error, no server responses to process)ZSESSIONMOVED会话转移至其他效劳器,所以操作被忽略(session moved to another server, so operation is ignored)Watch事件类型:ZOO_CREATED_EVENT:节点创立事件,需要watch一个不存在的节点,当节点被创立时触发,此watch通过zoo_exists()设置ZOO_DELETED_EVENT:节点

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1