Zookeeper是⼀个开源的分布式协调服务,其设计⽬标是将那些复杂的且容易出错的分布式⼀致性服务封装起来,构成⼀个⾼效可靠的原语集,并以⼀些简单的接⼝提供给⽤户使⽤。node
zookeeper是⼀个典型的分布式数据⼀致性的解决⽅案,分布式应⽤程序能够基于它实现诸如数据订阅/发布、负载均衡、命名服务、集群管理、分布式锁和分布式队列等功能。安全
Zookeeper
中引入了了 Leader
、 Follower
、 Observer
三种⻆⾊。 Leader
服务器为客户端提供读和写服务,除 Leader
外,其余机器包括 Follower
和 Observer
都能提供读服务。惟⼀的区别在于 Observer
不参与 Leader
选举过程, 不参与写操做的过半写成功策略,所以 Observer
能够在不影响写性能的状况下提高集群的性能。服务器
指客户端会话, ⼀个客户端链接是指客户端和服务端之间的⼀个TCP⻓链接session
ZooKeeper将全部数据存储在内存中,数据模型是⼀棵树 ( ZNode Tree
),由斜杠( /
)进⾏分割的路径,就是⼀个 Znode
,例如 /app/path1
。每一个 ZNode
上都 会保存⾃⼰的数据内容,同时还会保存⼀系列属性信息。数据结构
Zookeeper
会为每一个 Znode
维护 ⼀个叫做 Stat
的数据结构, Stat
记录了这个 ZNode
的三个数据版本,分别是 version
(当前 ZNode
的版 本)、 cversion
(当前 ZNode
⼦节点的版本)、 aversion
(当前 ZNode
的 ACL
版本)。app
Wathcer(事件监听器),是Zookeeper中⼀个很重要的特性,Zookeeper容许⽤户在指定节点上注册 ⼀些Watcher,而且在⼀些特定事件触发的时候,Zookeeper服务端会将事件通知到感兴趣的客户端, 该机制是Zookeeper实现分布式协调服务的重要特性负载均衡
Zookeeper采⽤ACL(Access Control Lists)策略来进⾏权限控制,其定义了以下五种权限:分布式
其中须要注意的是,
CREATE
和DELETE
这两种权限都是针对⼦节点的权限控制性能
Leader服务器是Zookeeper集群工做的核心,主要工做有如下两个:编码
ollower服务器是Zookeeper集群状态中的跟随者,其主要⼯做有如下三个:
处理客户端⾮事务性请求(读取数据),转发事务请求给Leader服务器。
参与事务请求Proposal的投票。
参与Leader选举投票。
Observer是ZooKeeper⾃3.3.0版本开始引⼊的⼀个全新的服务器⻆⾊。从字⾯意思看,该服务器充当 了⼀个观察者的⻆⾊——其观察ZooKeeper集群的最新状态变化并将这些状态变动同步过来。
Observer服务器在⼯做原理上和Follower基本是⼀致的,对于⾮事务请求,均可以进⾏独⽴的处理,⽽ 对于事务请求,则会转发给Leader服务器进⾏处理。 和Follower惟⼀的区别在于,Observer不参与任何形式的投票 ,包括事务请求Proposal的投票和Leader选举投票。简单地讲,Observer服务器只提供 ⾮事务服务,一般⽤于在不影响集群事务处理能⼒的前提下提高集群的⾮事务处理能⼒。
Zookeeper
中全部信息都被保存在一个个数据节点上,这些节点被称为 Znode
。 Znode
是 Zookeeper
中最小的存储单元,在 Znode
上又能够挂 Znode
,这样一层一层下去就造成了 Znode 树,称为 Znode Tree
。
持久节点: 是Zookeeper中最常⻅的⼀种节点类型,所谓持久节点,就是指节点被建立后会⼀直存在务器,直到删除操做主动清除。
持久顺序节点: 就是有顺序的持久节点,节点特性和持久节点是⼀样的,只是额外特性表如今顺序上。 顺序特性实质是在建立节点的时候,会在节点名后⾯加上⼀个数字后缀,来表示其顺序。
临时节点: 就是会被⾃动清理掉的节点,它的⽣命周期和客户端会话绑在⼀起,客户端会话结束,节点会被删除掉。与持久性节点不一样的是,临时节点不能建立⼦节点。
临时顺序节点: 就是有顺序的临时节点,和持久顺序节点相同,在其建立的时候会在名字后⾯加上数字后缀。
整个 ZNode 节点内容包括两部分:节点数据内容和节点状态信息。图中【持久节点顺序】 是数据内容,其余的属于状态信息。
Zookeeper使⽤Watcher机制实现分布式数据的发布/订阅功能。⼀个典型的发布/订阅模型系统定义了⼀种 ⼀对多的订阅关系,可以让多个订阅者同时监听某⼀个主题对象,当这个主题对象⾃身状态变化时,会通知全部订阅者,使它们可以作出相应的处理。
Zookeeper中引入了Watcher机制实现这种分布式的通知功能。Zookeeper容许客户端向服务端注册一个Watcher监听,当服务端的一些指定事件触发了这个Watcher,那么会向客户端发布一个事件通知来实现分布式的通知功能。
Zookeeper
的 Watcher
机制主要包括客户端线程、客户端WatcherManager、Zookeeper服务器三部分。
具体⼯做流程为:
Zookeeper
服务器注册的,同时会将 Watcher
对象存储在客户端的 WatcherManager
当中。Zookeeper
服务器触发 Watcher
事件后,会向客户端发送通知。WatcherManager
中取出对应的 Watcher
对象来执⾏回调逻辑。从三个⽅⾯来理解ACL机制:权限模式(Scheme)、受权对象(ID)、权限 (Permission),一般使⽤"scheme: id : permission"来标识⼀个有效的ACL信息。
IP:经过IP地址粒度来进⾏权限控制,如"ip:192.168.0.110"表示权限控制针对该IP地址, 同时IP模式能够⽀持按照⽹段⽅式进⾏配置,如 "ip:192.168.0.1/24" 表示针对 192.168.0.*
这个⽹段进⾏权限控制。
Digest:是最常⽤的权限控制模式,要更符合咱们对权限控制的认识,其使 ⽤"username:password"形式的权限标识来进⾏权限配置,便于区分不一样应⽤来进⾏权限控制。当咱们经过“username:password”形式配置了权限标识后,Zookeeper会前后对其进⾏SHA-1加密 和BASE64编码。
World:是⼀种最开放的权限控制模式,这种权限控制⽅式⼏乎没有任何做⽤,数据节点的访问权限 对全部⽤户开放,即全部⽤户均可以在不进⾏任何权限校验的状况下操做ZooKeeper上的数据。 另外,World模式也能够看做是⼀种特殊的Digest模式,它只有⼀个权限标识,即“ world:anyone
”。
Super:顾名思义就是超级⽤户的意思,也是⼀种特殊的Digest模式。在Super模式下,超级 ⽤户能够对任意ZooKeeper上的数据节点进⾏任何操做。
受权对象:ID
权限模 式 | 受权对象 |
---|---|
IP | 一般是⼀个IP地址或IP段:例如:192.168.10.110 或192.168.10.1/24 |
Digest | ⾃定义,一般是username:BASE64(SHA-1(username:password))例如: zm:sdfndsllndlksfn7c= |
Digest | 只有⼀个ID :anyone |
Super | 超级⽤户 |
权限就是指那些经过权限检查后能够被容许执⾏的操做。在ZooKeeper中,全部对数据的操做权限分为 如下五⼤类: