• 12
  • 13
分享
  • 搭建Jmeter容器集群平台——软件测试圈
  • 北极 2020-12-14 13:18:03 字数 9206 阅读 2884 收藏 13

基于大量虚拟机的Jmeter集群有个缺点,就是不方便管理,比如需要重启Jmeter服务,还需要一个个的连接到虚拟机上进行操作,而且安装部署不方便(无法一键部署),也不方便将集群封装成整体应用对外提供服务。这些缺点通过Rancher部署的容器云平台就能够解决。

一、给各个节点的虚拟机安装Docker

可以让创建虚拟机时就自动带上统一版本的Docker,就可以省掉这一步操作,网上还推荐使用DaoCloud进行Docker安装和镜像加速,我们是为了做实现,就原始的方式安装吧:

1、对于CantOS安装Docker最好是CentOS7,这样可以保证内核至少是3.10(通过uname -r 命令查看),低于这个版本的内核无法安装Docker。

2、使用 root 权限登录 Centos。确保 yum 包更新到最新(sudo yum update),我是没有更新。

3、卸载旧版本(如果安装过旧版本的话)

sudo yum remove docker  docker-common docker-selinux docker-engine

4、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

5、设置yum源

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

6、直接安装最新版的docker(记住版本宁可最新,也不要低于Rancher所要求的版本)

sudo yum install docker-ce

7、启动并加入开机启动

$ sudo systemctl start docker
$ sudo systemctl enable docker

二、Rancher安装和配置

可以选择一台机独立安装,也可以和Jmeter的Master节点部署在一台机上。Rancher是一个开源的容器管理平台(支持华人的产品),帮助构建企业私有容器服务,相当于KVM里的Openstack。

1、直接调用Docker安装

sudo docker run -d --restart=unless-stopped -p 8080:8080 rancher/server

2、登录Rancher

装完后,(等启动完后)通过http://IP:8080登录,可以选择语言为中文版显示,进行Rancher认证配置(我也不配了,直接忽略)

3、Rancher主机添加

Rancher提供了很多machine drivers批量添加主机,我们也简单一点,直接选择Custom手动添加吧

1.png

以上的两标签可先不加,留后面再加也行,主要是为了标识这是主节点,host.ip为指定IP(对于Slave节点不需要加标签io.rancher.host.name=master),第4步的IP也可以不用配置,除非是某个节点主机与Rancher部署在一台机器上(我就是)。最后奔向第5步,复制那一串代码,到需要添加的主机上运行就可以(前提也是主机装好了Docker,并且可以访问Rancher,避免访问失败连防火墙也可以先关了)。

添加完一个主机后,继续添加其他Slave节点的主机,我是添加了一台master(与Rancher共用)、两台slave(这三台机的IP最好都是同网段的,不要用相邻网段的,比如网段为172.16的虚拟机创建Docker后,其网桥的默认网段就变成172.17,这就导致和172.17网段的虚拟机会网络冲突,碰到冲突临时的解决方式就是手动修改网桥docker0的网段并重启机器)

逐台主机登录输入命令添加Custom也挺头疼,可以使用expect编写一个脚本来减轻部分工作量(我就添加三台,用不上):

#!/usr/bin/expect
set timeout -1
set ip [lindex $argv 0]
spawn ssh root@$ip
expect {
    "*Are you sure you want to continue connecting (yes/no)?*" { send "yes\r" }
    "*password*" { send "123456\r" }
}
expect {
    "*password*" { send "123456\r" }
}
expect {
    "]# " { send "sudo docker run --rm --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/rancher:/var/lib/rancher rancher/agent:v1.2.2 http://172.16.1.37:8080/v1/scripts/EE431DCFC650693D335A:1483142400000:3FSEGIHT9rsY68RViGJGV8sBiBk\r" }
}
send "exit\r"
expect eof
exit

添加完三台主机后的效果:

2.png

4、添加Jmeter应用

添加应用(Add Stack)就是填写docker-compose.yml和rancher-compose.yml。由于slave集群在压测过程中往往由于压力过大出现各种rmi异常导致崩溃,我们把主从分别建两个应用(Stack)。

3.png

jmeter-master的docker-compose.yml配置如下(调用的是Docker Hub镜像库里的镜像):

version: '2'
services:
  master:
    image: malfurionpd/jmeter-master
    stdin_open: true
    network_mode: host
    tty: true
    ports:
    - 60000:60000/tcp
    labels:
      io.rancher.scheduler.affinity:host_label: io.rancher.host.name=master
      io.rancher.container.pull_image: always

