使用Eucalyptus打造自己的云测试平台(CentOS+Apache+MySQL)

云计算旨在为应用程序按需提供方便和可扩展的计算资源和IT服务,它也为测试平台带来了一种新的解决方案。基于云的测试平台提供自动横向和纵向扩展的测试基础设施,剔除了传统测试平台的许多不足和挑战。

传统的测试环境通常是生产环境的按比例缩小版本。要建立一个测试环境需要大量的时间和精力,因为安装过程包括大量艰巨的任务,如购买合适的硬件基础设施(包括应用服务器,数据库服务器,Web服务器等),安装需要的软件(如应用,数据库,测试工具,如果需要的话还有监控工具)。

本文介绍如何使用各种开源技术在云中搭建一个测试平台,你可以使用它作为一个指导建立你自己的云测试平台。下面是我搭建测试平台用到的开源技术:

  1. 安装CentOS 5.2的机器:它们将作为云,集群和节点控制器。(文档
  2. Eucalyptus 1.5.1:一个开源基础设施,它是计算机集群上云计算的实现。(下载
  3. Apache Tomcat 6.0.14:它是最流行的开源Servlet容器。(下载
  4. Jakarta JMeter 2.3.2:这个开源工具的目的是执行负载测试和功能行为分析,以及测量应用程序性能,主要是Web应用程序。(下载
  5. MySQL 5.0:它是最流行的关系数据库管理系统,提供多用户访问的数据库。(下载
  6. 预封装的CentOS 5.2镜像:它作为创建Tomcat,JMeter和MySQL镜像的基础镜像。
  7. JPetStore Web应用程序:这个简单的应用程序是J2EE平台在现实应用程序设计中的一个工作示范。(项目地址

在动手之前,你需要了解云计算和Eucalyptus工作原理的基本知识。

云测试环境组件

我们的实验环境由四台机器组成,一台是2GB内存的机器,其它三台内存均是1GB,如图1所示。全部安装CentOS 5.2:

  1. Eucalyptus云和集群相关的RPM包安装在2GB内存的机器上,担任云和集群控制器;
  2. 其余三台机器作为节点控制器,只安装节点RPM软件包;
  3. 其中一台机器安装JMeter作为JMeter主服务器(关于Eucalyptus安装说明,请参考Eucalyptus管理员指南)。

使用Eucalyptus打造自己的云测试平台(CentOS+Apache+MySQL) 
图 1 云测试环境由四台机器组成

下面的镜像是在搭建测试环境时要使用到的:

  1. Tomcat镜像:用于应用程序部署。
  2. MySQL镜像:用于数据库部署。
  3. 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地址。启动好后,你就可以在这些云实例上执行性能测试,测试方法和在物理机上执行性能测试没有区别。

小结

和物理测试环境相比,将测试环境搭建在云中有许多优势,我们在物理测试环境和云测试环境中执行了多轮测试,物理测试机和云测试实例的配置都一样,根据测试结果显示,基于云的解决方案降低了搭建测试环境需要的时间和精力,而它们之间的性能差异是微不足道的。

相关推荐