DEV Community

Javier Vidal
Javier Vidal

Posted on

3

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.

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay