System for quickly and painlessly provisioning Couchbase Server virtual machines across multiple Couchbase versions and OS's.
If vagrant and VirtualBox are installed, it is very easy to get started with a 4 node cluster.
See this blog post for more info: http://nitschinger.at/A-Couchbase-Cluster-in-Minutes-with-Vagrant-and-Puppet
Just change into the appropriate directory and call vagrant up
. Everything else will be done for you, but you need
internet access.
Additionally, you can specify the number of nodes to provision from the command line by using the environment variable VAGRANT_NODES. For example: VAGRANT_NODES=3 vagrant up
will provision a 3 node cluster. If you do not specify a number a 4 node cluster will be created by default. VAGRANT_CPUS
and VAGRANT_RAM
are also available.
Base range:10.xxx.yyy.10n where xxx and yyy are based on the Operating System and Couchbase Server versions, and n is the node number:
OS | xxx |
---|---|
centos5 | 110 |
centos6 | 111 |
centos7 | 112 |
centos6u4 | 113 |
debian7 | 120 |
debian8 | 121 |
opensuse11 | 130 |
opensuse12 | 131 |
ubuntu10 | 140 |
ubuntu12 | 141 |
ubuntu14 | 142 |
windows | 150 |
Couchbase | yyy |
---|---|
1.8.1 | 51 |
2.0.1 | 56 |
2.1.1 | 61 |
2.2.0 | 65 |
2.5.0 | 70 |
2.5.1 | 71 |
2.5.2 | 72 |
3.0.0 | 80 |
3.0.1 | 81 |
3.0.2 | 82 |
3.0.3 | 83 |
3.1.0 | 90 |
3.1.1 | 91 |
4.0.0 | 100 |
4.1.0 | 110 |
4.1.1 | 111 |
4.5.0-DP1 | 150 |
4.5.0-testing | 151 |
cbdev | 200 |
Thus the first Ubuntu12 box running 3.0.3 will have the IP Address 10.141.83.101, and the second Centos6 box running version 4.0.0 will have 10.111.100.102.
The hostname of the VM will be set based on the version of Couchbase Server and of the OS selected, e.g.:
node1-cb303-ubuntu12.vagrants
node2-cb400-centos6.vagrants
If the user has the landrush plugin installed, the TLD will be set to .vagrants
. This
allows the hostname to be queried from both the host and the guests. For more details
see the landrush README.
If the user has the vagrant-cachier plugin installed, a per-box cache (for e.g. APT, RPM), will be maintained in ~/.vagrant.d/cache/<BOX_NAME>/
. For more details see the vagrant-cachier README.
The subdirectory cbdev_ubuntu_1204
contains a Vagrant configuration for
building Couchbase from source; for Ubuntu 12.04. With this you should be able to build the master branch with the following:
outside on host:
cd cbdev_ubuntu_1204
vagrant up; vagrant ssh
inside vagrant VM:
mkdir couchbase; cd couchbase
repo init -u git://github.com/couchbase/manifest -m branch-master.xml
repo sync
sudo make
cd ns_server; ./cluster_run --nodes=1
To build a specific release, change the branch-master.xml
file to be one of the release files from the manifests repository. Look for filenames of the form rel-X.x.x.xml
.
e.g. to build 2.5.1 from source you would change the above repo init
command to be:
repo init -u git://github.com/couchbase/manifest -m rel-2.5.1.xml
See https://github.com/couchbase/tlm/ more information on building Couchbase from source.
Vagrant by default uses Virtualbox as the VM hypervisor. This is a good general-purpose solution, but is not as performant compared to KVM, particulary for SMP, network-heavy workloads.
Vagrant can instead be configured to use KVM as it backend, using the vagrant-libvirt plugin.
Note: KVM and Virtualbox VMs cannot both run at the same time - if you try to start a KVM VM when a Virtualbox VM is running, the KVM VM will not start (and vice versa).
This requires:
- A one-off configuration of the KVM plugin into Vagrant.
- For each VM: a. Ensuring the base-box is available for libvirt b. Any backend-specific settings (CPUs, memory) are also set for libvirt.
Follow the installation instructions at the plugin's homepage
Most of the Vagrant settings for a VM will work unchanged between Virtualbox and KVM, however there are two exceptions. Firstly a base box supporting libvirt is needed - the easiest method is to convert an existing (non-libvirt) basebox to libvirt format.
The Vagrant-Mutate plugin is the simplest method, as it can directly convert an existing base-box to libvirt.
-
Install vagrant-mutate with:
$ vagrant plugin install vagrant-mutate
-
Determine the box which needs converting. This is a one-off process for each box you wish to use. The easiest way to do this is to attempt to start the (non-libvirt) VM you wish to use, and note the name of the box in the Vagrant error message - for example:
$ vagrant up --provider=libvirt node1 ... The box you're attempting to add doesn't support the provider you requested. Please find an alternate box or use an alternate provider. Double-check your requested provider to verify you didn't simply misspell it. Name: centos-6.5-64 Address: https://vagrantcloud.com/puppetlabs/centos-6.5-64-puppet Requested provider: [:libvirt]
Make a note of the box name (
centos-6.5-64
here). -
If you have not yet downloaded the box then the vagrant-mutate plugin will fail to find the box to convert. In this case you will want to manually download the box as covered in the boxes section of the vagrant documentation. For example:
$ vagrant box add centos-6.5-64
-
Use
vagrant mutate
to create a libvirt version of the box.$ vagrant mutate centos-6.5-64 libvirt
If you have set hardware-level settings (memory, CPU count) in the Vagrantfile for virtualbox then these need an equivilent setting for libvirt. For example, the virtualbox settings:
config.vm.provider "virtualbox" do |vb|
vb.memory = 2048
vb.cpus = 2
end
Will require an equivilent, additional stanza for libvirt adding to the Vagrantfile:
config.vm.provider :libvirt do |libvirt|
libvirt.memory = 2048
libvirt.cpus = 2
end
See the Domain Specific Options in the vagrant-libvirt documentation for a complete list of possible options.
You should now be able to bring up the VM using libvirt (KVM):
$ vagrant up --provider=libvirt node1
Note that most (all?) normal vagrant commands should work as before
(vagrant ssh, vagrant halt, etc), the only important different is to
specify --provider=libvirt
to the vagrant up
command. Alternatively you can make this the default by setting
$ export VAGRANT_DEFAULT_PROVIDER=libvirt
To reduce code duplication and ease maintenance faffery this repo makes heavy use of vagrants ability to join multiple vagrant files together. As such you should only ever have to change the top level Vagrant file and puppet.pp.
Clone any of the existing directories and add any required values to the ip_addresses and couchbase_download_links hashes in the top level Vagrant file.
Clone any of the existing directories and add an entry in the vagrant_boxes hash in the top level Vagrant file. You may also have to adjust the startup routine in puppet.pp.