PHP操作Zookeeper实践
# 1. Zookeeper安装
# 1.1 源码编译
- 下载安装包
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz --no-check-certificate
1
- 解压
zookeeper的安装包无需变异,解压即可使用:
tar zxvf zookeeper-3.4.14.tar.gz
1
2
2
为了方便快速测试,我们采用docker来安装zookeeper, 命令如下:
docker run -d -p 2181:2181 -v /data/:/data/ --name=zookeeper zookeeper
1
# 2. Zookeeper类信息
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 — 设置观察函数
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
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
# 2.1 客户端操作
获取节点信息(Zookeeper::get):
$zk = new Zookeeper('127.0.0.1:2181');
if ($zk->exists('/tmp')) {
echo $zk->get('/tmp');
} else {
echo '节点不存在';
}
$zk->close();
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
获取节点信息(Zookeeper::get)并设置watcher:
$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();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
创建子节点(Zookeeper::create):
$zk = new Zookeeper('127.0.0.1:2181');
$zk->create('/tmp',1);
$zk->close();
1
2
3
2
3
创建临时/顺序节点:
$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);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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节点时触发
上次更新: 2022/12/02, 22:04:34