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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
350
Designing and implementing GraphQL API
mariuszgil
1
120
Discovering unknown with EventStorming ConFoo
mariuszgil
0
330
Game of Developer Life... Deconstructed
mariuszgil
1
200
Back to forgotten roots
mariuszgil
1
450
Go micro with microservices
mariuszgil
5
720
Machine Learning for the rescue
mariuszgil
0
460
Discovering graph structures
mariuszgil
3
570
Introduction to Aerospike with PHP
mariuszgil
8
880
Other Decks in Programming
See All in Programming
Building an Out-of-Order CPU
latte72
1
710
typoなんかねぇよ
raspython3
0
670
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
460
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
2
350
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
130
「AI時代、配布するPythonコードをどう守るか: 難読化の実験と判断軸」 #PyconJP2026
pkshadeck
PRO
2
170
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
2
500
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
3
1.5k
LoopHub - ローカルで動く GitHub で、AI と共同開発
jugyo
0
450
高専キャリア LT 発表内容
crysta1221
6
5.6k
Discordを用いたラボオートメーション関連情報収集の自動化
noguhiro2002
0
510
まだ間に合う!今年の夏こそSchemeのマクロ展開器を完全理解!
omasanori
0
640
Featured
See All Featured
Docker and Python
trallard
47
4.2k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
260
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
200
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
Navigating Weather and Climate Data
rabernat
0
510
Building an army of robots
kneath
306
46k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
520
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
650
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Exploring anti-patterns in Rails
aemeredith
3
500
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.9k
Why Our Code Smells
bkeepers
PRO
340
58k
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