Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Configuration provisioning with Apache Zookeeper

Configuration provisioning with Apache Zookeeper

Mariusz Gil

May 20, 2013
Tweet

More Decks by Mariusz Gil

Other Decks in Programming

Transcript

  1. Zookeeper
    CONFIGURATION PROVISIONING WITH...
    mariusz gil

    View Slide

  2. About me

    View Slide

  3. View Slide

  4. View Slide

  5. Coordination service for
    distributed applications and systems

    View Slide

  6. /app/feat_3
    /app/f_2
    /app/f_1
    /servers
    /app
    In-memory file system model
    /

    View Slide

  7. clients
    zookeeper cluster
    leader

    View Slide

  8. 7use cases name service
    configuration
    group membership
    leader election
    barriers
    queues
    locks

    View Slide

  9. many projects Apache Accumulo
    Apache Hadoop MapReduce
    Apache HBase
    Apache Hedwig
    Apache Kafka
    Apache S4
    Apache Solr
    Apache Storm
    Mesos
    Neo4J

    View Slide

  10. ZooKeeper usage

    View Slide

  11. 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

    View Slide

  12. 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]

    View Slide

  13. 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

    View Slide

  14. PHP + ZooKeeper

    View Slide

  15. Edit config.prod.yml file
    Commit to repo
    Wait for CI report
    Build app package
    Deploy to production

    View Slide

  16. ZooKeeper cluster
    Web workers Tasks workers

    View Slide

  17. View Slide

  18. $ cd
    $ git clone https://github.com/andreiz/php-zookeeper.git
    $ cd php-zookeeper
    $ phpize
    $ ./configure
    $ make
    $ sudo make install
    Installation of PHP extensions

    View Slide

  19. 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
    $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

    View Slide

  20. 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

    View Slide

  21. 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

    View Slide

  22. DevOp life?

    View Slide

  23. 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

    View Slide

  24. 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

    View Slide

  25. leader
    zookeeper cluster
    service provider
    192.168.12.201
    client
    192.168.12.201

    View Slide

  26. leader
    zookeeper cluster
    client
    service provider
    192.168.12.201
    service provider
    192.168.12.123
    192.168.12.123

    View Slide

  27. Your app should only know...
    ...where your ZooKeeper is

    View Slide

  28. Zookeeper
    CONFIGURATION PROVISIONING WITH...
    mariusz gil
    THANKS

    View Slide