Zookeeper的PHP实践_一个懂技术的项目经理的博客-CSDN博客_zookeeper php


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

Zookeeper的PHP实践_一个懂技术的项目经理的博客-CSDN博客_zookeeper php
Zookeeper的PHP实践
一个懂技术的项目经理
于 2016-04-06 16:17:02 发布
15771
收藏
分类专栏:
架构
文章标签:
Zookeeper
架构
专栏收录该内容
4 篇文章
0 订阅
订阅专栏
原文:Distributed application in PHP with Apache Zookeeper
地址:http://systemsarchitect.net/distributed-application-in-php-with-apache-zookeeper/
Apache Zookeeper是我最近遇到的最酷的技术,我是在研究Solr Cloud功能的时候发现的。Solr的分布式计算让我印象深刻。你只要开启一个新的实例就能自动在Solr Cloud中找到。它会将自己分派到某个分片中,并确定出自己是一个Leader(源)还是一个副本。不一会儿,你就可以在你的那些服务器上查询到了。即便某些服务器宕机了也可以继续工作。非常动态、聪明、酷。
将运行多个应用程序作为一个逻辑程序并不是什么新玩意。事实上,我在几年前就已写过类似的软件。这种架构比较让人迷惑,使用起来也费劲。为此Apache Zookeeper提供了一套工具用于管理这种软件。
为什么叫Zoo?“因为要协调的分布式系统是一个动物园”。
在本篇文章中,我将说明如何使用PHP安装和集成Apache ZooKeeper。我们将通过service来协调各个独立的PHP脚本,并让它们同意某个成为Leader(所以称作Leader选举)。当Leader退出(或崩溃)时,worker可检测到并再选出新的leader。
ZooKeeper是一个中性化的Service,用于管理配置信息、命名、提供分布式同步,还能组合Service。所有这些种类的Service都会在分布式应用程序中使用到。每次编写这些Service都会涉及大量的修bug和竞争情况。正因为这种编写这些Service有一定难度,所以通常都会忽视它们,这就使得在应用程序有变化时变得难以管理应用程序。即使处理得当,实现这些服务的不同方法也会使得部署应用程序变得难以管理。
虽然ZooKeeper是一个Java应用程序,但C也可以使用。这里就有个PHP的扩展,由Andrei Zmievski在2009创建并维护。你可以从PECL中下载,或从GitHub中直接获取PHP-ZooKeeper。
要使用该扩展你首先要安装ZooKeeper。可以从官方网站下载。
$ tar zxfv zookeeper-3.4.8.tar.gz
$ cd zookeeper-3.4.8/src/c
$ ./configure --prefix=/usr/
$ make
$ sudo make install
这样就会安装ZooKeeper的库和头文件。现在准备编译PHP扩展。
$ cd
$ git clone https://github.com/andreiz/php-zookeeper.git
$ cd php-zookeeper
$ phpize
$ ./configure
$ make
$ sudo make install将“zookeeper.so”添加到PHP配置中。
vim /etc/php5/cli/conf.d/20-zookeeper.ini
因为我不需要运行在web服务环境下,所以这里我只编辑了CLI的配置。将下面的行复制到ini文件中。
extension=zookeeper.so
使用如下命令来确定扩展是否已起作用。
$ php -m | grep zookeeper
zookeeper
现在是时候运行ZooKeeper了。目前唯一还没有做的是配置。创建一个用于存放所有service数据的目录。
$ mkdir /home/you-account/zoo
$ cd
$ cd zookeeper-3.4.5/
$ cp conf/zoo_sample.cfg conf/zoo.cfg
$ vim conf/zoo.cfg
找到名为“dataDir”的属性,将其指向“/home/you-account/zoo”目录。
$ bin/zkServer.sh start
$ bin/zkCli.sh -server 127.0.0.1:2181
[zk: 127.0.0.1:2181(CONNECTED) 14] create /test 1
Created /test
[zk: 127.0.0.1:2181(CONNECTED) 19] ls /
[test, zookeeper]
此时,你已成功连到了ZooKeeper,并创建了一个名为“/test”的znode(稍后我们会用到)。ZooKeeper以树形结构保存数据。这很类似于文件系统,但“文件夹”(译者注:这里指非最底层的节点)又和文件很像。znode是ZooKeeper保存的实体。Node(节点)的说法很容易被混淆,所以为了避免混淆这里使用了znode。
因为我们稍后还会使用,所以这里我们让客户端保持连接状态。开启一个新窗口,并创建一个zookeeperdemo1.php文件。
<?php
class ZookeeperDemo extends Zookeeper {
public function watcher( $i, $type, $key ) {
echo "Insider Watcher\n";
// Watcher gets consumed so we need to set a new one
$this->get( '/test', array($this, 'watcher' ) );
$zoo = new ZookeeperDemo('127.0.0.1:2181');
$zoo->get( '/test', array($zoo, 'watcher' ) );
while( true ) {
echo '.';
sleep(2);
}现在运行该脚本:
$ php zookeeperdemo1.php
此处应该会每隔2秒产生一个点。现在切换到ZooKeeper客户端,并更新“/test”值。
[zk: 127.0.0.1:2181(CONNECTED) 20] set /test foo
这样就会静默触发PHP脚本中的“Insider Watcher”消息。怎么会这样的?
ZooKeeper提供了可以绑定在znode的监视器。如果监视器发现znode发生变化,该service会立即通知所有相关的客户端。这就是PHP脚本如何知道变化的。Zookeeper::get方法的第二个参数是回调函数。当触发事件时,监视器会被消费掉,所以我们需要在回调函数中再次设置监视器。
现在你可以准备创建分布式应用程序了。其中的挑战是让这些独立的程序决定哪个(是leader)协调它们的工作,以及哪些(是worker)需要执行。这个处理过程叫做leader选举,在ZooKeeper Recipes and Solutions你能看到相关的实现方法。
这里简单来说就是,每个处理(或服务器)紧盯着相邻的那个处理(或服务器)。如果一个已被监视的处理(也即Leader)退出或者崩溃了,监视程序就会查找其相邻(此时最老)的那个处理作为Leader。
在真实的应用程序中,leader会给worker分配任务、监控进程和保存结果。这里为了简化,我跳过了这些部分。
创建一个新的PHP文件,命名为worker.php:
<?php
class Worker extends Zookeeper {
const CONTAINER = '/cluster';
protected $acl = array(
array(
'perms' => Zookeeper::PERM_ALL,
'scheme' => 'world',
'id' => 'anyone' ) );
private $isLeader = false;
private $znode;
public function __construct( $host = '', $watcher_cb = null, $recv_timeout = 10000 ) {
parent::__construct( $host, $watcher_cb, $recv_timeout );
public function register() {
if( ! $this->exists( self::CONTAINER ) ) {
$this->create( self::CONTAINER, null, $this->acl );
$this->znode = $this->create( self::CONTAINER . '/w-',
null,
$this->acl,
Zookeeper::<span class="KSFIND_CLASS" id="0KSFindDIV">EPHEMER</span>AL | Zookeeper::SEQUENCE );
$this->znode = str_replace( self::CONTAINER .'/', '', $this->znode );
printf( "I'm registred as: %s\n", $this->znode );
$watching = $this->watchPrevious();
if( $watching == $this->znode ) {
printf( "Nobody here, I'm the leader\n" );
$this->setLeader( true );
else {
printf( "I'm watching %s\n", $watching );
public function watchPrevious() {
$workers = $this->getChildren( self::CONTAINER );
sort( $workers );
$size = sizeof( $workers );
for( $i = 0 ; $i < $size ; $i++ ) {
if( $this->znode == $workers[ $i ] ) {
if( $i > 0 ) {
$this->get( self::CONTAINER . '/' . $workers[ $i - 1 ], array( $this, 'watchNode' ) );
return $workers[ $i - 1 ];
return $workers[ $i ];
throw new Exception( sprintf( "Something went very wrong! I can't find myself: %s/%s",
self::CONTAINER,
$this->znode ) );
public function watchNode( $i, $type, $name ) {
$watching = $this->watchPrevious();
if( $watching == $this->znode ) {
printf( "I'm the new leader!\n" );
$this->setLeader( true );
else {
printf( "Now I'm watching %s\n", $watching );
public function isLeader() {
return $this->isLeader;
public function setLeader($flag) {
$this->isLeader = $flag;
public function run() {
$this->register();
while( true ) {
if( $this->isLeader() ) {
$this->doLeaderJob();
else {
$this->doWorkerJob();
sleep( 2 );
public function doLeaderJob() {
echo "Leading\n";
public function doWorkerJob() {
echo "Working\n";
$worker = new Worker( '127.0.0.1:2181' );
$worker->run();
打开至少3个终端,在每个终端中运行以下脚本:
# term1
$ php worker.php
I'm registred as: w-0000000001
Nobody here, I'm the leader
Leading
# term2
$ php worker.php
I'm registred as: w-0000000002
I'm watching w-0000000001
Working
# term3
$ php worker.php
I'm registred as: w-0000000003
I'm watching w-0000000002
Working
现在模拟Leader崩溃的情形。使用Ctrl+c或其他方法退出第一个脚本。刚开始不会有任何变化,worker可以继续工作。后来,ZooKeeper会发现超时,并选举出新的leader。 虽然这些脚本很容易理解,但是还是有必要对已使用的Zookeeper标志作注释:
$this->znode = $this->create( self::CONTAINER . '/w-',
null,
$this->acl,
Zookeeper::EPHEMERAL | Zookeeper::SEQUENCE );
每个znode都是EPHEMERAL和SEQUENCE的。
EPHEMRAL代表当客户端失去连接时移除该znode。这就是为何PHP脚本会知道超时。SEQUENCE代表在每个znode名称后添加顺序标识。我们通过这些唯一标识来标记worker。
在PHP部分还有些问题要注意。该扩展目前还是beta版,如果使用不当很容易发生segmentation fault。比如,不能传入普通函数作为回调函数,传入的必须为方法。我希望更多PHP社区的同仁可以看到Apache ZooKeeper的好,同时该扩展也会获得更多的支持。
ZooKeeper是一个强大的软件,拥有简洁和简单的API。由于文档和示例都做的很好,任何人都可以很容易的编写分布式软件。让我们开始吧,这会很有趣的。
相关连接: - Yahoo research on ZooKeeper. 非常好的阅读材料,拥有真实的应用程序示例。如果你只要阅读一份ZooKeeper的资料,那么就是这份了。 - PHP ZooKeeper - PHP ZooKeeper API - PHP ZooKeeper example
一个懂技术的项目经理
关注
关注
点赞
收藏
评论
Zookeeper的PHP实践
“Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。本文将从使用者角度详细介绍 Zookeeper 的安装和配置文件中各个配置项的意义,以及分析 Zookeeper 的典型的应用场景(配置文件的管理、集群管理、同步锁、Leader 选举、队列管理等),用 Java 实现它们并给出示例代码。”
复制链接
扫一扫
专栏目录
PHP连接串口程序php_ser
05-10
; Windows Extensions
; Note that ODBC support is built in so no dll is needed for it
; Note that many DLL files are located in the extensions PHP 4 ext PHP 5
; extension folders as well as the separate PECL DLL download PHP 5
; Be sure to appropriately set the extension dir directive
PHP+zookeeper实现分布式锁
大道至简,持之以恒!
07-08
441
1、redis分布式锁,其实需要自己不断去尝试获取锁,比较消耗性能;zk分布式锁,获取不到锁,注册个监听器即可,不需要不断主动尝试获取锁,性能开销较小
2、如果是redis获取锁的那个客户端bug了或者挂了,那么只能等待超时时间之后才能释放锁;而zk的话,因为创建的是临时znode,只要客户端挂了,znode就没了,此时就自动释放锁。...
参与评论
您还未登录,请先
登录
后发表或查看评论
zookeeper-clients:基于zookeeper-lite的ZooKeeper Java客户端
05-09
各种基于ZooKeeper Java客户端和实用程序。
客户群
edu.uw.zookeeper.clients.jmx:使用JMX查询ZooKeeper服务器的实用程序。
edu.uw.zookeeper.clients.random:用于生成随机ZooKeeper客户端请求的实用程序。
edu.uw.zookeeper.clients.trace:用于读取和写入ZooKeeper客户端跟踪文件的实用程序。
edu.uw.zookeeper.clients.trace.GetSetClient:跟踪客户端,该客户端测量getData / setData混合工作负载的延迟和吞吐量
edu.uw.zookeeper.clients.trace.TraceGeneratingCacheClient:跟踪生成随机请求的客户端
edu.uw.zookeeper.clients.trace.T
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...
Zookeeper介绍
最新发布
每天学一点,迟早迈进殿堂。
10-12
133
Zookeeper本身是Hadoop生态园的中的一个组件,Zookeeper强大的功能,在Java分布式架构中,也会频繁的使用到Zookeeper。Zookeeper就是一个文件系统 + 监听通知机制。
使用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是我最近遇到的最酷的技术
php+zookeeper 集群管理
huangweibbk的专栏
11-15
102
本篇主要说下具体zookeeper的一种应用场景:集群管理(图片来自网络)
监听机器的退出加入
上图中所有机器约定在父节点GroupMembers下创建临时节点,然后监听父节点的子节点。一旦有机器挂掉,该机器与zookeeper的连接断开,其所创建的临时节点被删除,所有其他机器都收到通知某个兄弟节点被删除。新机器加入也是类似,所有机器收到通知,有新增临时节点。
在此特别备注下监听父节点下的子节点只能监听到子节点的新增和删除的事件,子节点本身内容变更父节点并不能捕获,如果需要捕获子节点内容变
php 监听端口数据客户端ip_PHP做端口监听示例代码
weixin_33722375的博客
01-14
442
1,PHP端口监听之服务器端复制代码 代码示例:// Server// 设置错误处理error_reporting(E_ALL);// 设置运行时间set_time_limit(0);// 起用缓冲ob_implicit_flush();$ip = "127.0.0.1"; // IP地址$port = 1000; // 端口号$socket = socket_create(AF_INET, SO...
zookeeper php注册发现,php zookeeper常见问题解决方案
weixin_29363945的博客
03-10
104
在《PHP Zookeeper你需要知道的细节》(以下称为php_zk)一章中我们提出了问题,并且通过分析PHP-ZooKeeper源码找出了问题的原因,但是并没有给出解决方法。本章我们就来看一看解决的办法。解决的办法分为两种:一是修改PHP-ZooKeeper源码,重新编译安装二是修改php代码下面我们先来看第一种方式。修改PHP-ZooKeeper源码在php_zk一章中我们看到,其实在zno...
ajax异步_Ajax异步请求PHP服务器,如何做到无阻塞响应
weixin_39519619的博客
11-27
37
文章来自:php自学中心网站链接:http://www.startphp.cn/front/php/0108113.html作者:磊丰商务合作:请加微信(QQ):2230304070文章正文最近发现了一个ajax异步请求的问题,用$.post、$.get、$.ajax请求PHP服务器时,总是无法异步返回数据。经多次测试才发现:-- 不同浏览器,请求不同域名-不阻塞:无需实验-- 不同浏览...
php循环阻塞问题,PHP session阻塞问题
weixin_34618526的博客
03-23
94
php 的 session 默认是已文件形式存储的当用户发起一个session请求 这时php会对存储session的文件进行加锁操作当使用session后php不会立即释放该文件锁会一直等到当前脚本代码全部执行完毕后才会自动释放这个文件锁这样以来当用户在A页面操作session后又执行了过长时间的业务脚本那么会导致当前用户执行其他页面时被A页面的session阻塞住下面做个实验# a.phpse...
php阻塞如何解决,PHP编程中的Session阻塞问题与解决方法分析
weixin_34061200的博客
03-16
183
本文实例讲述了PHP编程中的Session阻塞问题与解决方法。分享给大家供大家参考,具体如下:使用session过程中,在开启session后,同一浏览器,执行同一程序,不同页面会被锁。不同浏览器不会出现这种情况。疑问:是不是session_start导致了阻塞?于是,我写了几个页面测试了一下,发现是session导致了阻塞,而其他两种情况不会造成阻塞。查了下PHP的Bug列表,发现有人提出了这个...
echo 串口发送命令_PHP实现连接设备、通讯和发送命令的方法
weixin_34688966的博客
01-14
585
本文实例讲述了PHP实现连接设备、通讯和发送命令的方法。分享给大家供大家参考。具体如下:开发的BS架构的软件(PHP),需要跟设备进行通讯,在此记录一下,欢迎各位指正:1. 采用php socket技术使用TCP/IP连接设备参数$service_port 连接端口参数$address 发送IP地址参数$in 发送命令function Send_socket_connect($service_po...
Apache添加端口的三种方法(基于ip、端口、域名)
m0_56085137的博客
05-16
700
1.1安装httpd
# yum install httpd -y
1.2禁用默认的主机模式
# vim /etc/httpd/conf/httpd.conf
添加以下内容
#DocumentRoot "/var/www/html"
2.基于IP的虚拟主机配置
2.1为主机添加多个IP
# ip addr show dev eth0 #查看原有IP
# ip addr add 192.168.137.201/24 dev eth0 #添加一个IP
php连接zookeeper错误,php 连接zookeeper实例
weixin_39653361的博客
03-11
40
1、安装成功zookeeper后,在zookeeper 的bin目录下有启动相应的启动脚本启动Server./zkServer.sh start启动client:(*注:cli需要安装java)zkCli.sh2、PHP实例:class ZookeeperDemo extends Zookeeper {public function watcher( $i, $type, $key ) {...
php串口接收数据程序,如何对串口接收、发送数据进行侦听
weixin_29255731的博客
03-26
136
sysinternal.com有个Portmon的程序,但只有四个文件,且全是用户态的程序。它是这样解释的:How it Works: WinNTThe Portmon GUI is responsible for identifying serial and parallel ports. It does so by enumerating the serial ports that are c...
php的zookeeper扩展安装及使用
一路向前ylc
08-14
9184
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
要在php中使用zookeepe...
PHP安装zookeeper扩展(最新基于zookeeper-3.5.8)
疯狂老司机的博客
05-19
1182
PHP安装zookeeper扩展一、安装依赖(已Centos为例)二、安装Cppunit测试库三、安装zookeeper-client四、安装PHP zookeeper扩展
刚开始尝试pecl install zookeeper,结果发现找不到zookeeper依赖。网上的编译安装都是基于zookeeper-3.4.12.tar.gz,但是现在zookeeper稳定版本已经是apache-zookeeper-3.5.8,最新版本已经到了3.6,找不到旧的安装包了,新版安装方式有点不一样,在此分享出来给有需要
php 如何 监视串口_陪孩子一起学Arduino师训 第10课 串口监视器
weixin_39636333的博客
12-06
198
一、学生情况分析上一节课学习了传感器的概念、接线及其编程方法,当我们知道传感器的数值与外界的变化规律后,使用传感器其实比较简单,这节课学习串口监视器串口监视器主要目标是为了测试传感器的数值,掌握好串口监视器的使用,学生们就可以自己去摸索一些新的传感器的使用方法了,另外串口监视器也是程序调试中最重要的工具,为以后的深入学习打下基础。二、教学目标1.了解什么是串口与串口监视器2、理解串口监视器的工作过...
PHP分布式部署服务器,使用Zookeeper分布式部署PHP应用程序
weixin_39717825的博客
03-09
102
Zookper是一种分布式的,开源的,应用于分布式应用的协作服务。它提供了一些简单的操作,使得分布式应用可以基于这些接口实现诸如同步、配置维护和分集群或者命名的服务。Zookper很容易编程接入,它使用了一个和文件树结构相似的数据模型。虽然ZooKeeper是一个Java应用程序,但C也可以使用。这里就有个PHP的扩展,你可以从PECL中下载,或从GitHub中直接获取PHP-ZooKeeper。...
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:大白
设计师:CSDN官方博客
返回首页
一个懂技术的项目经理
CSDN认证博客专家
CSDN认证企业博客
码龄21年
暂无认证
原创
14万+
周排名
62万+
总排名
20万+
访问
等级
1252
积分
59
粉丝
62
获赞
评论
80
收藏
私信
关注
热门文章
MQ消息中间件技术
52489
TCP/IP协议原理
39215
运用RUP 4+1视图方法进行软件架构设计
21620
Zookeeper的PHP实践
15771
USBWriter 使用手册
14288
分类专栏
架构
4篇
架构师
1篇
系统
5篇
架构基础
2篇
区块链
最新评论
运用RUP 4+1视图方法进行软件架构设计
一个懂技术的项目经理:
已补图
运用RUP 4+1视图方法进行软件架构设计
进击的小丸子晴天依旧:
图片全挂了
运用RUP 4+1视图方法进行软件架构设计
qq_27271817:
写的很清楚,帮助梳理一种思考方式
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
Supervisord用来管理基于Thinkphp客户端生成的Swoole服务
MongoDB副本模式在视频行业的应用实践
CDN网络访问原理
2020年1篇
2016年10篇
目录
目录
分类专栏
架构
4篇
架构师
1篇
系统
5篇
架构基础
2篇
区块链
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值