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 \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";
}
zookeeper 笔记的更多相关文章
- (转)ZooKeeper 笔记(1) 安装部署及hello world
ZooKeeper 笔记(1) 安装部署及hello world 先给一堆学习文档,方便以后查看 官网文档地址大全: OverView(概述) http://zookeeper.apache.or ...
- Zookeeper笔记之命令行操作
$ZOOKEEPER_HOME/bin下的zkCli.sh进入命令行界面,使用help可查看支持的所有命令: 一.节点相关操作 create [-s] [-e] path data acl creat ...
- zookeeper笔记(一)
title: zookeeper笔记(一) zookeeper 安装简记 解压文件 $ tar -zxvf zookeeper-3.4.10.tar.gz -C 安装目录 创建软连接(进入安装目录) ...
- zookeeper笔记(二)
title: zookeeper笔记(二) zookeeper ALC权限控制 getAcl path 可以查看某个node的权限 设置权限: 2. world方式 setAcl <path&g ...
- Zookeeper笔记3——原理及其安装使用
Zookeeper到底能干什么? 1.配置管理:这个好理解.分布式系统都有好多机器,Zookeeper提供了这样的一种服务:一种集中管理配置的方法,我们在这个集中的地方修改了配置,所有对这个配置感兴趣 ...
- ZooKeeper 笔记(6) 分布式锁
目前分布式锁,比较成熟.主流的方案有基于redis及基于zookeeper的二种方案. 大体来讲,基于redis的分布式锁核心指令为SETNX,即如果目标key存在,写入缓存失败返回0,反之如果目标k ...
- 分布式服务协调技术zookeeper笔记
本文主要学习ZooKeeper的体系结构.节点类型.节点监听.常用命令等基础知识,最后还学习了ZooKeeper的高可用集群的搭建与测试.希望能给想快速掌握ZooKeeper的同学有所帮助. ZooK ...
- ZooKeeper 笔记(1) 安装部署及hello world
先给一堆学习文档,方便以后查看 官网文档地址大全: OverView(概述) http://zookeeper.apache.org/doc/r3.4.6/zookeeperOver.html Get ...
- ZooKeeper 笔记(5) ACL(Access Control List)访问控制列表
zk做为分布式架构中的重要中间件,通常会在上面以节点的方式存储一些关键信息,默认情况下,所有应用都可以读写任何节点,在复杂的应用中,这不太安全,ZK通过ACL机制来解决访问权限问题,详见官网文档:ht ...
- ZooKeeper 笔记(4) 实战应用之【消除单点故障】
关键节点的单点故障(Single Point of Failure)在大型的架构中,往往是致命的.比如:SOA架构中,服务注册中心(Server Register)统一调度所有服务,如果这个节点挂了, ...
随机推荐
- (35)odoo中widget
widget大全: many2many_tagsone2many_listselectionprogressbarselectionstatusbarhandlemonetarymail_thread ...
- 关于strcpy和memcpy
strcpy和memcpy都是标准C库函数,它们有下面的特点. strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符.已知strcpy函 ...
- centos7.0 64位系统 安装PHP 支持 nginx
1 安装PHP所需要的扩展 yum -y install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel curl cur ...
- IEnumerable接口的Aggregate方法
以前小猪为了累加一个集合中的类容通常会写出类似这样的C#代码: string result ="": foreach (var item in items) { result+=i ...
- Mike的农场 (BZOJ 4177)
题目大意: 给N个东西分AB类,分到A类和B类分别得到相应的钱记为A[i],B[i],然后有一些冲突关系<x,y,z>,如果物品x,y不同类需要付出z的钱.还有一些外快<S,x,y& ...
- 【59测试】【树】【dp】
第一题 A : 这棵树由n个节点以及n - 1条有向边构成,每条边都从父亲节点指向儿子节点,保证除了根节点以外的每个节点都有一个唯一的父亲.树上的节点从1到n标号.该树的一棵子树的定义为某个节点以及从 ...
- ubuntu 14.04 下找不到命令,路径出错
在安装一些东西时,可能操作上不小心把路径覆盖或打错,造成一些基本命令如ls mkdir等无法使用,就会出现以下提示错误. 错误: 由于/usr/bin 不在PATH 环境变量中,故无法找到该命令 根本 ...
- Linux摄像头驱动学习之:(五)UVC-分析设备描述符
linux系统上插上USB摄像头设备后,内存就会有相应的设备描述符信息,后期可以根据这些信息进一步写驱动程序. 流程:Device(设备) -> Configuration(配置) -> ...
- ios开发之数据存储
iOS应用数据存储的常用方式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core Data 应用沙盒 ...
- java eclipse环境搭建环境
开发环境搭建: JDK的安装 http://www.oracle.com/technetwork/java/javase/downloads 下载文件:jdk-8u101-windows-x64.ex ...