ZooKeeper是一个分布式应用所涉及的开源协调服务。
可以为用户提供同步,配置管理,分组和命名等服务。
用户可以实现一致性,组管理,leader选举等协议。
设计目的是为了减轻分布式应用程序所承担的协调任务。
Zookeeper的设计目标:简单化,健壮性,有序性,速度优势。
Znode是客户端要访问的ZooKeeper的主要实体,主要特征有:
客户端可以在节点是设置watch即监视器。当节点的状态发生改变时就会触发watch对应的操作,此时,Zookeeper会向客户端仅发送一个通知,因为watch只能被触发一次。
每个节点上存储的数据需要被原子性的操作。读操作会获取与节点相关的所有数据,写操作也将替换节点的所有数据。另外,每一个节点都拥有自己的ACL即访问控制列表,这个列表规定了用户的权限,即限定了特定用户对目标节点可以执行的操作。
有两种节点即临时节点和永久节点。节点类型在创建时被确认并且不能改变。一单创建节点的会话结束,临时节点将会被自动删除。临时节点不允许拥有子节点。
顺序节点可以保证唯一性,用户在创建Znode的时候,可以请求在ZooKeeper的路径结尾创建一个计数。
ZooKeeper中的时间:
每一个对节点的改变都讲产生一个唯一的zxid格式的时间戳。ZooKeeper的每个节点维护者三个zxid值,分别为:cZxid、mZxid、pZxid
对接点的每一个操作都将致使这个节点的版本号增加,每个节点维护者三个版本号分别为:version,cversion,avevsion。
ZooKeeper使用ACL来对Znode进行访问控制,使用许可为来对一个节点的不同操作进允许或禁止的权限控制,ZooKeeper节点有user,group,world三总标准模式,没有节点所有者的概念。一个ACL和一个ZooKeeper节点相对应。父节点的ACL与子节点的ACL相互独立,因此ACL不能被子节点所继承,父节点所拥有的权限与子节点所拥有的权限没有任何关系。支持的验证模式:world,auth,digest,ip。
ZooKeeper是一种高性能、可扩展的服务。ZooKeeper的读写速度非常快,并且读的速度要比写得快。特点:客户端的更新顺序与他们被发送的顺序相一致;更新操作要么成功要么失败;无论客户端连接到哪一个服务器都将看到相同的ZooKeeper视图。可靠性,一旦一个更新操作被应用,那么客户端再次更新它之前,其值将不会改变。在特点的一段时间内,客户端看到的系统需要被保证是实时的。
ZooKeeper自动的会为每一个ZooKeeper服务器分配一个比前面所分配的序号要大的序号。此时创建节点的ZooKeeper服务器中拥有最小编号的服务器将成为leader。Leader服务器发生故障的解决方法:让所有的Follower监视leader所对应的节点。当Leader发生故障时,Leader所对应的临时节点会被自动删除,此操作将会触发所有监视Leader服务器的watch这样这些服务器就会收到Leader故障的消息,进而进行下一次的Leader选举操作。为避免发生从众效应:每一个Follower为Follower集群中对应着比自己节点序号小的节点中X序号最大的节点设置一个watch,只有当watch被触发时,它才进行Leader选举操作,一般情况下它将成为集群的下一个Leader。这样每次Leader选举几乎只涉及单个Follower的操作。
在ZooKeeper中,完全分布的锁是全局同步的,也就是说,在同一时刻,不会有两个不同的客户端认为他们持有了相同的锁。一个客户解锁之后,将只可能有一个客户端获得锁,因此每一个临时的连续节点对应着一个客户端,并且节点之间没有重叠;在ZooKeeper的锁机制中没有轮训和超时。