什么是Zookeeper?
ZooKeeper是一种用于分布式应用程序的分布式开源协调服务。它公开了一组简单的原语,分布式应用程序可以构建这些原语,以实现更高级别的服务,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
设计目标
-
数据结构简单:ZooKeeper允许分布式进程通过共享的层级命名空间相互协调,该命名空间类似于一个标准的层次型的文件系统:由若干注册了的数据节点构成(用Zookeeper的术语叫znode),这些节点类似于文件和目录。典型的文件系统是基于存储设备的,传统的文件系统主要用于存储功能,然而ZooKepper的数据是保存在内存中的。
-
集群(高可用):与它协调的分布式进程一样,ZooKeeper本身也可以在称为集合的一组主机上进行复制。
-
有序性:ZooKeeper给每次更新附加一个数字标记,表明ZooKeeper中的事务顺序,后续操作可以利用这个顺序来完成更高层次的抽象功能.
-
高性能:ZooKeeper特别适合于以读为主要负荷的场合。ZooKeeper可以运行在数千台机器上,如果大部分操作为读,例如读写比例为10:1,ZooKeeper的效率会很高。
Zookeeper数据结构
![](https://img.haomeiwen.com/i16466161/d752bb067ff2af2e.png)
1、层次化的目录结构,命名符合常规文件系统规范(类似文件系统)如上图:
2、每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识
3、节点Znode可以包含数据和子节点(但是EPHEMERAL类型的节点不能有子节点)
节点类型
Znode分为两种类型:
- ephemeral(短暂):客户端断开连接zk连接后,删除ephemeral类型节点
- persistent (持久):客户端断开连接zk连接后,不删除persistent类型节点
zookeeper的具体四种类型的节点
- PERSISTENT:持久化节点
- EPHEMERAL :临时节点,客户端断开连接,这类节点就会被自动删除
- PERSISTENT_SEQUENTIAL :顺序自动编号持久化节点,这种节点会根据当前已存在的节点数自动加 1
- EPHEMERAL_SEQUENTIAL:临时自动编号节点,这种节点会根据当前已存在的节点数自动加 1
创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护 。在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序。
![](https://img.haomeiwen.com/i16466161/df1de9cc1e8fd5c9.png)
ZooKeeper的保证
ZooKeeper运行非常快而且简单。虽然它的目标是构建更加复杂服务(例如同步)的基础,但它提供了一些保证,如下:
- 顺序一致性:来自于客户端的更新,根据发送的先后被顺序实施。
- 唯一的系统映像:尽管客户端连接到不同的服务器,但它们看到的一个唯一(一致性)的系统服务,client无论连接到哪个server,数据视图都是一致的。
- 可靠性:一旦实施了一个更新,就会一直保持那种状态,直到客户端再次更新它,同时数据更新原子性,一次数据更新要么成功,要么失败。
- 及时性:在一个确定的时间内,客户端看到的系统状态是最新的。
ZooKeeper特点
- 最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能。
- 可靠性:具有简单、健壮、良好的性能,如果消息m被一台服务器接受,那么它将被所有的服务器接受。
- 实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。 但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口!!
- 等待无关(wait-free):慢的或者失效的client,不得干预快速的client的请求,使得每个client都能有效的等待。
- 原子性:更新只能成功或者失败,没有中间状态。
- 顺序性:包括全局有序和偏序两种:
全局有序:是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布;
偏序:是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面;
网友评论