其实网络上关于Zookeeper的文章多如牛毛,起初,我也只是想写个学习笔记,作个记录。可是既然动笔了,我想就不单是作个笔记,而是但愿写一些对读者有帮助的内容。node
Zookeeper做为一个流行的分布式协调服务,要了解他,咱们首先问本身两个问题,Why and How?咱们为何要用Zookeeper?Zookeeper是怎么工做的?web
首先,咱们为何要用到Zookeeper?咱们能够把软件系统类比为一个公司,当公司规模小的时候,老板就能决定全部的事情;数据库
但当公司规模发展壮大后,老板一我的管理公司有些吃力,但又不放心把全部权力交给另一我的,这时老板想了个办法,成立了一个CEO团队,团队采用民主化运做进行集体决策。服务器
ECO团队的主要任务:网络
相似的,Zookeeper做为分布式协调服务,他主要经过两个手段对外提供服务,即服务目录 + 通知。数据结构
Zookeeper的应用场景包括:数据发布/订阅、命名服务、配置中心、分布式锁、集群管理、选主与服务发现等等。app
先了解下Zookeeper里的一些基本概念。分布式
Zookeeper类文件系统中的每一个节点称为znode,znode里包含了节点的自身信息和业务数据,根据节点属性,能够分为2大类,分别是持久化节点和临时节点,每类下有分为普通节点和按顺序编号节点,分别描述以下:性能
PERSISTENT:持久化目录节点学习
PERSISTENT_SEQUENTIAL:持久化顺序编号目录节点
EPHEMERAL:临时目录节点
EPHEMERAL_SEQUENTIAL:临时顺序编号目录节点
客户端注册监听它关心的节点,当节点发生变化(数据改变、删除、子节点增长/删除)时,监听器会被触发,并将事件信息推送到客户端。
Zookeeper自己做为一个分布式服务,有若干节点组成集群对外提供服务,集群节点包括Leader、Follower、Observer 3种角色。
Zookeeper客户端经过TCP长链接链接到服务集群,会话(Session)从第一次链接开始就已经创建,以后经过心跳检测机制来保持有效的会话状态。客户端经过这个链接发送请求并接收响应,接收到Watch事件的通知。
当因为网络故障或者客户端主动断开等缘由,致使链接断开,此时只要在会话超时(Session TimeOut)时间以内从新创建链接,则以前建立的会话依然有效。
对于每一个事务,Zookeeper都会分配一个全局惟一的事务ID(ZXID)。ZXID由64位组成。其中高32位为纪元号(Epoch:集群每选举一次Leader,纪元号加1);低32为本纪元内的事务序号(事务序号在每一个纪元会清零)
所谓民主选举,是指当集群中超过一半的节点赞成一个事务时,即表示事务执行成功(不包括Observer)。Leader提交一个提案时,只要过半数节点反馈ACK,就职务提案被集群接受了,Leader不须要等待剩余节点反馈ACK,直接广播Commit消息;Leader选举和数据同步时,亦如此。
Zookeeper收到客户端的一个写请求,称为提案(Proposal),把一个提案提交到集群并应用生效的过程,叫事务
下面咱们再来看下,做为一个CEO团队,它是如何运做的。做为一个优秀的管理团队,他的运做要知足CAP原则,即:
团队经过如下几条规则确保CAP:
Zookeeper的工做原理,和以上相似。主要依赖ZAB(ZooKeeper Atomic Broadcast)一种支持崩溃恢复的原子广播协议来完成。
一致性保证
ZAB协议有两种工做模式,分别是广播模式和恢复模式。
广播模式主要用来实现集群节点间数据的同步,每一个同步操做定义为一个事务,使用两阶段提交协议完成事务提交,以客户端写数据为例进行说明事务操做:
根据全局有序的规则,Follower提交事务时,须要经过历史队列,确认此提案的ZXID是不是最小的,最小才提交,否则就等待其余ZXID更小的事务先提交
当整个集群在启动时,或者Leader失联后,ZAB协议就会进入恢复模式,恢复模式的流程以下:
Leader选举是集群正常运行的前提,当集群启动或Leader失联后,就会进入Leader选举流程。
选举期间,集群间经过选票(Vote) 进行进行互相选举,选票主要包含两个信息:
选举流程:
数据同步流程,是要以Leader数据为基础,让集群数据达到一致状态。
遗留问题
根据ZAB协议,Leader已经Commit的事务,从新选主后,要能在新集群生效。可是有一种状况,对于一个提案Px,原Leader向集群广播提案并收到了过半Follower的ACK,此时Leader会自身先执行Commit再向集群广播Commit,但还将来得及向集群广播Commit消息,Leader就挂了。
此后经过选举,原Follower成为了新Leader,新Leader中Px确定是未Commit的,系统如何保证Px生效呢?这个还没看研究源码,有知道请告知下!!
数据的发布/订阅系统,一般也用做配置中心。在分布式系统中,你可能有成千上万个服务节点,若是想要对全部服务的某项配置进行更改,因为数据节点过多,你不可逐台进行修改,而应该在设计时采用统一的配置中心。以后发布者只须要将新的配置发送到配置中心,全部服务节点便可自动下载并进行更新,从而实现配置的集中管理和动态更新。
Zookeeper经过Watcher机制能够实现数据的发布和订阅。分布式系统的全部的服务节点能够对某个ZNode注册监听,以后只须要将新的配置写入该ZNode,全部服务节点都会收到该事件。
在分布式系统中,一般须要一个全局惟一的名字,如生成全局惟一的订单号等,Zookeeper能够经过顺序节点的特性来生成全局惟一ID,从而能够对分布式系统提供命名服务。
分布式系统一个重要的模式就是主从模式(Master/Salves),Zookeeper能够用于该模式下的Matser选举。可让全部服务节点去竞争性地建立同一个ZNode,因为Zookeeper不能有路径相同的ZNode,必然只有一个服务节点可以建立成功,这样该服务节点就能够成为Master节点。
能够经过Zookeeper的临时节点和Watcher机制来实现分布式锁,这里以排它锁为例进行说明:
分布式系统的全部服务节点能够竞争性地去建立同一个临时ZNode,因为Zookeeper不能有路径相同的ZNode,必然只有一个服务节点可以建立成功,此时能够认为该节点得到了锁。其余没有得到锁的服务节点经过在该ZNode上注册监听,从而当锁释放时再去竞争得到锁。锁的释放状况有如下两种:
当锁被释放后,其余服务节点则再次去竞争性地进行建立,但每次都只有一个服务节点可以获取到锁,这就是排他锁。
Zookeeper还能解决大多数分布式系统中的问题:
如能够经过建立临时节点来创建心跳检测机制。若是分布式系统的某个服务节点宕机了,则其持有的会话会超时,此时该临时节点会被删除,相应的监听事件就会被触发。
参考材料