1、安装成功zookeeper后,在zookeeper 的bin目录下有启动相应的启动脚本
启动Server
./zkServer.sh start
启动client:(*注:cli需要安装java)
zkCli.sh
2、PHP实例:
<?php class ZookeeperDemo extends Zookeeper{ public function watcher($i, $type, $key ) { echo "InsiderWatcher\n" ; // Watcher gets consumedso 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); }
leader与worker任务的分配:
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:: EPHEMERAL| Zookeeper::SEQUENCE ); $this-> znode =str_replace( self :: CONTAINER . '/' , '' ,$this-> znode ); printf( "I'm registredas: %s\n" , $this-> znode ); $watching = $this->watchPrevious(); if ($watching == $this-> znode ){ printf( "Nobodyhere, 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 thenew leader!\n" ); $this->setLeader( true ); } else { printf( "Now I'mwatching %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个php进程,查看脚本的运行。
进程1:
[iyunv@localhost zookeeper]# php -f worker.php
I'm registred as: w-0000000010
Nobody here, I'm the leader
Leading
进程2:
[daniel.luo@localhost zookeeper]$ php -f worker.php
I'm registred as: w-0000000011
I'm watching w-0000000010
Working
进程3:
[daniel.luo@localhost zookeeper]$ php -f worker.php
I'm registred as: w-0000000012
I'm watching w-0000000011
Working
ctrl + c 关闭leader进程后,会发现进程2与3会选举出新的leader
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com