搭建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手动添加吧

以上的两标签可先不加,留后面再加也行,主要是为了标识这是主节点,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://123.207.234.119:8080/v1/scripts/EE431DCFC650693D335A:1483142400000:3FSEGIHT9rsY68RViGJGV8sBiBk\r" }

}

send "exit\r"

expect eof

exit

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

4、添加Jmeter应用

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

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集群(几秒钟的事情)。

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

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

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

说明:以上的镜像是用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

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

四、扩展应用

以上已经实现了一套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账号后上传到镜像库里。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容