随着我国计算机技术的蓬勃发展,特别是近几年互联网+行业的兴起,人们对计算、存储、网络的要求也越来越高,面对越来越复杂多变的需求,传统的物理机-应用服务器方式越来越难于招架,私有云平台作为一个崭新的模式应运而生,并为IT 业的发展指明了方向。私有云平台具有高扩展性、高融合性、高灵活性、低成本等特点。如今,越来越多的主流企业已经采用OpenStack 云平台作为私有云的第一解决方案。

OpenStack

OpenStack是一个美国国家航空航天局和Rackspace合作研发的,以Apache许可证授权,并且是一个自由软件和开放源代码项目。 OpenStack是IaaS(基础设施即服务)组件,让任何人都可以自行建立和提供云端运算服务。作为一个大型的开源项目,其项目重点在于对各种不同组件的广泛支持和对各种功能的扩展完善上,但这在生产环境下,特别是在某些极端条件下的性能表现就存在着一定的缺陷,需要我们后期去完善补全。

如果你对OpenStack较为熟悉,你就会知道OpenStack其实是一个非常庞大的系统,非常多的相互配合的服务(service)运行其中。因此,利用通用性能测试软件(Loadrunner,Jmeter等)进行性能测试发压,脚本编写量巨大,实施复杂度高。而OpenStack社区推出的rally测试引擎,具有更高的针对性和可用性。

Rally

Rally 是一个基准测试工具,可以帮助我们判断出OpenStack表现如何,特别是在有负载的场景中。你可以使用Rally的各种场景测试脚本来对你的OpenStack环境进行性能测试,基准测试,功能验证。

图片描述

组成

  • Deploy engine:可以与流行的部署器如DevStack、Fuel等结合使用,完成OpenStack测试环境部署或者独立完成已有测试环境注册的插件。

  • Verification:使用Tempset(OpenStack社区的接口自动化测试工具)来验证已部署的OpenStack云环境的功能性。

  • Benchmark engine:允许在云环境中制造并发负载,并进行基准测试。

  • Generate report:报表生成器,负责读取rally的测试结果(存储于数据库),生成报表。

应用

图片描述
工作中的实际使用场景

  • 研发人员:针对新代码通过rally发压,验证新代码对整个系统带来的性能影响;
  • 测试人员:针对新版本通过rally发压,评估新版本是否达到性能预期,进而产生调优需求;
  • 运维人员:针对新搭建的客户生产环境,通过rally发压,获取生产环境的性能阀值;
  • 销售人员:针对客户演示环境,通过rally发压,展示系统的性能表现;

问题

在公司实际使用中,研发、测试、运维、销售都需要经常使用rally来获取性能参数,这就存在着以下几个问题急需解决:

  • 重复安装:Rally安装虽然简单,但是需要让研发、测试、运营、销售等相关人员都熟练掌握,并繁琐而重复的使用,存在成本大效率低的缺点;
  • Rally代码本地化:Rally安装虽然非常简单,但是在国内环境中,需要修改其报表调用的Google组件(具体方式在网络上已经有很多文件介绍),否则其报表无法正常显示;
  • Rally代码定制:为了满足公司实际工作需要,对代码进行的进一步完善或者配置;如:加入公司LOGO、增加新的报表内容、测试场景的定制等;
  • 环境冲突:由于rally对主机性能消耗比较小,经常需要和别的应用共享一台物理服务器,这就容易产生环境冲突,如:宿主机需要A包的1.0版本,而rally需要A包的2.0版本,进而产生依赖矛盾,造成宿主机上多个程序不能共存;

针对以上问题,我们经过市场调研,确定Docker技术可以全面满足我们的需求。

Docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何机器上。

特点:

  • 允许实例简单、快速地扩展
  • 创建应用镜像并进行复制
  • 创建容易分发的即启即用的应用
  • 隔离应用依赖

应用场景:

  • 标准化应用发布,docker容器包含了运行环境和可执行程序,可以跨平台和主机使用;
  • 快速部署和启动,docker容器启动是秒级;
  • 节约成本, docker容器对磁盘的使用可以减少到MB级;
  • 方便持续集成,通过与代码进行关联使持续集成非常方便;

可以看出docker可以全面满足我们的需求,但是同样也带来了新的问题:

  1. Docker image制作繁琐;
  2. 对于研发、测试、运维、销售人员,学习docker的使用同样需要花费时间、精力;
  3. 针对不同环境,安装docker,下载image,运行docker container等操作,同样复杂而繁琐;

那么针对以上问题,有没有一种简化方式,可以让使用者不用关心docker命令,不再执行重复的指令呢?答案是肯定的,这就是被我们称为docker持续交付系统的一套实现方法。

