http://www.biaodianfu.com/zookeeper.htmlhtml
=======node
----api
zookeeper这种数据结构有以下这些特色:服务器
1,每一个子目录如NameService都被做为znode,这个znode是被她所在的路径惟一标示,网络
若是Server1这个zndoe的标示为/NameService/Server1session
2,znode能够有字节点目录,每一个znode能够存储数据,注意ephemeral类型的目录节点不能有字节点目录数据结构
3,znode是有版本的,每一个znode中存储的数据能够有多个版本,也就是一个访问路径中能够村村多分数据app
4,znode能够是临时节点,一旦建立这个znode的客户端与服务端失去联系,这个znode也将自动删除,zk的client和server通讯采用长连接方式,每一个客户端和服务器经过心跳来保持连接,这个连接状态成为session,若是znode是临时节点,这个session失效,znode也就删除了。框架
5,znode的目录名能够自动编号,app1-》app2异步
6,znode能够被监控,包括这个目录节点中存储的数据的修改,字节点目录的编号等。
===========
zookeeper client library 提供了api:
create(path,data,flags):建立一个znode,path为路径,data是要存储在盖znode上的数据,flags经常使用的有,
presisten,presistent_sequentail,ephemeral,ephemeral_sequentail
delete(path,version):删除一个znode,能够经过ersion删除指定的版本,若是version是-1的话,表示删除全部的版本
exists(path,watch):判断指定的znode是否存在,并设置是否watch这个znode。这里若是要设置Watcher的话,watcher是在建立zookeeper实例时指定的,若是要设置特定的Watcher的话,能够调用另外一个版本的exists(path,watcher)。如下几个带watch的API也都相似。
getData(path,watch):读取指定znode上的数据,并设置是否watch这个znode
setData(path,watch):读取指定znode的数据,并设置是否watch这个znode
getChildren(path,watch):获取指定znode的全部子znode的名字,并设置watch这个znode
sync(path):把全部在sync以前的更新操做都进行同步,达到每一个请求都在半数以上的zookeeper server上生效。path目前没有用
setAcl(path,acl):设置指定znode的Acl信息
getAcl(path):获取指定znode的acl信息。
================
zookeeper的应用场景:
1,命名服务:在分布式系统中,经过使用命名服务,客户端可以根据名字获取资源或服务的地址,提供者等信息。被命名的实体一般能够是集群中的机器,提供的服务地址,远程对象等等--这些咱们均可以统称为名字(Name)。其中较为常见的就是一些分布式服务框架中的服务地址列表。经过调用zk提供的建立节点的api,可以很容易建立一个全局唯一的path,这个path就能够做为一个名称。
2,配置管理,
程序老是须要配置的,若是程序分散部署在多个机器上,要逐个配置变得困难。如今把这些配置所有放到zookeeper上,保存在zookeeper的某个目录节点中,而后全部相关应用程序对这个目录节点金像监听,一旦配置信息发生变化,每一个应用程序就会受到zookeeper的通知,而后从zookeeper获取新的配置信息应用到系统中就行了。
3,
集群管理
所谓集群管理就在于:是否有及其退出和加入,选举master
对于第一个点,全部机器约定在父目录groupMembers下建立临时节点,而后监听目录节点的字节点变化消息。一旦有机器挂掉,该机器与zookeeper的连接断开,起所建立的临时目录节点被删除,全部其余及其都受到通知:某个兄弟目录被删除了,因而全部人都知道了:他上船了。新机器加入也是相似,全部机器收到通知:新兄弟目录加入,highcount又有了。
对于第二点:咱们稍微改变一下,全部机器建立临时顺序编号目录节点,每次选取编号最小的机器做为master就好。
==
4,分布式锁
有个zookeeper的一致性文件系统,锁的问题变得容易。
锁服务能够分为两类,一个保持独占,另外一个控制时序。
http://www.biaodianfu.com/zookeeper.html
==============
func watchCallback-B create
event_type= 3
stat= 3
path= /signal_server/sig_5
func watchCallback-E
==========
func watchCallback-B delete
event_type= 2
stat= 3
path= /signal_server/sig_5
func watchCallback-E
===========
http://www.cnblogs.com/haippy/archive/2013/02/21/2920261.html
watches简介
zookeeper中全部的读——getData(), getChildren(), 和 exists() 都 能够设置监视(watch),监视事件能够理解为一次性的触发器, 官方定义以下: a watch event is one-time trigger, sent to the client that set the watch, which occurs when the data for which the watch was set changes。对此须要做出以下理解:
1,一次性触发:one time trigger
当设置监视的数据发生改变时,该监视事件会被发送到客户端,例如,若是客户端调用了 getData("/znode1", true) 而且稍后 /znode1 节点上的数据发生了改变或者被删除了,客户端将会获取到 /znode1 发生变化的监视事件,而若是 /znode1 再一次发生了变化,除非客户端再次对 /znode1 设置监视,不然客户端不会收到事件通知。
2,发送至客户端,sent to the client
zookeeper客户端和服务端是经过socket进行通讯的,因为网络存在故障,因此监视事件颇有可能不会成功地到达客户端,监视事件是异步发送到监视者的,zookeeper自己提供了ordering guanrantee:即client首先看到了监视事件后,才会感知到它所设置监视的znode发生了变化(a client will never see a change for which it has set a watch until it first sees the watch event).网络延迟或其余因素可能致使不一样的客户端在不一样的时刻感知某一监视事件,可是不一样的客户端所看到的一切具备一致的顺序。
3,被设置watch的数据,the data for which the watch was set
这意味着znode节点自己具备不一样的改变方式。你能够想象zookeeper维护了两条监视链表:数据监视和子节点监视(data watches and child watches)getData() and exists()设置数据监视,getChildren()设置子节点监视。
或者,你能够想象zookeeper设置的不一样监视返回不一样的数据,getData()和exists()返回znode节点的相关信息,而getChildren()返回字节点列表。所以,setData()会触发设置在某一节点上所设置的数据监视(假定数据设置成功),而一次成功的create()操做则会发出当前节点上所设置的数据监视以及父节点的字节点监视。一次成功的delete()操做将会触发当前节点的数据监视和字节点监视事件,同时也会触发该父节点的child watch.
==
Zookeeper 中的监视是轻量级的,所以容易设置、维护和分发。当客户端与 Zookeeper 服务器端失去联系时,客户端并不会收到监视事件的通知,只有当客户端从新链接后,若在必要的状况下,之前注册的监视会从新被注册并触发,对于开发人员来讲 这一般是透明的。只有一种状况会致使监视事件的丢失,即:经过 exists() 设置了某个 znode 节点的监视,可是若是某个客户端在此 znode 节点被建立和删除的时间间隔内与 zookeeper 服务器失去了联系,该客户端即便稍后从新链接 zookeeper服务器后也得不到事件通知。
=============
连接状态Stat相关的常量
如下常量均与 Zookeeper 链接状态有关,他们一般用做监视器回调函数的参数。
ZOOAPI const int ZOO_EXPIRED_SESSION_STATE
ZOOAPI const int ZOO_AUTH_FAILED_STATE
ZOOAPI const int ZOO_CONNECTING_STATE
ZOOAPI const int ZOO_ASSOCIATING_STATE
ZOOAPI const int ZOO_CONNECTED_STATE
=============
与监视类型(watch types)相关的常量
如下常量标示监视事件的类型,一般用做监视器回调函数的第一个参数:
ZOO_CREATED_EVENT; // 节点被建立(此前该节点不存在),经过 zoo_exists() 设置监视。
ZOO_DELETED_EVENT; // 节点被删除,经过 zoo_exists() 和 zoo_get() 设置监视。
ZOO_CHANGED_EVENT; // 节点发生变化,经过 zoo_exists() 和 zoo_get() 设置监视。
ZOO_CHILD_EVENT; // 子节点事件,经过zoo_get_children() 和 zoo_get_children2()设置监视。
ZOO_SESSION_EVENT; // 会话丢失
ZOO_NOTWATCHING_EVENT; // 监视被移除。
==Zookeeper C API中各类回到函数简介
监视函数(watch function)原型:
typedef void (*watcher_fn)(zhandle_t *zh, int type, int state, const char *path,void *watcherCtx);
//zk zookeeper句柄
//type 事件类型(event type).*_EVENT常量之一
//state 连接状态(conncetion state).状态值*_STATE常量之一
//path触发监视事件的znode节点的路径,若未null,则事件类型为ZOO_SESSION_EVENT
//watcherCtx
====
其余回调函数的原型:
Zookeeper 中还有几种在异步 API(通常以 zoo_a*开头的函数) 中使用的回调函数,根据回调函数处理异步函数返回值类型的不一样分为如下几类:处理返回 void 类型的回调函数,处理返回 Stat 结构的回调函数,处理返回字符串的回调函数,处理返回数据的回调函数,处理返回字符串列表(a list of string)的回调函数,同时处理返回字符串列表(a list of string)和 Stat 结构的回调函数,以及处理返回 ACL 信息的回调函数
=====
‘
function callback_children($path){ echo "callback_children-b \r\n"; echo "<br>=====$path<br> \r\n"; $arr_path = explode('/', $path); $key = $arr_path[1]; echo "$key \r\n"; if(!isset($this->valueTkey[$key])){ $this->valueTkey[$key] = array(); } if (!isset($_SESSION[$key])){ $_SESSION[$key] = array(); } var_dump($_SESSION[$key]); $value = $this->getChildren($path); unset($_SESSION[$key]); foreach ($value as $item){ array_push($_SESSION[$key], $item); } var_dump($_SESSION); echo "callback_children-e\r\n";}