51Testing软件测试论坛
标题:
搭建Jmeter容器集群平台
[打印本页]
作者:
听海——sky
时间:
2018-6-5 16:12
标题:
搭建Jmeter容器集群平台
基于大量虚拟机的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手动添加吧
[attach]116092[/attach]
以上的两标签可先不加,留后面再加也行,主要是为了标识这是主节点,host.ip为指定IP(对于Slave节点不
需要加标签io.rancher.host.name=master),第4步的IP也可以不用配置,除非是某个节点主机与Rancher
部署在一台机器上(我就是)。最后奔向第5步,复制那一串代码,到需要添加的主机上运行就可以(前提
也是主机装好了Docker,并且可以访问Rancher,避免访问失败连防火墙也可以先关了)。
添加完一个主机后,继续添加其他Slave节点的主机,我是添加了一台master(与Rancher共用)、两台slav
e(这三台机的IP最好都是同网段的,不要用相邻网段的,比如网段为172.16的虚拟机创建Docker后,其网
桥的默认网段就变成172.17,这就导致和172.17网段的虚拟机会网络冲突,碰到冲突临时的解决方式就是
手动修改网桥docker0的网段并重启机器)
逐台主机登录输入命令添加Custom也挺头疼,可以使用expect编写一个脚本来减轻部分工作量(我就添加
三台,用不上):
<p>
</p><p>#!/usr/bin/expect</p><p>
</p><p>set timeout -1</p><p>
</p><p>set ip [lindex $argv 0]</p><p>
</p><p>spawn ssh root@$ip</p><p>
</p><p>expect {</p><p>
</p><p> "*Are you sure you want to continue connecting (yes/no)?*" { send "yes\r" }</p><p>
</p><p> "*password*" { send "123456\r" }</p><p>
</p><p>}</p><p>
</p><p>expect {</p><p>
</p><p> "*password*" { send "123456\r" }</p><p>
</p><p>}</p><p>
</p><p>expect {</p><p>
</p><p> "]# " { 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://123.207.234.119:8080/v1/scripts/EE431DCFC650693D335A:1483142400000:3FSEGIHT9rsY68RViGJGV8sBiBk\r" }</p><p>
</p><p>}</p><p>
</p><p>send "exit\r"</p><p>
</p><p>expect eof</p><p>
</p><p>exit</p><p></p>
复制代码
添加完三台主机后的效果:
[attach]116093[/attach]
4、添加Jmeter应用
添加应用(Add Stack)就是填写docker-compose.yml和rancher-compose.yml。由于slave集群在压测过程
中往往由于压力过大出现各种rmi异常导致崩溃,我们把主从分别建两个应用(Stack)。
[attach]116094[/attach]
jmeter-master的docker-compose.yml配置如下(调用的是Docker Hub镜像库里的镜像):
<p>version: '2'</p><p>
</p><p>services:</p><p>
</p><p> master:</p><p>
</p><p> image: malfurionpd/jmeter-master</p><p>
</p><p> stdin_open: true</p><p>
</p><p> network_mode: host</p><p>
</p><p> tty: true</p><p>
</p><p> ports:</p><p>
</p><p> - 60000:60000/tcp</p><p>
</p><p> labels:</p><p>
</p><p> io.rancher.scheduler.affinity:host_label: io.rancher.host.name=master</p><p>
</p><p> io.rancher.container.pull_image: always</p><p>
</p><p>jmeter-master的rancher-compose.yml配置如下:</p><p>
</p><p>version: '2'</p><p>
</p><p>services:</p><p>
</p><p> master:</p><p>
</p><p> scale: 1</p><p>
</p><p> start_on_create: true</p><p>
</p><p>jmeter-slaves的docker-compose.yml配置如下(包含多节点):</p><p>
</p><p>version: '2'</p><p>
</p><p>services:</p><p>
</p><p> slave01:</p><p>
</p><p> image: malfurionpd/jmeter-slave-ip</p><p>
</p><p> environment:</p><p>
</p><p> HOST_IP: 172.16.1.37</p><p>
</p><p> stdin_open: true</p><p>
</p><p> tty: true</p><p>
</p><p> ports:</p><p>
</p><p> - 1099:1099/tcp</p><p>
</p><p> - 50000:50000/tcp</p><p>
</p><p> labels:</p><p>
</p><p> io.rancher.container.pull_image: always</p><p>
</p><p> io.rancher.scheduler.affinity:host_label: host.ip=172.16.1.37</p><p>
</p><p> slave02:</p><p>
</p><p> image: malfurionpd/jmeter-slave-ip</p><p>
</p><p> environment:</p><p>
</p><p> HOST_IP: 172.16.1.140</p><p>
</p><p> stdin_open: true</p><p>
</p><p> tty: true</p><p>
</p><p> ports:</p><p>
</p><p> - 1099:1099/tcp</p><p>
</p><p> - 50000:50000/tcp</p><p>
</p><p> labels:</p><p>
</p><p> io.rancher.container.pull_image: always</p><p>
</p><p> io.rancher.scheduler.affinity:host_label: host.ip=172.16.1.140</p><p>
</p><p>jmeter-slaves的rancher-compose.yml配置如下:</p><p>
</p><p>version: '2'</p><p>
</p><p>services:</p><p>
</p><p> slave01:</p><p>
</p><p> scale: 1</p><p>
</p><p> start_on_create: true</p><p>
</p><p> slave02:</p><p>
</p><p> scale: 1</p><p>
</p><p> start_on_create: true</p><p></p>
复制代码
作者:
听海——sky
时间:
2018-6-5 16:13
添加应用时导入以上配置文件,点击创建,顺间就能创建jmeter集群(几秒钟的事情)。
[attach]116095[/attach]
创建好的集群各个节点,就可以方便的进行管理(升级、重启、停止服务、查看日志、执行命令行等操作)
,无需连接Linux,就可直接进行各节点的命令操作:
[attach]116096[/attach]
通过以上ps查看,就能发现jmeter的从节点自动启动了jmeter-server,无需人为操作jmeter-server的启动。
[attach]116097[/attach]
登录到master主机,也能看到jmeter-master容器和rancher服务
三、Jmeter集群应用
到这一步就可以验证上面的成果了,直接到一个脚本newTest.jmx进行测试:
jmeter -n -t /jmeter/apache-jmeter-3.2/bin/newTest.jmx -Djava.rmi.server.hostname=172.16.1.30 -Dclien
t.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
[attach]116098[/attach]
将输出的报告从容器中拷出用html查看,一切OK
[attach]116099[/attach]
四、扩展应用
以上已经实现了一套Jmeter的容器云平台,但是为了让脚本和报告集中管理,我们需要构建一个文件服务器,
通过nginx或是SVN都行。在文件目录下建立jmx,jtl,report三个子目录。
将本机编辑和测试通过的脚本,直接上传到文件服务器上(需要配置SSH免密登录)
scp newTest.jmx
root@x.x.x.x
:/data/jmetertest/jmx/
通master节点的jmeter可以直接连接文件服务器调用脚本,并将生成的报告保存到文件服务器上。以下是jme
ter的示例脚本:
<p>#!/bin/bash</p><p>
</p><p>if [ ! -n "$1" ] ;then</p><p>
</p><p> echo 'give me a parameter, ok?'</p><p>
</p><p>else</p><p>
</p><p> now=`date --date='0 days ago' "+%Y%m%d%H%M%S"`</p><p>
</p><p> echo "=====Start JMeter Test $1 on $now"</p><p>
</p><p> echo "=====Step1 wget"</p><p>
</p><p> cmd1="wget -P /jmeter/apache-jmeter-3.2/bin/ https://xxx.xxx.xxx/jmetertest/jmx/$1"</p><p>
</p><p> eval ${cmd1}</p><p>
</p><p> echo "=====Step2 makedir in local"</p><p>
</p><p> #jmeter-jtl</p><p>
</p><p> if [ ! -d "/jmeter-jtl" ]; then</p><p>
</p><p> mkdir /jmeter-jtl</p><p>
</p><p> fi</p><p>
</p><p> #jmeter-jtl/xxx.jmx</p><p>
</p><p> if [ ! -d "/jmeter-jtl/$1" ]; then</p><p>
</p><p> mkdir "/jmeter-jtl/$1"</p><p>
</p><p> fi</p><p>
</p><p> #jmeter-report</p><p>
</p><p> if [ ! -d "/jmeter-report" ]; then</p><p>
</p><p> mkdir /jmeter-report</p><p>
</p><p> fi</p><p>
</p><p> #jmeter-report/xxx.jmx</p><p>
</p><p> if [ ! -d "/jmeter-report/$1" ]; then</p><p>
</p><p> mkdir "/jmeter-report/$1"</p><p>
</p><p> fi</p><p>
</p><p> echo "=====Step3 jmeter"</p><p>
</p><p> 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"</p><p>
</p><p> eval ${cmd2}</p><p>
</p><p> tip="10.135.147.74"</p><p>
</p><p> echo "=====Step4 scp"</p><p>
</p><p> #scp jtl</p><p>
</p><p> tjtl="/data/jmetertest/jmetertest/jtl"</p><p>
</p><p> cmd3="ssh root@${tip} \"[ -d ${tjtl}/$1 ] && echo ok || mkdir -p ${tjtl}/$1\""</p><p>
</p><p> eval ${cmd3}</p><p>
</p><p> cmd4="scp /jmeter-jtl/$1/$now.jtl root@${tip}:${tjtl}/$1/"</p><p>
</p><p> eval ${cmd4}</p><p>
</p><p> #scp report</p><p>
</p><p> treport="/data/jmetertest/report"</p><p>
</p><p> cmd5="ssh root@${tip} \"[ -d ${treport}/$1 ] && echo ok || mkdir -p ${treport}/$1\""</p><p>
</p><p> eval ${cmd5}</p><p>
</p><p> cmd6="ssh root@${tip} \"[ -d ${treport}/$1/$now ] && echo ok || mkdir -p ${treport}/$1/$now\""</p><p>
</p><p> eval ${cmd6}</p><p>
</p><p> cmd7="scp -r /jmeter-report/$1/$now root@${tip}:${treport}/$1/"</p><p>
</p><p> eval ${cmd7}</p><p>
</p><p> echo "=====End JMeter Test $1 on $now"</p><p>
</p><p>fi</p>
复制代码
备注说明:上面所用到的jmeter镜像都是从DockerHub调用的,为了方便镜像的分布式下发和运行,调用
DockerHub的镜像是个简便的方式,我们也可以自己生成jmeter镜像,申请个Docker Hub账号后上传到
镜像库里。
由于Rancher还有很多其他功能,也可以做一些其他方面的集成,后续再做研究!
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2