jmeter-master的rancher-compose.yml配置如下:

version: '2'
services:
  master:
    scale: 1
    start_on_create: true

jmeter-slaves的docker-compose.yml配置如下(包含多节点):

version: '2'
services:
  slave01:
    image: malfurionpd/jmeter-slave-ip
    environment:
      HOST_IP: 172.16.1.37
    stdin_open: true
    tty: true
    ports:
    - 1099:1099/tcp
    - 50000:50000/tcp
    labels:
      io.rancher.container.pull_image: always
      io.rancher.scheduler.affinity:host_label: host.ip=172.16.1.37
  slave02:
    image: malfurionpd/jmeter-slave-ip
    environment:
      HOST_IP: 172.16.1.140
    stdin_open: true
    tty: true
    ports:
    - 1099:1099/tcp
    - 50000:50000/tcp
    labels:
      io.rancher.container.pull_image: always
      io.rancher.scheduler.affinity:host_label: host.ip=172.16.1.140

jmeter-slaves的rancher-compose.yml配置如下:

version: '2'
services:
  slave01:
    scale: 1
    start_on_create: true
  slave02:
    scale: 1
    start_on_create: true

添加应用时导入以上配置文件,点击创建,顺间就能创建jmeter集群(几秒钟的事情)。

4.png

创建好的集群各个节点,就可以方便的进行管理(升级、重启、停止服务、查看日志、执行命令行等操作),无需连接Linux,就可直接进行各节点的命令操作:

5.png

通过以上ps查看,就能发现jmeter的从节点自动启动了jmeter-server,无需人为操作jmeter-server的启动。

登录到master主机,也能看到jmeter-master容器和rancher服务

6.png

说明:以上的镜像是用jmeter 3.2构建的,如果觉得版本不满足要求,可以自己构建镜像:参考构建代码:

https://github.com/malfurionpd/docker-files

三、Jmeter集群应用

到这一步就可以验证上面的成果了,直接到一个脚本newTest.jmx进行测试:

jmeter -n -t /jmeter/apache-jmeter-3.2/bin/newTest.jmx -Djava.rmi.server.hostname=172.16.1.30 -Dclient.rmi.localport=60000 -R 172.16.1.140,172.16.1.37 -l /jmeter/apache-jmeter-3.2/DashReport/log-222.csv -e -o /jmeter/apache-jmeter-3.2/DashReport/htmlReport-222

7.png

将输出的报告从容器中拷出用html查看,一切OK

8.png

四、扩展应用

以上已经实现了一套Jmeter的容器云平台,但是为了让脚本和报告集中管理,我们需要构建一个文件服务器,通过nginx或是SVN都行。在文件目录下建立jmx,jtl,report三个子目录。

将本机编辑和测试通过的脚本,直接上传到文件服务器上(需要配置SSH免密登录)

scp newTest.jmx root@x.x.x.x:/data/jmetertest/jmx/

通master节点的jmeter可以直接连接文件服务器调用脚本,并将生成的报告保存到文件服务器上。以下是jmeter的示例脚本:

#!/bin/bash
if [ ! -n "$1" ] ;then
        echo 'give me a parameter, ok?'
else
        now=`date --date='0 days ago' "+%Y%m%d%H%M%S"`
        echo "=====Start JMeter Test $1 on $now"
        echo "=====Step1 wget"
        cmd1="wget -P /jmeter/apache-jmeter-3.2/bin/ https://xxx.xxx.xxx/jmetertest/jmx/$1"
        eval ${cmd1}
        echo "=====Step2 makedir in local"
        #jmeter-jtl
        if [ ! -d "/jmeter-jtl" ]; then
                mkdir /jmeter-jtl
        fi
        #jmeter-jtl/xxx.jmx
        if [ ! -d "/jmeter-jtl/$1" ]; then
                mkdir "/jmeter-jtl/$1"
        fi
        #jmeter-report
        if [ ! -d "/jmeter-report" ]; then
                mkdir /jmeter-report
        fi
        #jmeter-report/xxx.jmx
        if [ ! -d "/jmeter-report/$1" ]; then
                mkdir "/jmeter-report/$1"
        fi
        echo "=====Step3 jmeter"
        cmd2="/jmeter/apache-jmeter-3.2/bin/jmeter -n -t /jmeter/apache-jmeter-3.2/bin/$1 -l /jmeter-jtl/$1/$now.jtl -e -o /jmeter-report/$1/$now -Djava.rmi.server.hostname=172.16.1.30 -Dclient.rmi.localport=60000 -R 172.16.1.37,172.16.1.140"
        eval ${cmd2}
        tip="10.135.147.74"
        echo "=====Step4 scp"
        #scp jtl
        tjtl="/data/jmetertest/jmetertest/jtl"
        cmd3="ssh root@${tip} \"[ -d ${tjtl}/$1 ] && echo ok || mkdir -p ${tjtl}/$1\""
        eval ${cmd3}
        cmd4="scp /jmeter-jtl/$1/$now.jtl root@${tip}:${tjtl}/$1/"
        eval ${cmd4}
        #scp report
        treport="/data/jmetertest/report"
        cmd5="ssh root@${tip} \"[ -d ${treport}/$1 ] && echo ok || mkdir -p ${treport}/$1\""
        eval ${cmd5}
        cmd6="ssh root@${tip} \"[ -d ${treport}/$1/$now ] && echo ok || mkdir -p ${treport}/$1/$now\""
        eval ${cmd6}
        cmd7="scp -r /jmeter-report/$1/$now root@${tip}:${treport}/$1/"
        eval ${cmd7}
        echo "=====End JMeter Test $1 on $now"
