分布式协调服务-Zookeeper介绍

什么是Zookeeper?

ZooKeeper是一种用于分布式应用程序的分布式开源协调服务。它公开了一组简单的原语,分布式应用程序可以构建这些原语,以实现更高级别的服务,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。

设计目标

  1. 数据结构简单:ZooKeeper允许分布式进程通过共享的层级命名空间相互协调,该命名空间类似于一个标准的层次型的文件系统:由若干注册了的数据节点构成(用Zookeeper的术语叫znode),这些节点类似于文件和目录。典型的文件系统是基于存储设备的,传统的文件系统主要用于存储功能,然而ZooKepper的数据是保存在内存中的。

  2. 集群(高可用):与它协调的分布式进程一样,ZooKeeper本身也可以在称为集合的一组主机上进行复制。

  3. 有序性:ZooKeeper给每次更新附加一个数字标记,表明ZooKeeper中的事务顺序,后续操作可以利用这个顺序来完成更高层次的抽象功能.

  4. 高性能:ZooKeeper特别适合于以读为主要负荷的场合。ZooKeeper可以运行在数千台机器上,如果大部分操作为读,例如读写比例为10:1,ZooKeeper的效率会很高。

Zookeeper数据结构

zookeeper数据结构.png

1、层次化的目录结构,命名符合常规文件系统规范(类似文件系统)如上图:
2、每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识
3、节点Znode可以包含数据和子节点(但是EPHEMERAL类型的节点不能有子节点)

节点类型

Znode分为两种类型:

  1. ephemeral(短暂):客户端断开连接zk连接后,删除ephemeral类型节点
  2. persistent (持久):客户端断开连接zk连接后,不删除persistent类型节点
zookeeper的具体四种类型的节点
  1. PERSISTENT:持久化节点
  2. EPHEMERAL :临时节点,客户端断开连接,这类节点就会被自动删除
  3. PERSISTENT_SEQUENTIAL :顺序自动编号持久化节点,这种节点会根据当前已存在的节点数自动加 1
  4. EPHEMERAL_SEQUENTIAL:临时自动编号节点,这种节点会根据当前已存在的节点数自动加 1

创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护 。在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序。


znode顺序号.png

ZooKeeper的保证

ZooKeeper运行非常快而且简单。虽然它的目标是构建更加复杂服务(例如同步)的基础,但它提供了一些保证,如下:

  1. 顺序一致性:来自于客户端的更新,根据发送的先后被顺序实施。
  2. 唯一的系统映像:尽管客户端连接到不同的服务器,但它们看到的一个唯一(一致性)的系统服务,client无论连接到哪个server,数据视图都是一致的。
  3. 可靠性:一旦实施了一个更新,就会一直保持那种状态,直到客户端再次更新它,同时数据更新原子性,一次数据更新要么成功,要么失败。
  4. 及时性:在一个确定的时间内,客户端看到的系统状态是最新的。

ZooKeeper特点

  1. 最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能。
  2. 可靠性:具有简单、健壮、良好的性能,如果消息m被一台服务器接受,那么它将被所有的服务器接受。
  3. 实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。 但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口!!
  4. 等待无关(wait-free):慢的或者失效的client,不得干预快速的client的请求,使得每个client都能有效的等待。
  5. 原子性:更新只能成功或者失败,没有中间状态。
  6. 顺序性:包括全局有序和偏序两种:
    全局有序:是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布;
    偏序:是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面;

你可能感兴趣的:(分布式协调服务-Zookeeper介绍)