在工作中,很多时候要和客户演示couchbase集群的构建,管理和客户端连接使用等,发现基于vagrant和virtualbox 可以非常便捷的搭建演示环境,总结步骤如下,供对couchbase感兴趣的开发人员参考:
环境要求:
我使用的是mac OS,所以在我们部署节点之前,确认已经安装Vagrant 和VirtualBox, 对于mac很简单,下载对应的.dmg文件,然后点击安装。安装成功后,创建一个路径存放Vagrant的配置文件 Vagrantfile. 为了简单,我创建的路径名字叫 “vagrant”。
在你新创建的路径下,需要创建一个 Vagrantfile
.它的作用像是vagrant的makefile, Vagrant 通过它知道,我们想怎么样来部署我们的节点。我们没有通过这个配置文件来配置操作系统之上的软件,例如Couchbase的安装,软件的安装我们通过puppet在另外的配置中完成。 看看如下我使用的Vagrantfile的例子:
Vagrant.configure("2") do|config|
#Number of nodes to provision
numNodes = 4
#IP Address Base for private network
ipAddrPrefix = "192.168.56.10"
#Define Number of RAM for each node
config.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--memory", 1024]
end
#Provision the server itself with puppet
config.vm.provision :puppet
#Download the initial box from this url
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
#Provision Config for each of the nodes
1.upto(numNodes) do |num|
nodeName = ("node" + num.to_s).to_sym
config.vm.define nodeName do |node|
node.vm.box = "precise64"
node.vm.network :private_network, ip: ipAddrPrefix + num.to_s
node.vm.provider "virtualbox" do |v|
v.name = "Couchbase ServerNode " + num.to_s
end
end
end
end
这个配置文件是用来配置Vagrant的ruby 代码,我们一起来看一下每一个directive以及是什么作用。
# Number of nodes to provision
numNodes = 4
# IP Address Base for private network
ipAddrPrefix = "192.168.56.10"
# Define Number of RAM for each node
config.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--memory", 1024]
end
这段配置,实现了为虚拟机增加内存设置,默认情况下虚机的内存配置是小于512M,我基于我的机器环境,给每个1G内存。你可以根据自己的机器环境进行设置
# Provision the server itself with puppet
config.vm.provision :puppet
因为我们使用puppet来为虚机配置软件安装,所以上面的配置告诉Vagrant使用puppet
# Download the initial box from this url
config.vm.box_url = "<em>vagrant base box you want to use</em>"
Vagrant使用预定义好的介质,所以我们不需要从头来配置OS环境,我的环境中,使用的时Ubuntu12.04 64bit box,你可以根据需要选择.
# Provision Config for each of the nodes
upto(numNodes) do |num|
nodeName = ("node" + num.to_s).to_sym
config.vm.define nodeName do |node|
node.vm.box = "precise64"
node.vm.network :private_network, ip: ipAddrPrefix + num.to_s
node.vm.provider "virtualbox" do |v|
v.name = "Couchbase Server Node " + num.to_s
end
end
end
这段代码进行了虚机的配置,循环的对每一台被创建出来的虚机设置了IP地址和制定一个机器名,如果你想添加每个虚机节点级别的设置,就使用node代码段,不然虚机就会使用整个集群范围的设置,在config端的设置。
如果我们现在运行在这个路径下运行Vagrant up命令,我们会得到四个Ubuntu的继续,可以使用SSH连接进去,但是没有其他的软件安装在OS上,所以为了让我们的虚机默认有Couchbase Server安装配置好,我们使用Puppet,Puppet是一个系统的自动化软件,在部署环境上非常简单好用。Vagrant对Puppet的支持非常好,配置步骤如下,在当前路径下创建一个manifests文件夹,并在manifests中创建一个default.pp文件。代码如下:
exec { "couchbase-server-source":
command => "/usr/bin/wget http://packages.couchbase.com/releases/2.0.1/couchbase-server-enterprise_x86_64_2.0.1.deb",
cwd => "/home/vagrant/",
creates => "/home/vagrant/couchbase-server-enterprise_x86_64_2.0.1.deb",
before => Package['couchbase-server']
}
exec { "install-deps":
command => "/usr/bin/apt-get install libssl0.9.8",
before => Package['couchbase-server']
}
package { "couchbase-server":
provider => dpkg,
ensure => installed,
source => "/home/vagrant/couchbase-server-enterprise_x86_64_2.0.1.deb"
}
让我们逐一看一下default.pp里面的每一段代码的作用。
exec { "couchbase-server-source":
command => "/usr/bin/wget http://packages.couchbase.com/releases/2.0.1/couchbase-server-enterprise_x86_64_2.0.1.deb",
cwd => "/home/vagrant/",
creates => "/home/vagrant/couchbase-server-enterprise_x86_64_2.0.1.deb",
before => Package['couchbase-server']
}
我们在Puppet中定义我们需要运行的带,上面代码执行了wget,然后把文件存储在用户的home路径下,在我的例子里,我让puppet去下载debian平台的couchbase 安装介质;注意,package的安装任务有一个“before”依赖,因为文件的下载不完成,我们不能开始进行安装。
exec { "install-deps":
command => "/usr/bin/apt-get install libssl0.9.8",
before => Package['couchbase-server']
}
我们还需要在每个节点上安装libss10.9.8, 这是安装couchbase需要的唯一的依赖包。我们使用OS的命令行工具apt-get 来安装。
package { "couchbase-server":
provider => dpkg,
ensure => installed,
source => "/home/vagrant/couchbase-server-enterprise_x86_64_2.0.1.deb"
}
最后,我们可以进行couchbase server debian安装包的安装了,因为介质已经下载完毕并且放在虚机的路径,而且依赖包也安装好了。
当然,我的puppet配置非常简单,因为我的目的就是快速部署4个节点的couchbase 集群,你可以根据自己的软件需要添加puppet配置步骤。使用我目前的配置,如果我要更新couchbase server的版本,只需要在default.pp 中,更换需要下载的couchbase server 版本即可。
现在,如果你在当前路径下运行vagrant up,就可以得到couchbase server的集群了。也可用使用vagrant provision在节点运行的时候来应用puppet的配置,无需重新停止和启动vagrant虚机。
运行的输出如下:
Bringing machine 'node1' up with 'virtualbox' provider... Bringing machine 'node2' up with 'virtualbox' provider... Bringing machine 'node3' up with 'virtualbox' provider... Bringing machine 'node4' up with 'virtualbox' provider... [node1] Clearing any previously set forwarded ports... [node1] Creating shared folders metadata... [node1] Clearing any previously set network interfaces... [node1] Preparing network interfaces based on configuration... [node1] Forwarding ports... [node1] -- 22 => 2222 (adapter 1) [node1] Running any VM customizations... [node1] Booting VM... [node1] Waiting for VM to boot. This can take a few minutes. [node1] VM booted and ready for use! [node1] Configuring and enabling network interfaces... [node1] Mounting shared folders... [node1] -- /vagrant [node1] -- /tmp/vagrant-puppet/manifests [node1] Running provisioner: puppet... Running Puppet with default.pp... stdin: is not a tty notice: /Stage[main]//Exec[install-deps]/returns: executed successfully notice: Finished catalog run in 0.77 seconds .... more for all the other nodes.
现在,你可以使用浏览器来访问192.168.56.10[1-4] 的8091端口,来使用couchbase集群了;使用我完毕时,用vagrant hlat命令来停止虚机;也可以使用vagrant suspend来将虚机的状态保存到磁盘上,加快下一次启动的速度;如果你只想使用单个节点,而不是整个集群,可以在启动时指定需要启动的节点。例如,只想使用第一个节点,那么用命令vagant up node1来进行启动。
总结一下,我发现vagrant和virtual box可以快速的帮我构建couchbase server的集群,更改一行代码就可以指定需要的版本,最方便的是,我可以将我的配置文件共享给客户,方便他们的开发和测试部署。