搭建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://172.16.1.37: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集羣應用

到這一步就可以驗證上面的成果了,直接到一個腳本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 [email protected]:/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還有很多其他功能,也可以做一些其他方面的集成,後續再做研究!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章