PHP操作Zookeeper实践

Zookeeper安装

源码编译

  • 下载安装包
1
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz --no-check-certificate
  • 解压

zookeeper的安装包无需变异,解压即可使用:

1
tar zxvf zookeeper-3.4.14.tar.gz

为了方便快速测试,我们采用docker来安装zookeeper, 命令如下:

1
docker run -d -p 2181:2181 -v /data/:/data/ --name=zookeeper zookeeper

zookeeper类信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Zookeeper — Zookeeper类

-- Zookeeper::addAuth — 指定应用程序凭据

-- Zookeeper::connect — 创建与Zookeeper沟通的句柄

-- Zookeeper::__construct — 创建与Zookeeper沟通的句柄

-- Zookeeper::create — 同步创建节点

-- Zookeeper::delete — 同步删除Zookeeper中的一个节点

-- Zookeeper::exists — 同步检查Zookeeper节点的存在性

-- Zookeeper::get — 同步获取与节点关联的数据。

-- Zookeeper::getAcl — 同步地获取与节点关联的ACL。

-- Zookeeper::getChildren — 同步列出节点的子节点

-- Zookeeper::getClientId — 返回客户端会话ID,仅在连接当前连接时才有效(即最后观察者状态为ZooOnCeleDelphi状态)

-- Zookeeper::getRecvTimeout — 返回此会话的超时,如果连接当前连接(只有上次观察者状态为ZooOnCeleTytStand状态)才有效。此值可能在服务器重新连接后发生更改。

-- Zookeeper::getState — 获取Zookeeper连接的状态

-- Zookeeper::isRecoverable — 检查当前的Zookeeper连接状态是否可以恢复

-- Zookeeper::set — 设置与节点关联的数据

-- Zookeeper::setAcl — 同步设置与节点关联的ACL

-- Zookeeper::setDebugLevel — 设置库的调试级别

-- Zookeeper::setDeterministicConnOrder — 启用/禁用仲裁端点顺序随机化

-- Zookeeper::setLogStream — 设置库用于日志记录的流

-- Zookeeper::setWatcher — 设置观察函数
客户端操作

获取节点信息(Zookeeper::get)

1
2
3
4
5
6
7
8
9
$zk = new Zookeeper('127.0.0.1:2181');

if ($zk->exists('/tmp')) {
echo $zk->get('/tmp');
} else {
echo '节点不存在';
}

$zk->close();

获取节点信息(Zookeeper::get)并设置watcher

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$zk = new Zookeeper('127.0.0.1:2181');

$watch = function($type, $state, $key) {
echo '节点发生改变';
};


if ($zk->exists('/tmp')) {
echo $zk->get('/tmp', $watch);
} else {
echo '节点不存在';
}

while(true) {
echo '.';
sleep(1);
}

$zk->close();

创建子节点(Zookeeper::create)

1
2
3
$zk = new Zookeeper('127.0.0.1:2181');
$zk->create('/tmp',1);
$zk->close();

创建临时/顺序节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$params = [
[
'perms' => Zookeeper::PERM_ALL,
'scheme' => 'world',
'id' => 'anyone'
]
];

$zk = new Zookeeper('127.0.0.1:2181');

// 临时节点
$zk->create('/tmp',1, $params, Zookeeper::EPHEMERAL);

// 顺序节点
// $zk->create('/tmp',1, $params, Zookeeper::SEQUENCE);

// 临时顺序
$zk->create('/tmp',1, $params, Zookeeper::EPHEMERAL|Zookeeper::SEQUENCE);

Watcher通知状态与事件类型一览

  • ZOO_CREATED_EVENT(value=1):节点创建事件,需要watch一个不存在的节点,当节点被创建时触发,此watch通过zoo_exists()设置
  • ZOO_DELETED_EVENT(value=2):节点删除事件,此watch通过zoo_exists()或zoo_get()设置
  • ZOO_CHANGED_EVENT(value=3):节点数据改变事件,此watch通过zoo_exists()或zoo_get()设置
  • ZOO_CHILD_EVENT(value=4):子节点列表改变事件,此watch通过zoo_get_children()或zoo_get_children2()设置
  • ZOO_SESSION_EVENT(value=-1):会话事件,客户端与服务端断开或重连时触发
  • ZOO_NOTWATCHING_EVENT(value=-2):watch移除事件,服务端出于某些原因不再为客户端watch节点时触发
有用就打赏一下作者吧!