Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Configuration provisioning with Apache Zookeeper
Search
Mariusz Gil
May 20, 2013
Programming
1.1k
6
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Configuration provisioning with Apache Zookeeper
Mariusz Gil
May 20, 2013
More Decks by Mariusz Gil
See All by Mariusz Gil
Aspect Oriented Programming
mariuszgil
1
340
Designing and implementing GraphQL API
mariuszgil
1
100
Discovering unknown with EventStorming ConFoo
mariuszgil
0
320
Game of Developer Life... Deconstructed
mariuszgil
1
190
Back to forgotten roots
mariuszgil
1
430
Go micro with microservices
mariuszgil
5
710
Machine Learning for the rescue
mariuszgil
0
450
Discovering graph structures
mariuszgil
3
560
Introduction to Aerospike with PHP
mariuszgil
8
870
Other Decks in Programming
See All in Programming
AI駆動開発勉強会 広島支部 第一回勉強会 AI駆動開発概要とワークショップ
hayatoshimiu
0
440
CLIであることを活かしたGitHub Copilot CLI活用術 / GitHub Copilot CLI Pro Tips & Tricks
nao_mk2
1
1.2k
AI時代のUIはどこへ行く?その2!
yusukebe
19
6.6k
SPMマルチモジュールで テストカバレッジを取得する技法
yosshi4486
0
140
tsserverとは何だったのか、これからどうなるのか
nowaki28
1
450
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
550
さぁV100、メモリをお食べ・・・
nilpe
0
130
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
130
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
12k
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
120
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
110
Swiftのレキシカルスコープ管理
kntkymt
0
210
Featured
See All Featured
RailsConf 2023
tenderlove
30
1.5k
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
Mind Mapping
helmedeiros
PRO
1
230
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
370
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
1.6k
Believing is Seeing
oripsolob
1
140
Building the Perfect Custom Keyboard
takai
2
780
Bash Introduction
62gerente
615
210k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
570
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
600
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
150
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
400
Transcript
Zookeeper CONFIGURATION PROVISIONING WITH... mariusz gil
About me
None
None
Coordination service for distributed applications and systems
/app/feat_3 /app/f_2 /app/f_1 /servers /app In-memory file system model /
clients zookeeper cluster leader
7use cases name service configuration group membership leader election barriers
queues locks
many projects Apache Accumulo Apache Hadoop MapReduce Apache HBase Apache
Hedwig Apache Kafka Apache S4 Apache Solr Apache Storm Mesos Neo4J
ZooKeeper usage
Installation wget http://ftp.ps.pl/pub/apache/zookeeper/stable/zookeeper-3.4.5.tar.gz touch conf/zoo.cfg vim conf/zoo.cfg # STANDALONE ENVIRONMENT
# tickTime=2000 # dataDir=/var/zookeeper # clientPort=2181 # DISTRIBUTED ENVIRONMENT # tickTime=2000 # dataDir=/var/zookeeper # clientPort=2181 # initLimit=5 # syncLimit=2 # server.1=zoo1:2888:3888 # server.2=zoo2:2888:3888 # server.3=zoo3:2888:3888 bin/zkServer.sh start
CLI mode bin/zkServer.sh start bin/zkCli.sh 127.0.0.1:2181 [zk: localhost:2181(CONNECTED) 31] help
ZooKeeper -server host:port cmd args connect host:port get path [watch] ls path [watch] set path data [version] rmr path delquota [-n|-b] path quit printwatches on|off create [-s] [-e] path data acl stat path [watch] close ls2 path [watch] history listquota path setAcl path acl getAcl path sync path redo cmdno addauth scheme auth delete path [version]
CLI mode bin/zkServer.sh start bin/zkCli.sh 127.0.0.1:2181 [zk: localhost:2181(CONNECTED) 8] ls
/ [zookeeper] ... [zk: localhost:2181(CONNECTED) 17] create /app/features/pymk '' Created /app/features/pymk [zk: localhost:2181(CONNECTED) 20] create /app/features/pymk/enabled 0 Created /app/features/pymk/enabled [zk: localhost:2181(CONNECTED) 24] set /app/features/pymk/enabled 1 [zk: localhost:2181(CONNECTED) 28] get /app/features/pymk/enabled 1 [zk: localhost:2181(CONNECTED) 26] ls /app/features [pymk, login, friends, messages] [zk: localhost:2181(CONNECTED) 29] rmr /app/features [zk: localhost:2181(CONNECTED) 30] ls /app [] bin/zkServer.sh stop
PHP + ZooKeeper
Edit config.prod.yml file Commit to repo Wait for CI report
Build app package Deploy to production
ZooKeeper cluster Web workers Tasks workers
None
$ cd $ git clone https://github.com/andreiz/php-zookeeper.git $ cd php-zookeeper $
phpize $ ./configure $ make $ sudo make install Installation of PHP extensions
<?php class Zookeeper_Example { // ... /** * Set a
node to a value. */ public function set($path, $value) { if (!$this->zookeeper->exists($path)) { $this->makePath($path); $this->makeNode($path, $value); } else { $this->zookeeper->set($path, $value); } } /** * Equivalent of "mkdir -p" on ZooKeeper */ public function makePath($path, $value = '') { $parts = explode('/', $path); $parts = array_filter($parts); $subpath = ''; while (count($parts) > 1) { $subpath .= '/' . array_shift($parts); if (!$this->zookeeper->exists($subpath)) { $this->makeNode($subpath, $value); } } } Example 1 Simple configuration client <?php $zk = new Zookeeper_Example('localhost:2181'); var_dump($zk->get('/')); var_dump($zk->getChildren('/')); var_dump($zk->set('/test123', 'abc')); var_dump($zk->get('/test123')); var_dump($zk->getChildren('/')); var_dump($zk->set('/foo/001', 'bar1')); var_dump($zk->set('/foo/002', 'bar2')); var_dump($zk->getChildren('/foo')); Tekst
<?php class ZookeeperDemo extends Zookeeper { /** * Watcher method
*/ public function watcher( $i, $type, $key ) { echo "Insider Watcher / "; echo "New value for $key is " . $this->get( '/test', array($this, 'watcher' ) ) . "\n"; } } $zoo = new ZookeeperDemo('localhost:2181'); $zoo->get( '/test', array($zoo, 'watcher' ) ); while( true ) { echo '.'; sleep(2); } Example 2 Key change watcher
<?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::EPHEMERAL | Zookeeper::SEQUENCE ); $this->znode = str_replace( self::CONTAINER .'/', '', $this->znode ); Example 3 Multiple workers with automatic leader election # console 1 $ php example_worker.php I'm registred as: w-0000000001 Nobody here, I'm the leader Leading # console 2 $ php example_worker.php I'm registred as: w-0000000002 I'm watching w-0000000001 Working # console 3 $ php example_worker.php I'm registred as: w-0000000003 I'm watching w-0000000002 Working
DevOp life?
OMG! I have to disable feature X for a while
and change database schema, but the rest of the app should works... set /app/feature/pymk/enabled 0 ALTER TABLE... set /app/feature/pymk/enabled 1
OMG! I have to add more cache instances and distribute
traffic across many servers set /servers/cache/c6/host 192... set /servers/cache/c6/port 11211 set /servers/cache/c7/host 192... set /servers/cache/c7/port 11211 ls /servers/cache
leader zookeeper cluster service provider 192.168.12.201 client 192.168.12.201
leader zookeeper cluster client service provider 192.168.12.201 service provider 192.168.12.123
192.168.12.123
Your app should only know... ...where your ZooKeeper is
Zookeeper CONFIGURATION PROVISIONING WITH... mariusz gil THANKS