Docker-Rally持续交付系统

此系统主要包括2个方面:

Docker Image交付模块:此脚本为交付给用户使用的脚本,用户使用此脚本只需要了解基本的命令,就可以自动化的完成Docker环境的搭建,Rally环境的搭建、注册设置等操作;

Docker Image制作模块:此操作需要对Docker、Rally(应用系统)等熟悉的操作者,一般为应用服务的开发者或维护者;

Docker Image交付模块

此模块主要实现自动搭建rally环境,封装docker指令实现Docker透明化和环境卸载几个子模块。

自动搭建Rally环境

  • 模块判断系统是否安装docker,如果没有安装则自动安装docker,则自动安装;核心代码:
yum -y install docker                           #安装docker
  • 自动登录指定的docker账号,下载最新版本的rally-image到本地环境;核心代码:
docker login                                    #登录docker
docker pull t2clouddocker/rally                     #下载image
  • 创建容器,映射端口22到host的33333端口,用于ssh服务;把host的/home/rally_json和/home/rally_result文件夹挂载到容器中,用于存放配置文件及测试结果;核心代码:
docker run -i -t -d -p 33333:22 -v /home/rally_result/:/home/rally_result/ -v /home/rally_json/:/home/rally_json/ --privileged=true t2clouddocker/rally                     #启动容器
  • 把预存的rally配置信息拷贝到/home/rally_json中。
  • 提供rally注册功能,通过读取OpenStack环境配置文件,把已有的OpenStack环境注册到rally系统中;
  • 提供rally备份功能,对rally的数据库进行备份;

封装Docker指令

此操作是简化用户操作的重点,通过对docker命令的封装,使用户感觉不到docker容器的存在,进而直接在宿主机上执行容器内的rally指令,完成docker的透明化。创建rally.sh文件,用于在宿主机中操作docker中的rally程序。核心代码:

rally="#!/bin/bash \n \
[ \"\$*\"x = x -o \"\$1\"x = \"help\"x ] && { echo \"******************使用说明*******************\"; \n \
                                              echo \"all   :运行所有场景(python /home/rally_json/run_rally.py)\"; \n \
                                              echo \"bash  :运行bash命令\"; \n \
                                              echo \"backup:备份rally数据库到rally_result路径\"; \n \
                                              echo \"help  :显示帮助信息\"; \n \
                                              echo \"其他  :执行rally命令\"; exit; } \n \
[ \"\$1\"x = \"all\"x ] && { docker exec -i $ids python /home/rally_json/run_rally.py;exit; } \n \
[ \"\$1\"x = \"bash\"x ] && { docker exec -i $ids \$2;exit; } \n \
[ \"\$1\"x = \"backup\"x ] && { docker exec -i $ids cp /var/lib/rally/database/rally.sqlite /home/rally_result/;exit; } \n \
 docker exec -i $ids rally \$*"

创建的rally.sh会通过软连接(ln -s)为rally,这样在宿主机执行rally命令,实际上是调用rally.sh脚本,通过rally.sh脚本完成了指令从宿主机到Docker Container的穿透。使用户忽略了docker的存在,做到“就像是在本机运行rally一样”。

环境卸载

此子模块实现了rally环境的卸载,包括:备份rally数据库、删除Docker Container、删除Docker image、删除rally.sh脚本等

Docker Image制作模块

模块主要实现自动安装docker环境、自动拉取最新代码、自动生成Docker Image,并把制作的image上传到Docker Hub中。代码核心:

  • 从git服务器拉取rally代码;核心命令:
yum -y install git docker                           #安装工具
git clone git://git.openstack.org/openstack/rally       #拉取代码
  • 运行rally代码中的Dockerfile生成docker image;核心命令:
docker build -t DockerHubId/rally:x .                   #生成image
docker push DockerHubId/rally:x                 #上传镜像到Hub

Docker交付系统

其实,以上整个流程,不仅仅是Rally性能测试应用程序的交付系统,也同样是Docker实际应用的经典场景的自动化实现。我们可以按照此设计思路稍加修改,就可以实现接口自动化测试的自动交付系统、存储系统的性能测试自动交付系统、演示环境的自动交付系统等等。

通过对Docker命令的封装,使用户既享受到Docker带来的便利,又可以忽略Docker操作上的不便,使Docker透明化。

作者简介:聂锟,高级性能测试架构师,在金融、互联网、游戏,云计算等行业深耕十一载,积累了丰富的接口,网络,存储,数据库性能测试实战经验。目前就职于云途腾科技有限责任公司,负责OpenStack相关性能测试和社区rally项目的贡献。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