zookeeper 笔记

http://www.biaodianfu.com/zookeeper.html

=======

 ----

zookeeper这种数据结构有如下这些特点:

1,每个子目录如NameService都被作为znode,这个znode是被她所在的路径唯一标示,

如果Server1这个zndoe的标示为/NameService/Server1

2,znode可以有字节点目录,每个znode可以存储数据,注意ephemeral类型的目录节点不能有字节点目录

3,znode是有版本的,每个znode中存储的数据可以有多个版本,也就是一个访问路径中可以村村多分数据

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 ";
echo "<br>=====$path<br> ";
$arr_path = explode('/', $path);
$key = $arr_path[1];
echo "$key ";
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 ";
}

原文地址:https://www.cnblogs.com/li-daphne/p/5697440.html