zookeeper(一)

基础概念

分布式协调技术

分布式协调技术,主要用来解决分布式环境中多个线程间的同步控制,让他们有序的访问某种临界资源,防止形成“脏数据”的后果。node

分布式锁

分布式环境中,经过锁机制保证多个进程可以有序的访问的某种临界资源,该锁机制称之为分布式锁。分布式锁是分布式协调技术中的核心内容。数据库

分布式锁的实现

面临的问题

分布式环境中,各机器经过网络实现资源共享和数据互通。问题就出在网络这,由于网络是不可靠的。网络

  • 由于网络的不可靠,服务调用失败并不表示必定是失败的,也多是执行成功了(响应返回时失败了)
  • A、B都去调用服务C,时间上A比B早一点,最后的结果不必定是A的请求先于B到达
  • 为了提高可靠性,分布式环境中会部署多套服务,如何实现多套服务的一致性

分布式锁的实现者

  • Google的Chubby,非开源,Google自家用
  • Apache的zookeeper,开源

zookeeper概述

zookeeper,为分布式应用设计的高可用高性能一致的开源协调服务,提供了一项基本服务:分布式锁服务。因为zookeeper的开源特性,在分布式锁的基础上,提升了:配置维护组服务分布式消息队列分布式通知/协调等。数据结构

备注:异步

  • zk的性能特色,决定了它能够用在大型的、分布式的系统当中
  • 可靠性而言,zk不会由于一个节点的错误而崩溃
  • zk提供严格的序列访问控制,意味着复杂的控制原语能够应用在客户端上

zk的设计实现

zookeeper提供的服务主要是经过:数据结构 + 原语 + 通知机制,三部分实现的:分布式

  • znode,数据结构
  • 原语,关于znode数据结构的操做集
  • 通知机制(Wather)

ZK的数据模型

Znode模型

Znode结构

Zookeeper命名空间中的Znode,兼具文件和目录两种特色。既像文件同样维护着数据、元信息、ACL、时间戳等数据结构,又像目录同样能够做为路径标识的一部分。每个Znode由3部分组成:性能

  1. stat:状态信息,描述该Znode的版本、权限等信息
  2. data:与该Znode关联的数据
  3. children:该znode下的子节点

zk虽然能够关联一些数据,但并无被设计为常规的数据库或者大数据存储,相反的是,它用来管理调度数据,好比分布式应用中的配置文件信息、状态信息、聚集位置等等。这些数据的共性都是很小的数据,一般以KB为大小为单位大数据

数据访问

zk中每一个节点znode存储的数据要被原子性的操做,即读操做将获取节点相关的全部数据,写操做也将替换掉节点的全部数据。线程

此外,每个节点都拥有本身的ACL(访问控制列表),规定了用户的权限,限定了用户对目标节点的可执行操做。设计

节点类型

ZK的节点有两种,分别为临时节点和永久节点。节点的类型在节点建立时即被肯定,而且不能被改变。

  • 临时节点,该节点的生命周期取决于它们的会话。一旦会话结束,临时节点将被自动删除,固然也能够手动删除。虽然每一个临时节点都会绑定到一个客户端会话,但它对其余客户端都是可见的。另外,zk的临时节点不容许拥有子节点。

  • 永久节点,该节点的生命周期不依赖于会话,而且只有在客户端显示执行删除操做的时候,才能被删除

顺序节点

建立Znode时,用户能够请求在zk的路径结尾添加一个递增的计数器。这个计数对于此节点的父节点来讲是惟一的,它的格式为“%10d”(10为数字,没有数值的位数用0填充,例如0000000001)。

观察

客户端能够在节点上设置watcher,称之为监视器。当节点状态发生改变时(znode的增删改操做)将会触发watcher所对应的操做。当Watcher被触发时,zk将会向客户端发送且仅发送一条通知,由于watcher只能被触发一次,以减小网络流量。

zookeeper中的时间记录

zk中有多种记录时间的格式,其中包含如下几个主要属性:

  1. Zxid时间戳 导致Znode节点状态改变的每个操做,都将使节点接收到一个Zxid格式的时间戳,而且该时间戳全局有序。若是Zxid1小于Zxid2,那么Zxid1所对应的事件,早于Zxid2事件发生。

Znode维护着三个Zxid,分别为:cZxidmZxidpZxid * cZxid,建立节点对应的Zxid时间戳 * mZxid,修改节点对应的Zxid时间戳 * pZxid,最新修改的Zxid,貌似与mZxid重合了

实现中,Zxid是一个64位的数字,其中高32位表明epoch,用来标识leader关系是否改变,每一次leader选举,都会有一个新的epoch;低32位是个递增计数

  1. 版本号 对节点的每个操做,都将导致这个节点的版本号增长。每一个节点维护着三个版本号,分别位:
    • version:节点数据版本号
    • cversion:子节点版本号
    • aversion:节点所拥有的ACL版本号

Znode节点属性

zk中每一个Znode节点拥有表示其状态的许多重要属性,以下图所示: 输入图片说明

Zookeeper服务中操做

zk中提供了9个基本操做,如图所示: 输入图片说明

Watch触发器

Watch概述

ZK提供为全部的读操做设置Watch,包括exists()、getChildren()及getData()。Watch事件是一次性的触发器,当Watch的对象状态发生改变时,将会触发此对象上watch事件。Watch事件被异步地发送给客户端,而且ZK为watch机制提供了有序的一致性保证。

相关文章
相关标签/搜索