DEV Community

Javier Vidal
Javier Vidal

Posted on

ZooKeeper cluster with Vagrant

If we want to set up a ZooKeeper cluster in our development environment one way to proceed is defining it in Vagrant.

Let's suppose we want to set up a cluster with 3 nodes (zk1, zk2, and zk3). The Vagrantfile will be:

# -*- mode: ruby -*-
# vi: set ft=ruby :

# rubocop: disable Metrics/BlockLength
Vagrant.configure('2') do |config|
  config.vm.define 'zk1' do |zookeeper|
    zookeeper.vm.box = 'debian/stretch64'
    zookeeper.vm.network :private_network, ip: '192.168.33.211'
    zookeeper.vm.hostname = 'zk1'
    # Configure VM
    zookeeper.vm.provider 'virtualbox' do |vb|
      vb.memory = '256'
      vb.cpus = 2
    end
    # Install and start zookeeper
    zookeeper.vm.provision 'shell', inline: <<-SHELL
      apt update
      apt install -y default-jdk
      mkdir -p /var/lib/zookeeper
      chown vagrant:vagrant /var/lib/zookeeper
      wget http://apache.uvigo.es/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz
      tar xvf apache-zookeeper-3.6.2-bin.tar.gz
      rm apache-zookeeper-3.6.2-bin.tar.gz
      mv apache-zookeeper-3.6.2-bin /opt/zookeeper-3.6.2
      chown -R vagrant:vagrant /opt/zookeeper-3.6.2
      echo -e 'tickTime=2000\ndataDir=/var/lib/zookeeper\nclientPort=2181\ninitLimit=5\nsyncLimit=2\nserver.1=192.168.33.211:2888:3888\nserver.2=192.168.33.212:2888:3888\nserver.3=192.168.33.213:2888:3888' > /opt/zookeeper-3.6.2/conf/zoo.cfg
      echo -e '1' > /var/lib/zookeeper/myid
    SHELL
  end

  config.vm.define 'zk2' do |zookeeper|
    zookeeper.vm.box = 'debian/stretch64'
    zookeeper.vm.network :private_network, ip: '192.168.33.212'
    zookeeper.vm.hostname = 'zk2'
    # Configure VM
    zookeeper.vm.provider 'virtualbox' do |vb|
      vb.memory = '256'
      vb.cpus = 2
    end
    # Install and start zookeeper
    zookeeper.vm.provision 'shell', inline: <<-SHELL
      apt update
      apt install -y default-jdk
      mkdir -p /var/lib/zookeeper
      chown vagrant:vagrant /var/lib/zookeeper
      wget http://apache.uvigo.es/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz
      tar xvf apache-zookeeper-3.6.2-bin.tar.gz
      rm apache-zookeeper-3.6.2-bin.tar.gz
      mv apache-zookeeper-3.6.2-bin /opt/zookeeper-3.6.2
      chown -R vagrant:vagrant /opt/zookeeper-3.6.2
      echo -e 'tickTime=2000\ndataDir=/var/lib/zookeeper\nclientPort=2181\ninitLimit=5\nsyncLimit=2\nserver.1=192.168.33.211:2888:3888\nserver.2=192.168.33.212:2888:3888\nserver.3=192.168.33.213:2888:3888' > /opt/zookeeper-3.6.2/conf/zoo.cfg
      echo -e '2' > /var/lib/zookeeper/myid
    SHELL
  end

  config.vm.define 'zk3' do |zookeeper|
    zookeeper.vm.box = 'debian/stretch64'
    zookeeper.vm.network :private_network, ip: '192.168.33.213'
    zookeeper.vm.hostname = 'zk3'
    # Configure VM
    zookeeper.vm.provider 'virtualbox' do |vb|
      vb.memory = '256'
      vb.cpus = 2
    end
    # Install and start zookeeper
    zookeeper.vm.provision 'shell', inline: <<-SHELL
      apt update
      apt install -y default-jdk
      mkdir -p /var/lib/zookeeper
      chown vagrant:vagrant /var/lib/zookeeper
      wget http://apache.uvigo.es/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz
      tar xvf apache-zookeeper-3.6.2-bin.tar.gz
      rm apache-zookeeper-3.6.2-bin.tar.gz
      mv apache-zookeeper-3.6.2-bin /opt/zookeeper-3.6.2
      chown -R vagrant:vagrant /opt/zookeeper-3.6.2
      echo -e 'tickTime=2000\ndataDir=/var/lib/zookeeper\nclientPort=2181\ninitLimit=5\nsyncLimit=2\nserver.1=192.168.33.211:2888:3888\nserver.2=192.168.33.212:2888:3888\nserver.3=192.168.33.213:2888:3888' > /opt/zookeeper-3.6.2/conf/zoo.cfg
      echo -e '3' > /var/lib/zookeeper/myid
    SHELL
  end
end
# rubocop: enable Metrics/BlockLength
Enter fullscreen mode Exit fullscreen mode

This way we could start the 3 nodes of the cluster with:

vagrant up zk1
vagrant up zk2
vagrant up zk3
Enter fullscreen mode Exit fullscreen mode

This Vagrantfile does not start the ZooKeeper nodes automatically so we will have to start them manually:

vagrant ssh zk1
cd /opt/zookeeper-3.6.2/bin
./zkServer.sh start
Enter fullscreen mode Exit fullscreen mode

I'm sure this Vagrantfile can be improved removing the repeated parts and starting the servers automatically.

Top comments (0)