一、简介
zookeeper是hadoop的一个子项目,A distribute coordination service for distributed applications 为了分布式应用而开发的分布式管理服务。多个server,少数server down不会影响整个分布式服务。
zookeeper简单而又高效的保证是:
1.顺序一致性---从client的更新会按顺序应用
2.原子性---更新要么成功要么失败。没有更新了一半这个说法。
3.可靠性---一旦更新被应用,它就会一直保持着直到下一次被更改
二、特点
zookeeper的数据模型像操作系统的文件结构,每个znode可以有子znode,并且znode可以存数据。不像文件系统是为了数据存储的,zookeeper的数据在内存中,也就是zookeeper能够获得高吞吐量和低延迟。
但ephemeral类型的znode不能有子节点。ephemeral的znode一旦和服务器失去联系,这个znode将自动删除。zookeeper的客户端和服务器采用长连接,通过心跳来保持连接。这个链接称为session,seesion失效会导致ephemeral的znode删除。
znode可以被监控,包括这个目录节点存储的数据的 修改,子节点目录的变化等,一旦变化可以通知监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现配置集中管理,集群管理,分布式锁等。
三、zookeeper watches
所有的zookeeper读动作都有一个选项选择是否设置watch。getData(),getChildren(),exists()。watch的定义是:一次性触发,发送给set这个watch的client端,当这个watch的数据发生改变的时候。
One-time trigger
设置znode的watch,当znode发生改变会收到事件。除非重新设置一个watch,否则不会再收到znode改变的事件。
Sent to client
这意味着有可能因为网络的问题,发送改变已经完成,但watch event事件还没到。watch是异步到达的。
The data for which the watch was set。
这指的是一个node可以发生不同的改变方式。data watches and child watches。getData()和exists()设置data watches。getChildren()设置子节点监视。getData和exist()返回node数据,getchildren返回a list of children。
这样setData()会触发设置的znode的data watch,create()会触发创建的znode的data watch和parent node的child watch。delete() 会触发这个node的data watch和child watch,以及 parent node的child watch。
关于watch需要注意的
one-time trigger,so must set again。
因为watch是one有latency的,所以有可能在设置新的watch和得到事件之间znode发生了改变。
一个watch函数只会因为一个通知调用一次。比如:exists和getData注册了同样的watch函数,当这个node被删除的时候,只会触发一次函数。
当和server断掉时,你不会收到任何watch。所以,你要使用session events。