使用Eucalyptus打造自己的云测试平台(CentOS+Apache+MySQL)
云计算旨在为应用程序按需提供方便和可扩展的计算资源和IT服务,它也为测试平台带来了一种新的解决方案。基于云的测试平台提供自动横向和纵向扩展的测试基础设施,剔除了传统测试平台的许多不足和挑战。
传统的测试环境通常是生产环境的按比例缩小版本。要建立一个测试环境需要大量的时间和精力,因为安装过程包括大量艰巨的任务,如购买合适的硬件基础设施(包括应用服务器,数据库服务器,Web服务器等),安装需要的软件(如应用,数据库,测试工具,如果需要的话还有监控工具)。
本文介绍如何使用各种开源技术在云中搭建一个测试平台,你可以使用它作为一个指导建立你自己的云测试平台。下面是我搭建测试平台用到的开源技术:
- 安装CentOS 5.2的机器:它们将作为云,集群和节点控制器。(文档)
- Eucalyptus 1.5.1:一个开源基础设施,它是计算机集群上云计算的实现。(下载)
- Apache Tomcat 6.0.14:它是最流行的开源Servlet容器。(下载)
- Jakarta JMeter 2.3.2:这个开源工具的目的是执行负载测试和功能行为分析,以及测量应用程序性能,主要是Web应用程序。(下载)
- MySQL 5.0:它是最流行的关系数据库管理系统,提供多用户访问的数据库。(下载)
- 预封装的CentOS 5.2镜像:它作为创建Tomcat,JMeter和MySQL镜像的基础镜像。
- JPetStore Web应用程序:这个简单的应用程序是J2EE平台在现实应用程序设计中的一个工作示范。(项目地址)
在动手之前,你需要了解云计算和Eucalyptus工作原理的基本知识。
云测试环境组件
我们的实验环境由四台机器组成,一台是2GB内存的机器,其它三台内存均是1GB,如图1所示。全部安装CentOS 5.2:
- Eucalyptus云和集群相关的RPM包安装在2GB内存的机器上,担任云和集群控制器;
- 其余三台机器作为节点控制器,只安装节点RPM软件包;
- 其中一台机器安装JMeter作为JMeter主服务器(关于Eucalyptus安装说明,请参考Eucalyptus管理员指南)。
图 1 云测试环境由四台机器组成
下面的镜像是在搭建测试环境时要使用到的:
- Tomcat镜像:用于应用程序部署。
- MySQL镜像:用于数据库部署。
- JMeter镜像:用于测试和监控。
为云测试环境创建镜像
这一部分我们将介绍如何创建前面列出的三种镜像,包含必要的步骤和相关脚本。你可以从任意CentOS 5.2机器创建镜像,在开始之前,我们需要一个预封装的CentOS 5.2镜像。
创建Tomcat镜像
预封装的CentOS镜像已经挂载到本地目录,第一步是创建一个挂载镜像的目录,打开命令提示符窗口,执行下面的命令:
# 创建目录 mkdir /mnt/Mount
接下来将预封装的CentOS 5.2镜像挂载到创建的目录上。
# 挂载镜像 mount -o loop /mnt/Mount # 挂载Proc mount -t proc none /mnt/Mount/proc/
将Tomcat安装到挂载目录中(例如,将Tomcat文件夹放入/mnt/Mount/home),为了确保Tomcat随系统自动启动,请执行以下步骤:
1、在/etc/rc.local文件(/mnt/Mount/etc/rc.local)中包含JAVA_HOME和PATH变量;
2、在/etc/rc.local文件中添加Tomcat的启动脚本;
rc.local文件最终看起来如下:
#!/bin/sh # 本脚本将在所有其他init脚本执行 之后 执行 touch /var/lock/subsys/local export JAVA_HOME=/home/jdk1.6.0_13 export PATH=/home/jdk1.6.0_13/bin:$PATH:$HOME/bin /home/apache-Tomcat-6.0.18/bin/startup.sh
我们用于测试的Web应用程序是JPetStore,将jpetstore.war放入/webapps/文件夹,现在镜像包含所有必要的软件和脚本了。
接下来卸载镜像,切换到命令提示符窗口,执行下面的命令:
# 卸载proc umount /mnt/Mount/proc # 卸载镜像 umount -d /mnt/Mount
现在得到的镜像包含Tomcat 6和Web应用程序,我们可以将它上传到云中了,关于上传和运行镜像的说明,请参考Eucalyptus镜像管理文档。
创建JMeter镜像
创建JMeter镜像的步骤和前面创建Tomcat镜像的步骤一样,将预封装的CentOS 5.2镜像挂载到指定文件夹:
# 挂载镜像 mount -o loop /mnt/Mount # 挂载Proc mount -t proc none /mnt/Mount/proc/
将JMeter 2.3.2文件移动到/mnt/Mount/home文件夹下。JMeter主服务器安装在一台物理Linux机器上,JMeter实例作为从服务器。首先,将主服务器添加到从服务器的“已知主机”列表中;然后为主服务器生成一个无密码密钥,并将其添加到从镜像,将主服务器上产生的id_dsa放在从镜像的指定文件夹中(如/mnt/Mount/home)。每当从实例启动时,在已知主机列表中就会有主服务器的IP。
当JMeter从实例启动时,主服务器的jmeter.properties文件需要更新它的IP地址,为了自动添加IP地址,我们使用了一个Shell脚本,在挂载文件夹中创建一个脚本文件(/mnt/Mount/home):
#---------- 找到slave的IP地址 ----- OS=`uname` IP="" # store IP JMETER_Prop_File="" Master="" KeyPath="/id_dsa" # Master's Passphrase less key. case $OS in Linux) IP=`ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'`;; FreeBSD|OpenBSD) IP=`ifconfig | grep -E 'inet.[0-9]' | grep -v '127.0.0.1' | awk '{ print $2}'` ;; SunOS) IP=`ifconfig -a | grep inet | grep -v '127.0.0.1' | awk '{ print $2} '` ;; *) IP="Unknown";; esac #---------------- 将slave的IP写入master的属性文件 ----- ssh -i $KeyPath root@$Master "sed -e 's/remote_hosts=/remote_hosts=$IP,/1' $JMETER_Prop_File/jmeter.properties>$JMETER_Prop_File/test.chk" ssh -i $KeyPath root@$Master "cp $JMETER_Prop_File/test.chk $JMETER_Prop_File/jmeter.properties" ssh -i $KeyPath root@$Master "rm -rf $JMETER_Prop_File/test.chk"
将上面的代码保存为.sh文件,在rc.local文件中添加实例启动时需要自动启动的服务路径。
#!/bin/sh # 本脚本将会在其他init脚本之后执行 touch /var/lock/subsys/local chmod 600 //id_dsa / export JAVA_HOME=//java export PATH=//java/bin:$PATH:$HOME/bin //jmeter2.3.2/bin/jmeter-server service vsftpd start
接下来卸载掉镜像,方法和前面一样。
创建MySQL镜像
创建MySQL镜像的步骤和创建Tomcat镜像的步骤一样,挂载CentOS 5.2预封装镜像到指定文件夹:
# 挂载镜像 mount -o loop /mnt/Mount # 挂载Proc mount -t proc none /mnt/Mount/proc/
修改根挂载点(如/mnt/Mount),然后执行下面的命令:
cd /mnt/Mount chroot .
命令执行完后,如果显示下面的命令提示符,则表示挂载点修改成功:
bash-3.2#
接下来安装MySQL需要的RPM包,包括依赖包。
安装完所有RPM包后,从root退出。
bash-3.2#exit exit [root@localhost centos]#
如果你还不知道远程访问MySQL数据库的方法,请参考“如何开启MySQL数据库的远程访问”教程。
/etc/init.d/mysqld start
为了让MySQL也随系统自动启动,在/etc/rc.local文件中添加启动脚本。
接下来配置JPetStore使用新的MySQL实例:
driver=org.gjt.mm.mysql.Driver url=jdbc:mysql://:3306/JPETSTORE username= password=
当实例启动和运行时,你可以按照我们的要求,将JPetStore的默认数据库修改为MySQL,在Tomcat镜像中,更新JPetStore的database.properties文件。
启动所有实例,确保每个实例都获得了一个IP地址。启动好后,你就可以在这些云实例上执行性能测试,测试方法和在物理机上执行性能测试没有区别。
小结
和物理测试环境相比,将测试环境搭建在云中有许多优势,我们在物理测试环境和云测试环境中执行了多轮测试,物理测试机和云测试实例的配置都一样,根据测试结果显示,基于云的解决方案降低了搭建测试环境需要的时间和精力,而它们之间的性能差异是微不足道的。