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)