PHP和zookeeper结合实践_csdn产品小助手的博客-CSDN博客


本站和网页 https://blog.csdn.net/weixin_33672400/article/details/88752736 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

PHP和zookeeper结合实践_csdn产品小助手的博客-CSDN博客
PHP和zookeeper结合实践
csdn产品小助手
于 2018-08-28 03:58:05 发布
279
收藏
文章标签:
大数据
php
shell
原文链接:https://segmentfault.com/a/1190000016173878
版权
Zookeeper
简单介绍
Apache Zookeeper是开发和维护开源服务器的服务,它能够实现高度可靠的分布式协调。
安装Zookeeper(无需安装)
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
tar zxvf zookeeper-3.4.10.tar.gz
安装Zookeeper C扩展支持
cd zookeeper-3.4.8/src/c
./configure --prefix=/usr/
make
make install
安装php的zookeeper扩展
wget https://pecl.php.net/get/zookeeper-0.6.2.tgz
tar zxvf zookeeper-0.6.2.tgz
cd zookeeper-0.6.2
phpize
./configure --with-libzookeeper-dir=/usr/
$ make
$ make install
启动zookeeper server
# {zookeeperserver}代表你zookeeper解压的目录
mkdir -p /project/zookeeper/demo/data
#zoo.conf 是默认启动所加载的配置文件
cp /{zookeeperserver}/conf/zoo_sample.cfg /{zookeeperserver}/conf/zoo.cfg
/{zookeeperserver}/bin/zkServer start
zookeeper client 测试
/{zookeeperserver}/bin/zkCli.sh -server 127.0.0.1:2181
# [zk: 127.0.0.1:2181(CONNECTED) x] 客户端连接信息shell
[zk: 127.0.0.1:2181(CONNECTED) 3] ls /
[zookeeper]
[zk: 127.0.0.1:2181(CONNECTED) 4] create /test qkl001
Created /test
[zk: 127.0.0.1:2181(CONNECTED) 5] create /zgq zgq002
Created /zgq
[zk: 127.0.0.1:2181(CONNECTED) 6] ls /
[zookeeper, test, zgq]
[zk: 127.0.0.1:2181(CONNECTED) 5] delete /zgq
Created /zgq
[zk: 127.0.0.1:2181(CONNECTED) 7] quit
PHP下实践
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 — 设置观察函数
客户端操作
zkCli.cmd
# output 表示连接成功
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0]
# 以下是操作命令
ls /
create /ztest 1
获取节点信息(Zookeeper::get)
# get.php
$zoo = new Zookeeper('192.168.1.45:2181');
$r = $zoo->get( '/ztest');
var_dump($r);
获取节点信息(Zookeeper::get)并设置watcher
# get.php
class ZookeeperDemo extends Zookeeper
public function watcher($type, $state, $key)
var_dump($type);
var_dump($state);
var_dump($key);
if ($type == 3) {
var_dump($this->get('/zgetw'));
// Watcher gets consumed so we need to set a new one
$this->get('/zgetw', array($this, 'watcher'));
$zoo = new ZookeeperDemo('192.168.1.45:2181');
$zoo->get('/zgetw', [$zoo, 'watcher']);
while (true) {
echo '.';
sleep(1);
客户端操作
set /ztest 2
set /ztest 3
set /ztest 5
获取节点信息(Zookeeper::get) 结果
php get.php
#output
......int(3)
int(3)
string(6) "/ztest"
string(1) "2"
..int(3)
int(3)
string(6) "/ztest"
string(1) "3"
..int(3)
int(3)
string(6) "/ztest"
string(1) "4"
.int(3)
int(3)
string(6) "/ztest"
string(1) "5"
创建子节点
create /ztest/child1 c1
# output: Created /ztest/child1
create /ztest/child2 c2
# output: Created /ztest/child2
ls /ztest
# output: [child2, child1]
php下获取子节点
# getChild.php
$zookeeper = new Zookeeper('192.168.1.45:2181');
$path = '/ztest';
$r = $zookeeper->getchildren($path);
if (!empty($r)) {
foreach ($r as $c)
var_dump($c);
# php getChild.php
string(6) "child2"
string(6) "child1"
创建顺序节点
[zk: localhost:2181(CONNECTED) 22] create /stest 1
Created /stest
[zk: localhost:2181(CONNECTED) 23] create -s /stest/seq 1
Created /stest/seq0000000000
[zk: localhost:2181(CONNECTED) 24] create -s /stest/seq 1
Created /stest/seq0000000001
[zk: localhost:2181(CONNECTED) 25] create -s /stest/seq 1
Created /stest/seq0000000002
[zk: localhost:2181(CONNECTED) 26] create -s /stest/seq 1
Created /stest/seq0000000003
[zk: localhost:2181(CONNECTED) 27] create -s /stest/seq 1
Created /stest/seq0000000004
[zk: localhost:2181(CONNECTED) 28] create -s /stest/seq 1
Created /stest/seq0000000005
[zk: localhost:2181(CONNECTED) 29] create -s /stest/seq 1
Created /stest/seq0000000006
[zk: localhost:2181(CONNECTED) 30] create -s /stest/seq 1
Created /stest/seq0000000007
[zk: localhost:2181(CONNECTED) 31] create -s /stest/seq 2
Created /stest/seq0000000008
[zk: localhost:2181(CONNECTED) 32] create -s /stest/seq 2
Created /stest/seq0000000009
[zk: localhost:2181(CONNECTED) 33] create -s /stest/seq 2
Created /stest/seq0000000010
[zk: localhost:2181(CONNECTED) 34] create -s /stest/seq 2
Created /stest/seq0000000011
[zk: localhost:2181(CONNECTED) 35] create -s /stest/seq 2
Created /stest/seq0000000012
[zk: localhost:2181(CONNECTED) 36] create -s /stest/seq 2
Created /stest/seq0000000013
[zk: localhost:2181(CONNECTED) 37] create -s /stest/seq 2
Created /stest/seq0000000014
代码
$zookeeper = new Zookeeper('192.168.1.45:2181');
$aclArray = array(
array(
'perms' => Zookeeper::PERM_ALL,
'scheme' => 'world',
'id' => 'anyone',
);
$path = '/t3';
//ZOO_EPHEMERAL = 1
//ZOO_SEQUENCE = 2
//这里这里的flag=NULL,flag=0 表示创建永久节点,=1创建临时节点,=2创建seq 顺序节点
$realPath = $zookeeper->create($path, null, $aclArray, 1);
var_dump($realPath);
worker
一个利用顺序临时节点的leader迁移实现
# worker.php
<?php
/**
* Created by PhpStorm.
* User: qkl
* Date: 2018/8/27
* Time: 14:25
*/
class Worker
const CONTAINER = '/worker_test';
protected $acl = [
'perms' => Zookeeper::PERM_ALL,
'scheme' => 'world',
'id' => 'anyone'
];
private $isLeader = false;
private $znode = '';
private $prevNode = '';
public function __construct($host = '', $watcher_cb = null, $recv_timeout = 10000)
$this->zk = new Zookeeper($host, $watcher_cb, $recv_timeout);
public function register()
if (!$this->zk->exists(self::CONTAINER)) {
$this->zk->create(self::CONTAINER, null, $this->acl);
# 创建一个临时的顺序节点
$this->znode = $this->zk->create(self::CONTAINER . '/w-',
null,
$this->acl,
Zookeeper::EPHEMERAL | Zookeeper::SEQUENCE);
//获取顺序节点名,去除父路径
$this->znode = str_replace(self::CONTAINER . '/', '', $this->znode);
printf("我创建了节点: %s\n", self::CONTAINER . '/' . $this->znode);
$this->prevNode = $this->getPrev();
if (is_null($this->prevNode)) {
$this->setLeader(true);
} else {
$this->zk->get(self::CONTAINER . "/" . $this->prevNode, [$this, 'watcher']);
public function getPrev()
$workers = $this->zk->getChildren(self::CONTAINER);
sort($workers);
$size = count($workers);
for ($i = 0; $i < $size; $i++) {
if ($this->znode == $workers[$i] && $i > 0) {
return $workers[$i - 1];
return null;
public function watcher($type, $state, $key)
$prevNode = $this->prevNode;
printf("watchNode-getPrevious:%s\n", self::CONTAINER . "/" . $prevNode);
if (!is_null($prevNode)) {
if ($type == 2) {
printf($prevNode . " had deleted\n");
if ($type == 3) {
printf("我重新监控节点:%s\n", self::CONTAINER . "/" . $prevNode);
$this->zk->get(self::CONTAINER . "/" . $prevNode, [$this, 'watcher']);
public function isLeader()
return $this->isLeader;
public function setLeader($flag)
$this->isLeader = $flag;
public function run()
$this->register();
while (true) {
if ($this->isLeader()) {
$this->leaderJob();
} else {
$this->watcherJob();
sleep(2);
public function leaderJob()
echo "现在我是Leader\n";
public function watcherJob()
echo "我在监控:".(self::CONTAINER . "/" . $this->prevNode)."\n";
$worker = new Worker('192.168.1.45:2181');
$worker->run();
尝试
# 终端1
php worker.php
# 终端2
php worker.php
# 终端3
php worker.php
# 此处运行不会被节点变化不会被监控到
再次尝试
# zkCli
create /worker_test/w-
/worker_test/0000000020
php worker.php
# output
我创建了节点: /worker_test/w-0000000022
我在监控:/worker_test/w-0000000020
我在监控:/worker_test/w-0000000020
watchNode-getPrevious:/worker_test/w-0000000020
我重新监控节点:/worker_test/w-0000000020
我在监控:/worker_test/w-0000000020
我在监控:/worker_test/w-0000000020
我在监控:/worker_test/w-0000000020
我在监控:/worker_test/w-0000000020
我在监控:/worker_test/w-0000000020
watchNode-getPrevious:/worker_test/w-0000000020
我重新监控节点:/worker_test/w-0000000020
2018-08-28 02:11:46,684:2486(0x7f28ed0a1700):ZOO_WARN@zookeeper_interest@1570: Exceeded deadline by 15ms
我在监控:/worker_test/w-0000000020
我在监控:/worker_test/w-0000000020
watchNode-getPrevious:/worker_test/w-0000000020
w-0000000020 had deleted
我在监控:/worker_test/w-0000000020
这边发现一个类似bug问题
如果我们直接运行worker.php
在worker.php运行创建的临时顺序节点是不会被watcher到的
我们必须先首先创建好相关的节点再启动监控,不知道这里是不是php版本的zookeeper的bug
有了解的小伙伴可以告之下
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节点时触发
csdn产品小助手
关注
关注
点赞
收藏
评论
PHP和zookeeper结合实践
Zookeeper简单介绍Apache Zookeeper是开发和维护开源服务器的服务,它能够实现高度可靠的分布式协调。安装Zookeeper(无需安装)wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gzt...
复制链接
扫一扫
python连接zookeeper的日志问题
weixin_34290000的博客
07-22
357
用python连接zookeeper时,在终端里,一直会有zookeeper的日志冒出来,这样会很烦。
2014-07-22 10:06:19,544:10474(0x7fd459406700):ZOO_WARN@zookeeper_interest@1557: Exceeded deadline by 11ms
解决方法是在连接后设置一下zookeeper的日志等级为ERROR,这样...
ZooKeeper 避坑实践:如何调优 jute.maxbuffer
最新发布
阿里巴巴云原生的博客
11-30
329
ZooKeeper 避坑实践:如何调优 jute.maxbuffer
参与评论
您还未登录,请先
登录
后发表或查看评论
DeadlineExceeded
mzhan017的博客
11-02
4748
在kubernetes 1.17.4 版本
这两行log 是一行 因为cmd 参数里有换行符导致大印到两行。
描述的含义,kubelet试图再container里执行一个命令,但是timeout,超时了。
Jun 8 04:02:34 all-in-one-01 kubelet: E0608 04:02:34.476604 17869 remote_runtime.go:351] ExecSync 09802cffb93b38777f36ca1bca03c6499cd5b10ea6667a8bc77e
创建ZooKeeper+Mesos集群,三个Master,两个Slave
羊同学
04-12
793
在三台虚拟机上分别部署Mesos及ZooKeeper
可以参考我的另外两篇文章去部署Mesos和ZooKeeper
重新配置静态地址
静态地址需要和/app/zookeeper/conf/zoo.cfg中的地址一致
修改ZooKeeper的myid
修改/var/zookeeper/data/myid,需要和/app/zookeeper/conf/zoo.cfg中的myid一致
启动ZooKeep...
php的zookeeper扩展安装及使用
一路向前ylc
08-14
9184
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
要在php中使用zookeepe...
使用Zookeeper分布式部署PHP应用程序
Daniel's各种笔记
01-21
3556
原文:Distributed application in PHP with Apache Zookeeper
地址:http://systemsarchitect.net/distributed-application-in-php-with-apache-zookeeper/
这篇文章实在不错,实在忍不住翻译下来,希望对大家有用。
Apache Zookeeper是我最近遇到的最酷的技术
Zookeeper客户端API之读取子节点列表(八)
程序新视界
03-26
8391
本篇博客介绍一下Zookeeper原生客户端API提供的获取子节点列表方法。获取子节点列表方法方法Zookeeper原生客户端API提供了以下8中获取子节点列表的方法,每个方法的使用说明参考注释内容:/**
* 返回指定路径下面的子节点列表。
* 如果watcher不为null,并且调用成功(没有异常),会将watcher注册在指定的path
* 上。当path(父节点)被删除或者path下面
Zookeeper如何正确设置和获取watcher
热门推荐
人既无名的专栏
12-04
1万+
Watcher 设置是开发中最常见的,需要搞清楚watcher的一些基本特征,对于exists、getdata、getchild对于节点的不同操作会收到不同的 watcher信息。对父节点的变更以及孙节点的变更都不会触发watcher,而对watcher本身节点以及子节点的变更会触发watcher,具体参照下表。
php 连接zookeeper实例
Daniel's各种笔记
01-22
3738
1、安装成功zookeeper后,在zookeeper 的bin目录下有启动相应的启动脚本
启动Server
./zkServer.sh start
启动client:(*注:cli需要安装java)
zkCli.sh
2、PHP实例:
class ZookeeperDemo e
zookeeper C客户端 do_io线程
飞翔的小蟹
03-27
358
void *do_io(void *v){ zhandle_t *zh = (zhandle_t*)v; fd_set rfds, wfds, efds; struct adaptor_threads *adaptor_threads = zh->adaptor_priv; api_prolog(zh); notify_thread_ready(zh);//通知...
ZooKeeper API使用 I 创建节点
挖坑埋你
08-27
4400
客户端可以通过 ZooKeeper 的 API 来创建一个数据节点,有如下两个接口:
String create(final String path, byte data[], List&lt;ACL&gt; acl, CreateMode createMode)
void create(final String path, byte date[], List&lt;ACL&gt; acl, C...
php zookeeper 使用,PHP中zookeeper的类与方法
weixin_31602525的博客
03-19
493
__construct( $host = ‘‘, $watcher_cb = null, $recv_timeout = 10000)$host:zookeeper的ip和端口,多组信息使用,分隔$watcher_cb:全局监听函数,任何的监听都会执行该回调函数$recv_timeout:会话超时,在zookeeper的服务器中可以设置 minSessionTimeout和maxSessionTi...
PHP扩展 -- 安装zookeeper扩展
猛犸象
08-11
496
PHP安装zookeeper扩展 Linux
PHP:7.1.30
php-config的位置:/usr/bin/php-config
之前安装的zookeeper-3.4.5是解压版的,不需要编译,目录 /usr/local/zookeeper ,这个不动它,需要再安装一个编译版的。
到时候,解压版的
cd /usr/local
wget http://archive.apache.org/d...
zookeeper系列之异步通知模式-Watcher
weixin_30336061的博客
04-17
96
1 watcher种类和事件种类
Watcher种类
1. zookeeper实例化时注入的默认Watcher
2. dataWatchers 一个Map<string Set<Watcher>>数据结构,保存调用getData时 注入的Watcher或者调用exist时path指定的节点存在
3. existWatchers 一个Map<st...
ZooKeeper API使用 I 获取子节点列表
挖坑埋你
08-27
4928
客户端可以通过 ZooKeeper 的 API 来获取子节点列表,有如下8个接口:
/**
* 返回指定路径下面的子节点列表。
* 如果watcher不为null,并且调用成功(没有异常),会将watcher注册在指定的path
* 上。当path(父节点)被删除或者path下面创建/删除子节点,将触发通知watcher。
* 返回结果列表不保证有序性。
*/
public...
Zookeeper中的Watcher机制到底是啥?
SCUTJAY的博客
06-18
1247
文章目录啥是watcher机制通知状态(KeeperState)事件类型(EventType)EventType注册与通知之客户端实现EventType注册与通知之服务端实现EventType注册与通知流程简单代码示例
啥是watcher机制
Zookeeper的watcher机制是其一个非常核心的机制,zookeeper提供的发布/订阅,监听节点变化(如节点的删除,内容的变化,或者子节点状态的变化)等核心功能都是基于watcher机制来是是实现的
而watcher机制的实现其实说白了就是一个观察者模式,只
PhpStorm
Make the world go
07-05
2352
俗话说,工欲善其事必先利其器。作为一名码农,合适开发工具能提高我们的开发效率,而 PhpStorm 是 PHPer 不可或缺的工具,这里整理了一些编码过程中常用的 PhpStorm 使用姿势。安装本文 PhpStorm 版本为 2017.1.1。PhpStorm 在 Win 平台安装比较容易,直接参考 此处 即可。Linux 平台安装相对比较坎坷,请移步 这里。至于注册码,见 @lan yu 提供...
zookeeper心跳机制流程梳理
weixin_30632089的博客
01-19
1440
zookeeper心跳机制流程梳理
Processor链Chain
protected void setupRequestProcessors() {
RequestProcessor finalProcessor = new FinalRequestProcessor(this);
RequestProcessor toBeAppliedProcessor = new ...
看zookeeper源代码庖丁解牛[还是写的很乱,自己看都看不懂了.]
fei33423的专栏
11-02
2374
层次关系, 内存型中间件的也可以有实体. 把实体抽象出来,逻辑抽象出来. 其他就都是内部的BO了.
一个程序的包没有体现出这些,自己就应该去抽象出这些实体类.持久化的实体类.
socket这种都是框架属性,完全可以归属到在业务外的包中.
1.流程:
选举流程: 了解算法.
2.边界:
外部通信边界:
1. QuorumPeer里的 D
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:大白
设计师:CSDN官方博客
返回首页
csdn产品小助手
CSDN认证博客专家
CSDN认证企业博客
码龄7年
暂无认证
168
原创
13万+
周排名
165万+
总排名
120万+
访问
等级
7351
积分
4234
粉丝
183
获赞
20
评论
1181
收藏
私信
关注
热门文章
雷雷日记
31218
微信小程序三种授权登录的方式
19819
网警如何找到你
17194
adb pull 报错处理:adb: error: cannot create file/directory 'E:\': No such file or directory
13313
Solidworks如何将参考平面的图形投影到某曲面上
12677
最新评论
RN调试利器——React Native Debugger
weixin_44331856:
请问android是否也可以使用
BZOJ1114 : [POI2008]鲁滨逊逃生Rob
雨中之舟:
天天偷别人博客,把你玛红茹了就明白了
linux系统关闭指定服务的方式
冰魄少年:
少年,我看你骨骼精奇,不如多敲几行字可好
OGRE: "OgreOverlaySystem.h": No such file or directory
oBaGaLu:
那咋办?
Cisco路由器enable特权模式密码重置
士别三日wyx:
好文,学到了
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
【Java】Hello world
matlab练习程序(构建Hessian矩阵)
[zz]c++可变参数函数使用
2019年418篇
2018年659篇
2017年909篇
2016年502篇
2015年416篇
2014年293篇
2013年313篇
2012年271篇
2011年225篇
2010年140篇
2009年120篇
2008年95篇
2007年70篇
2006年36篇
2005年26篇
2004年9篇
目录
目录
最新文章
【Java】Hello world
matlab练习程序(构建Hessian矩阵)
[zz]c++可变参数函数使用
2019年418篇
2018年659篇
2017年909篇
2016年502篇
2015年416篇
2014年293篇
2013年313篇
2012年271篇
2011年225篇
2010年140篇
2009年120篇
2008年95篇
2007年70篇
2006年36篇
2005年26篇
2004年9篇
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值