ZooKeeper - Perl bindings for Apache ZooKeeper Perl绑定用于 Apache ZooKeeper
监控 master/slave 需要使用zk的临时节点
1072 ./configure --libdir=/usr/lib
1073 make
1074 make install
1075 cpan ZooKeeper
[root@wx03 c]# perldoc ZooKeeper
my $zk = ZooKeeper->new(hosts => 'localhost:2181');
my $cv = AE::cv;
my @children = $zk->get_children('/', watcher => sub { my $event = shift; $cv->send($event) });
my $child_event = $cv->recv;
状态:
不稳定
知道版本1.0.0,一些 API方面的改动,最多和异常处理相关用于命令和watchers.
描述:
ZooKeeper 是一个perl 接口到 Apache ZooKeeper C client library.
与Net::ZooKeeper的不同?
ZooKeeper 是编写用于异步程序
支持异步程序,watchers是作为函数引用实现, 一个ZooKeeper::Dispatcher 异步调用
ZooKeeper 事件数据。
相反,Net::ZooKeeper 被用于Net::ZooKeeper::Watch classes, 用户必须交互的使用wait方法。
ZooKeeper 数据是表现为普通的perl 数据类型
ZooKeeper 事件和状态数据 是简单的hash引用和数据引用
Net::ZooKeeper 代替提供特定的perl类用于交互这个数据
ZooKeeper 利用perl异常处理;
代替 返回的C错误代码, 因为Net::ZooKeeper does, ZooKeeper 抛出一个 ZooKeeper::Error 异常对于不期望的返回代码
Data Types 数据类型:
ACL 是表示一个hash引用的数组引用,每个hash引用包含一个Id,scheme,和权限。
权限标志可以从ZooKeeper::Constants package.导入
例子,ZOO_READ_ACL_UNSAFE 将表示为;
[{id => 'anyone', scheme => 'world', perms => ZOO_PERM_READ}]
event:
一个属性的hash引用用于一个watcher event,包含event的类型(a ZooKeeper::Constants event),
连接状态(a ZooKeeper::Constants state) 和节点触发事件的路径
{
path => '/child',
state => ZOO_CONNECTED_STATE,
type => ZOO_CHILD_EVENT,
}
stat
A hashref of fields from a C Stat struct.
{
aversion => 0,
ctime => 0,
cversion => 0,
czxid => 0,
ephemeralOwner => 0,
dataLength => 0,
mtime => 0,
mzxid => 0,
numChildren => 2,
pzxid => 2334,
version => 0,
}
Dispatchers 调度器:
ZooKeeper 使用ZooKeeper::Dispatchers 对于和用C库注册的回调通信。
那些回调 是被执行在单独的POSIX threads,
写event data 到一个 ZooKeeper::Channel ,通知 dispatcher 一个event 是准备被处理。
这个通过如何发生,perl 回调如何发生,是调度器乐行的不同
AnyEvent
ZooKeeper 写Unix 管道 使用一个AnyEvent I/O watcher. T
这意味着perl 回调对于watcheres 会通过AnyEvent event loop. 执行
Interrupt 中断:
ZooKeeper 使用 Async::Interrupt 回调,这意味着 perl 解释器会安全的中断(等待操作完成)
为了执行这个响应的perl回调。
查看Async::Interrupt 关于回调如何被执行。
要知道这个不会中断系统调用(比如select) 和XScode.
这意味着你的代码会被租的在select操作(比如在 AnyEvent recv),
中断的回调不会执行直到请求完成
IOAsync
ZooKeeper 写一个Unix管道使用 IO::Async::Handle.
IO::Async 调度器需要一个n IO::Async::Loop, 需要手动构建
my $loop = IO::Async::Loop->new;
my $disp = ZooKeeper::Dispatcher::IOAsync->new(loop => $loop);
my $zk = ZooKeeper->new(
hosts => 'localhost:2181',
dispatcher => $disp,
);
ATTRIBUTES 属性:
一个逗号分隔的列表
'localhost:2181'
'zoo1.domain:2181,zoo2.domain:2181'
timeout 会话超时用于ZooKeeper connection.
watcher:
一个子程序引用被调用通过默认的watcher 对于ZooKeeper 会话事件,
这个属性是读写的:
authentication
一个数组引用 用于ZooKeeper 认证,这个会传递一个数组到add_auth
[$scheme, $credentials, %extra]
buffer_length
默认的buffer 长度用于检索ZooKeeper data and paths 默认是2048
METHODS 方法:
new 实现一个新的 ZooKeeper connection.
my $zk = ZooKeeper->new(%args)
%args
REQUIRED hosts
OPTIONAL authentication
OPTIONAL buffer_length
OPTIONAL dispatcher
OPTIONAL timeout
OPTIONAL watcher
state:
得到ZooKeeper connection的状态,返回一个状态枚举
wait:
调用等待依赖 ZooKeeper::Dispatcher.
同步调用一个事件,返回 事件hash引用 watcher 被调用。
可以传递一个timeout(单位秒),会导致等待 undef 如果没有在指定时间完成
my $event = $zk->wait($seconds)
OPTIONAL $seconds
close:
关闭一个 ZooKeeper session.
如果 handle不是通过当前的session创建的,一个 ZOO_CLOSE_OP
不会发送给server,相反,底层的socket会关闭
reopen:
重新打开一个 ZooKeeper session 在forking后,
这个创建一个新的 ZooKeeper session, 不会关闭当前的会话
create:
创建一个新的node 使用给定的path和数据,返回 新创建的节点的path,否则抛出错误
my $created_path = $zk->create($requested_path, %extra);
REQUIRED $requested_path
OPTIONAL %extra
acl
buffer_length
ephemeral
sequential
value
add_auth:
添加认证对于session,会自动被调用如果认证属性在构造期间被设置
一个 ZooKeeper::Error 会抛出如果请求没有成功, 决定成功或者失败认证,一个watcher 必须被传入
$zk->add_auth($scheme, $credentials, %extra)
REQUIRED $scheme
REQUIRED $credentials
OPTIONAL %extra
watcher
delete:
Delete 一个node 在给定的path,Throws a ZooKeeper::Error 如果delete删除失败
$zk->delete($path, %extra)
REQUIRED $path
OPTIONAL %extra
version
ensure_path
exists
检查是否一个节点存在于给定的path, 并可选的设置一个watcher 当节点被创建和删除,
如果成功, 返回一个节点的状态的hash引用,否则返回Undef:
my $stat = $zk->exists($path, %extra)
REQUIRED $path
OPTIONAL %extra
watcher
get_children:
得到child 节点在规定的path下, 可选的设置一个watcher 当一个child 被创建或者删除,返回一个child path名字的数组
my @child_paths = $zk->get_children($path, %extra)
REQUIRED $path
OPTIONAL %extra
watcher
get:
设置数据在给定的path,如果成功,返回一个节点状态hashref,否则一个ZooKeeper::Error is thrown.
my $stat = $zk->set($path => $value, %extra)
REQUIRED $path
REQUIRED $value
OPTIONAL %extra
version