分布式协调技术,主要用来解决分布式环境中多个线程间的同步控制,让他们有序的访问某种临界资源,防止形成“脏数据”的后果。node
分布式环境中,经过锁机制保证多个进程可以有序的访问的某种临界资源,该锁机制称之为分布式锁。分布式锁是分布式协调技术中的核心内容。数据库
分布式环境中,各机器经过网络实现资源共享和数据互通。问题就出在网络这,由于网络是不可靠的。网络
zookeeper,为分布式应用设计的高可用、高性能且一致的开源协调服务,提供了一项基本服务:分布式锁服务。因为zookeeper的开源特性,在分布式锁的基础上,提升了:配置维护、组服务、分布式消息队列、分布式通知/协调等。数据结构
备注:异步
zookeeper提供的服务主要是经过:数据结构 + 原语 + 通知机制,三部分实现的:分布式
Zookeeper命名空间中的Znode,兼具文件和目录两种特色。既像文件同样维护着数据、元信息、ACL、时间戳等数据结构,又像目录同样能够做为路径标识的一部分。每个Znode由3部分组成:性能
zk虽然能够关联一些数据,但并无被设计为常规的数据库或者大数据存储,相反的是,它用来管理调度数据,好比分布式应用中的配置文件信息、状态信息、聚集位置等等。这些数据的共性都是很小的数据,一般以KB为大小为单位大数据
zk中每一个节点znode存储的数据要被原子性的操做,即读操做将获取节点相关的全部数据,写操做也将替换掉节点的全部数据。线程
此外,每个节点都拥有本身的ACL(访问控制列表),规定了用户的权限,限定了用户对目标节点的可执行操做。设计
ZK的节点有两种,分别为临时节点和永久节点。节点的类型在节点建立时即被肯定,而且不能被改变。
临时节点,该节点的生命周期取决于它们的会话。一旦会话结束,临时节点将被自动删除,固然也能够手动删除。虽然每一个临时节点都会绑定到一个客户端会话,但它对其余客户端都是可见的。另外,zk的临时节点不容许拥有子节点。
永久节点,该节点的生命周期不依赖于会话,而且只有在客户端显示执行删除操做的时候,才能被删除
建立Znode时,用户能够请求在zk的路径结尾添加一个递增的计数器。这个计数对于此节点的父节点来讲是惟一的,它的格式为“%10d”(10为数字,没有数值的位数用0填充,例如0000000001)。
客户端能够在节点上设置watcher,称之为监视器。当节点状态发生改变时(znode的增删改操做)将会触发watcher所对应的操做。当Watcher被触发时,zk将会向客户端发送且仅发送一条通知,由于watcher只能被触发一次,以减小网络流量。
zk中有多种记录时间的格式,其中包含如下几个主要属性:
Znode维护着三个Zxid,分别为:cZxid、mZxid、pZxid * cZxid,建立节点对应的Zxid时间戳 * mZxid,修改节点对应的Zxid时间戳 * pZxid,最新修改的Zxid,貌似与mZxid重合了
实现中,Zxid是一个64位的数字,其中高32位表明epoch,用来标识leader关系是否改变,每一次leader选举,都会有一个新的epoch;低32位是个递增计数。
zk中每一个Znode节点拥有表示其状态的许多重要属性,以下图所示:
zk中提供了9个基本操做,如图所示:
ZK提供为全部的读操做设置Watch,包括exists()、getChildren()及getData()。Watch事件是一次性的触发器,当Watch的对象状态发生改变时,将会触发此对象上watch事件。Watch事件被异步地发送给客户端,而且ZK为watch机制提供了有序的一致性保证。