Zookeper学习(1)-----基础概念

思维导图:

Zookeper学习(1)-----基础概念

 

引言

    本文是Zookper学习总结系列的开篇,所以,第一章的主要内容是以下三部分:

  • 什么是Zookeper
  • Zookeper的结构体系
  • Zookeper的服务体系

    

一.什么是Zookeper

    Zookeper是为了分布式系统应用提供服务的,所以了解Zookeper之前,我们必须了解什么是分布式系统。

    我们可以这样定义分布式系统:分布式系统是同时跨越多个物理主机,独立运行的多个软件组件所组成的系统。

    从以上定义中可以看出,分布式系统是由多个物理主机所运行的软件所组成的,所以必然会有不同主机间的通讯。一般来说,分布式系统的进程通讯有两种选择:直接进行网络信息交换和读写共享存储,当然共享存储也必然伴随着网络通讯。Zookeper使用共享存储模型来实现应用间的协作,而Zookeper将用于实现进程协作的协作数据称之为元数据。分布式系统中有存在一种得到广泛应用的架构:主-从(master-woker) 架构。主节点负责跟踪监控从节点的状态信息并分派任务。从节点则主要进行任务的执行。

    所以我们这样定义Zookeper:Zookeper是一种实现分布式系统协调服务的工具。它使得开发人员可以实现通用的协作任务,包括选择主节点,管理组内成员关系,管理元数据等等。

 

二.Zookeper结构体系

    Zookeper采用了类似于文件系统的层级树状结构对数据进行管理。被管理的小型数据节点被称为znode。如下图:

Zookeper学习(1)-----基础概念

    在上图中,每个节点功能如下:

  • /master节点:负责管理主节点的相关信息,当此znode没有数据时,表示当前还未选举出主节点
  • /worker节点:此znode作为一个父节点,其管理的所有znode子节点都保存了系统中一个可用从节点的信息
  • /tasks节点:此znode作为一个父节点,其管理的所有znode子节点都保存了已被创建并等待从节点执行的任务的信息
  • /assign节点:此znode作为一个父节点,其管理的所有znode子节点都保存了分配到某一个从节点的任务的信息,主节点每向从节点分配了一个任务,就会在/assign节点下添加一个子节点以保存任务的信息。

    此外,znode节点可能具有一些特殊的属性:

  • 临时节点:当创建此znode的会话超时或关闭时,临时节点会被自动删除
  • 有序节点:有序节点被创建时会在其尾部分配序号,例如创建有序节点/tasks/task-,那么此节点可能会被命名为task-1。

三.服务体系

3.1 监视与通知

    Zookeper通常以远程服务的方式被调用,如果通过轮询的方式获取节点中的内容代价会非常大,也会导致更高的延迟:

Zookeper学习(1)-----基础概念

    为了替换客户端的延迟,Zookeper选择了基于通知的机制:客户端向Zookeper注册需要接收通知的znode,通过对znode设置监视点watch来接收通知。监视点是单次触发操作,即客户端在每次通知后必须设置新的监视点。看下图:

Zookeper学习(1)-----基础概念

 3.2 版本号

    Zookeper通过使用版本号来阻止并行操作的不一致性。

    每个znode都会有一个版本号,每当znode的数据进行变更时,此znode的版本号就会自增。这样当对znode进行修改或删除操作时,就可以通过传入的版本号确认是否并发。

Zookeper学习(1)-----基础概念

3.3 服务模式

    我们可以选择使用一个或者多个Zookeper服务器对外提供服务。

3.3.1 独立模式

    拥有一个单独的服务器提供Zookeper服务,Zookeper状态无法复制。

3.3.2 仲裁模式

    拥有一组Zookeper服务器,称之为Zookeper集合。他们之间可以进行状态复制并同时服务于客户端的请求。但是如果让所有服务器都同步了数据后再服务于客户端的请求延迟将会非常的高。所以,Zookeper在同步了最低必要数量的服务器后就会对客户端进行服务,没有同步数据的服务器则会在接下来进行同步。最低必要数量服务器称为为法定人数。举例,4个服务器最低数量应为3个,7个服务器最低数量应为4个。

Zookeper学习(1)-----基础概念

3.3.3 会话

    客户端可以通过特定的语言套件创建Zookeper句柄,然后他就会通过服务建立会话。客户端初始连接到一个独立服务器或者集合中的某一个服务器。客户端通过TCP协议与服务器连接并进行通讯。当会话无法与当前连接的服务器进行通讯时,就可能会转移到另一台服务器上。