fi

备注说明:上面所用到的jmeter镜像都是从DockerHub调用的,为了方便镜像的分布式下发和运行,调用DockerHub的镜像是个简便的方式,我们也可以自己生成jmeter镜像,申请个Docker Hub账号后上传到镜像库里。

由于以上的jmeter镜像太老,jmeter 3.2,我们可以自己定义Dockerfile,以构建新的镜像(如 jmeter 5.1.1):

Jmeter-master Dockerfile:

# Use JDK-8 on alpine.
From openjdk:8-alpine
MAINTAINER smooth00 <smooth.blog.csdn.net>
 
ENV JMETER_VERSION 5.1.1
 
# Install Pre-requisite Packages like wget
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
    apk update && apk add wget unzip vim
 
# Installing jmeter
RUN mkdir /jmeter \
        && cd /jmeter/ \
        && wget https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz \
        && tar -xzf apache-jmeter-$JMETER_VERSION.tgz \ 
&& rm apache-jmeter-$JMETER_VERSION.tgz \
&& wget -P /jmeter/apache-jmeter-$JMETER_VERSION/lib/ext https://repo.maven.apache.org/maven2/kg/apc/jmeter-plugins-extras-libs/1.4.0/jmeter-plugins-extras-libs-1.4.0.jar \
&& wget -P /jmeter/apache-jmeter-$JMETER_VERSION/lib/ext https://repo.maven.apache.org/maven2/kg/apc/jmeter-plugins-standard/1.4.0/jmeter-plugins-standard-1.4.0.jar
 
# Settingt Jmeter Home
ENV JMETER_HOME /jmeter/apache-jmeter-$JMETER_VERSION/
 
# Finally Adding Jmeter to the Path
ENV PATH $JMETER_HOME/bin:$PATH
 
# Ports to be exposed from the container for JMeter Master
EXPOSE 60000

Jmeter-slave Dockerfile:

# Use JDK-8 on alpine.
From openjdk:8-alpine
MAINTAINER smooth00 <smooth.blog.csdn.net>
 
ENV JMETER_VERSION 5.1.1
# Install Pre-requisite Packages like wget
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
    apk update && apk add wget unzip vim
# Installing jmeter
RUN mkdir /jmeter \
        && cd /jmeter/ \
        && wget https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz \
        && tar -xzf apache-jmeter-$JMETER_VERSION.tgz \ 
&& rm apache-jmeter-$JMETER_VERSION.tgz \
&& wget -P /jmeter/apache-jmeter-$JMETER_VERSION/lib/ext https://repo.maven.apache.org/maven2/kg/apc/jmeter-plugins-extras-libs/1.4.0/jmeter-plugins-extras-libs-1.4.0.jar \
&& wget -P /jmeter/apache-jmeter-$JMETER_VERSION/lib/ext https://repo.maven.apache.org/maven2/kg/apc/jmeter-plugins-standard/1.4.0/jmeter-plugins-standard-1.4.0.jar
# Settingt Jmeter Home
ENV JMETER_HOME /jmeter/apache-jmeter-$JMETER_VERSION/
# Finally Adding Jmeter to the Path
ENV PATH $JMETER_HOME/bin:$PATH
# Ports to be exposed from the container for JMeter Slaves/Server
EXPOSE 1099 50000
ENV SSL_DISABLED true
# Application to run on starting the container
ENTRYPOINT $JMETER_HOME/bin/jmeter-server \
                        -Dserver.rmi.localport=50000 \
                        -Dserver_port=1099 \
                        -Jserver.rmi.ssl.disable=${SSL_DISABLED} \
                        -Djava.rmi.server.hostname=${HOST_IP}

 由于Rancher还有很多其他功能,也可以做一些其他方面的集成,后续再做研究!


