1.zookeeper介绍
(1)zookeeper简介:
Zookeeper是一个分布式的,开放源代码的分布式应用程序协调服务,是Google的chubby一个开源的实现。
它提供了简单原始的功能,分布式应用可以基于它实现更高的服务,比如分布式同步,配置管理,集群管理,
命名管理,队列管理。它被设计为易与编程,使用文件系统目录树作为数据模型。服务端跑在 java 上,提供 java 和 C 的客户端 API。
zookeeper是集群的管理者,监视着集群中各个节点的状态,根据节点提供的反馈进行一步合理操作。最终,将简单易用的接口
和功能稳定,性能高效的系统提供给用户。
官网地址:
http://ZooKeeper.apache.org/
官网快速开始地址:
http://ZooKeeper.apache.org/doc/trunk/ZooKeeperStarted.html
官网 API 地址:
http://ZooKeeper.apache.org/doc/r3.4.10/api/index.html
2.zookeeper的相关功能
(1)文件系统:
ZooKeeper 的命名空间就是 ZooKeeper 应用的文件系统,它和 linux 的文件系统很像,也是树状,这样就可以确定每个路径都是唯一的,
对于命名空间的操作必须都是绝对路径操作。与Linux文件系统不同的是,Linux文件系统 有目录和文件的区别,而ZooKeeper统一叫znode,
一个znode节点可以包含子znode,同时也可以包含数据。
znode 即是文件夹又是文件的概念,所以在 ZooKeeper 这里面就不叫文件文 件也不叫文件夹,叫znode,每个znode有唯一的路径标识,
既能存储数据,也能创建子znode。但是znode只适合存储非常小的数据,不能超过1M,最好都小于1K。
zookeeper的文件系统的特点:
-
zk的文件系统和Linux的文件系统目录结构一样,从”“/开始
-
zk的访问路径只有绝对路径,没有相对路径。
-
zk中没有文件和目录的概念,只有znode节点,Znode既有文件的功能,又有目录的功能
(2)znode介绍:
znode在类型上分为两种:短暂的(断开时删除)、持久的(断开时保留)。但是znode有4形式的节点表现:
persistent | 持久化znode节点,一旦创建这个znode点存储的数据不会主动消失,除非客户端主动delete |
Persistent_sequential | 自动增加顺序编号的znode节点,比如ClientA 去 zk service 上建 立一个 znode 名字叫做/zk/conf,指定了 这种类型的节点后 zk 会 创 建 /zk/conf0000000000 , ClientB 再 去 创 建 就 是 创 建 /zk/conf0000000001, ClientC 是创建/zk/conf0000000002,以后任 意 Client 来创建这个 znode 都会得到一个比当前 zk 命名空间最 大 znode 编号+1 的 znode,也就说任意一个 Client 去创建 znode 都是保证得到的 znode 是递增的,而且是 唯一的。(原子性原则) |
Ephemral | 临时znode节点,client连接到zkservice的时候会建立一个session,之后用这个zk连接实例创建该类型的znode ,一旦client关闭了zk的连接,服务器就会清除 session,然后这个 session 建立的 znode 节点都会从命名空间 消失。 |
Ephemral_ sequential | 临时自动编号设置,znode节点编号会自动增加,但是会随着session消失而消失。 |
zookeeper的znode的相关特点:
-
创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护。(无论创建的是否是有编号节点,都为顺序递增)
-
EPHEMERAL 类型的节点不能有子节点
-
zk的znode的分类:临时节点(EPHEMERAL)、永久节点(persistent)、有编号节点(Persistent_sequential)、临时有编号(Ephemral_ sequential)
-
对于zk来说,它的znode中储存的数据不能超过1M,最好不要超过1KB,如果数据量比较大,很难保证数据的一致性
-
对于zk来说,有几个节点数据就会存储几份
3.zookeeper的监听机制
(1)监听机制介绍:
客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、节点删除、子目录节 点增加删除)时,zookeeper会通知客户端。
监听机制保证zookeeper保存的任何的数据的任何改变都能快速的相应到监听了该节点的应用程序。监听器的工作机制,其实是在客户端会专门
创建一个监听线程,在本机的一个端口上等待zk集群发送过来的事件。
(2)监听的触发
Znode的创建—-nodeCreated
Znode 被删除—nodeDelete
Znode的数据变化—nodedatachanged
Znode的子节点的变化—-nodeChildrenchange
注意:监听只生效一次。(可以使用循环监听取,去实现一直监听)。
(3)监听机制的工作原理
解释: ZooKeeper 的 Watcher 机制主要包括:客户端线程、客户端 WatcherManager、Zookeeper 服务 器三部分。客户端在向zookeeper服务器
注册的同时,会将Watcher对象存储在客户端的WatcherManager当中。当zookeeper服务器触发watcher事件后,会向客户端发送通知,
客户端线程从 WatcherManager 中取出对应的 Watcher 对象来执行回调逻辑。
(4)监听的设置:
相应的触发:
ls–触发—create 、delete(子节点)
get–触发—set
exists–触发— create 、delete(当前节点)
4. Zookeeper的特点
-
最终一致性:client不论连接哪个server,展示给他的都是同一个视图,这是zookeeper最重要特定。
-
可靠性:具有简单、健壮、良好的性能,如果消息M被一台服务器接收,那么它将被 所有的服务器接受。
-
实时性:ZooKeeper 保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者 服务器失效的信息。但由于网络延时等原因,
ZooKeeper 不能保证两个客户端能同时得 到刚更新的数据,如果需要最新数据,应该在读数据之前调用 sync()接口。
-
等待无关:慢的或者失效的 client 不得干预快速的 client 的请求,使得每个 client 都能有效的等待。
-
原子性:更新只能成功或者失败,没有中间状态。
-
顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息 a 在消息 b 前发布,则在所有 Server 上消息 a 都将在消息 b 前被发布;
偏序是指如果一个消息 b 在 消息 a 后被同一个发送者发布,a 必将排在 b 前面。
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/193515.html