作者:smooth-z

原文链接:https://blog.csdn.net/smooth00/article/details/80174900#comments_13983620

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   1、前言  以前待过一个测试组,做过的项目虽然不大,但是里面涉及到很多超链接,于是手动点击这些链接就花费很多时间,后来我就想如果工作觉得累,那肯定有什么地方需要改进,于是我就网上搜索可以检查超链接的自动化工具或方法,结果还真的让我找到了妙法!这就是接下来我要隆重介绍的小巧且好用的工具——Xenu!  2、简介  Xenu 全称 Xenu’s Link Sleuth 是一款界面简单,功能强大的软件,你可以打开一个本地网页文件来检查它的链接,也可以输入任何网址来检查,它可以分别列出网站的活链接以及死链接,连转向链接它都分析得一清二楚,支持多线程,可以把检查结果存储成文本文件或网页文件。  主要...
            0 0 1041
            分享
          •   IT之家12月9日消息,美国联邦贸易委员会(FTC)周四起诉科技巨头微软,要求其停止对动视暴雪750亿美元的收购,指称这项交易可能会损害高性能游戏机和订阅服务的竞争。  据《华尔街日报》报道,动视暴雪首席执行官BobbyKotick表示,微软收购该游戏开发商的交易将继续进行,尽管FTC计划阻止这项交易。Kotick认为FTC的指控与事实不符,相信微软会赢得这场挑战。  IT之家了解到,这将是微软公司历史上规模最大的一笔收购交易,同时也是视频游戏行业最大的一笔交易。FTC反垄断局局长霍利·维多瓦(HollyVedova)在新闻稿中表示:“微软已经证明,其有能力、有意愿停止向游戏行业的竞争对手...
            0 0 1164
            分享
          •   在我看来接口测试相对其他类型的测试是比较简单的。对于最常见的HTTP接口,只需要知道接口的 URL、方法、参数类型、返回值 ... 就可以对接口进行测试了。  apifox  如果你是入门级选手,那么apifox应该很适合你,它是一款类似postman的接口测试工具。而且功能也很强大,定位 Postman + Swagger + Mock + JMeter。你值得尝试。  为什么不postman? 嗯,你说的都对!  HttpRunner  如果你不想用工具,也不想写代码。想更加简单高效的编写接口测试用例,那么HttpRunner2.x 就很适合你了。  {     &...
            0 0 369
            分享
          •   最近一个学生也可以说是朋友,他遇到了一个让他困扰的职场难题,背景如下:  1)他们公司准备搞安全测试了,现在有人员培训的计划,所以全组有学习安全测试课程的安排。  2)他自己目前专职性能测试1年了,现在他领导有意想把他往安全测试的方向发展,但是他自己内心是排斥安全测试的,但是又不好拒绝领导的好意。  3)自己不想去安全,不是因为不感兴趣,而是因为目前阶段自己觉得性能还没完全摸清楚,现在又进入另外一个陌生的领域,心里没底。  4)且公司内部目前打算培养3个人做安全测试,他从性能部门转过去从零开始学习安全测试。  5)自己也不清楚安全测试的发展情况,非常头疼。目前就只想好好把性能搞好。  6)...
            0 1 887
            分享
          •   一、概述  随着现代信息系统越来越庞大,机器数量呈现指数级增长,信息系统运维对平台化服务能力要求越来越高,建立有效的监控体系准确及时发现系统运行中出现的问题,对于保障应用系统稳定运行具有重要意义。为提升生产问题感知及响应能力,通常会配置各种类型的监控,本文从单类型监控、业务交易之间聚合监控、业务交易与基础资源聚合监控等方面介绍监控常用技术方法,供读者进行参考学习。  二、单类型监控  单类型监控是指使用单一类型技术进行应用系统监控,常用的监控方法包括Ajax请求报文响应报文监控、业务日志监控、页面内容监控、业务数据监控、基础资源监控。  方面对几种监控类型详细介绍:  1、Ajax监控:通...
            0 0 2090
            分享
      • 51testing软件测试圈微信