0. 环境说明
基于Docker Swarm 部署,Jmeter分布式压测集群。
本次实验采用三台4C8G主机。其中一台控制机,两台工作节点。控制机也能产生压力测试。
1. 初始化Swarm集群
1.1 每台主机重命名
# 三台节点配置主机名,之后重启 jmm jms01 jms02 jms03
hostnamectl set-hostname jmm
1.2 配置防火墙
Jmeter相关端口:1099,2377,4098,4789,7946
systemctl start firewalld
# 管理端口
firewall-cmd --zone=public --add-port=2377/tcp --permanent
firewall-cmd --zone=public --add-port=1099/tcp --permanent
# 节点间通信端口
firewall-cmd --zone=public --add-port=7946/tcp --permanent
firewall-cmd --zone=public --add-port=7946/udp --permanent
# overlay 网络端口
firewall-cmd --zone=public --add-port=4789/tcp --permanent
firewall-cmd --zone=public --add-port=4789/udp --permanent
firewall-cmd --zone=public --add-port=4098/udp --permanent
firewall-cmd --reload
1.3 初始化主节点
# 主节点IP
MIP=$(hostname -I | awk -F " " '{printf $1}')
docker swarm init --advertise-addr $MIP > /root/swarminfo.txt
# 查看集群节点状态
docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
hr0vjp2rw76glzd53bqa2fiod * jmm Ready Active Leader 24.0.7
# 生成token
docker swarm join-token manager
1.4 两个从节点加入主节点
# 从节点执行主节点的注册信息,注册到主节点
docker swarm join --token xxxxxxxxx 10.168.2.93:2377
1.5 至此集群搭建完成
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
hr0vjp2rw76glzd53bqa2fiod * jmm Ready Active Leader 24.0.7
766y5boetlnow84uz227e0bef jms01 Ready Active Reachable 24.0.7
y2b1i3cb0yi2dep1syl9qzxtd jms02 Ready Active Reachable 24.0.7
2. 配置Swarm集群网络
2.1 创建专门的Overlay网络,用来跑Jmeter容器服务。
# 创建压测专用网络,一定要加上attachable 属性,否则会报 XXX错误
docker network create --driver overlay --attachable swarmnet
2.2 测试刚才的网络,查看跨主机使用Overlay网络能否互通。
在jmm节点和jms01节点上,使用Overlay创建容器互ping。
经测试可以互ping,也能访问外部网络。
# Jmm节点
docker run -itd --name=bb1 --network=swarmnet busybox /bin/sh
# Jms01节点
docker run -itd --name=bb2 --network=swarmnet busybox /bin/sh
# 部署后查看分配的Overlay网络IP
docker network inspect swarmnet | grep -A5 "bb2" | grep 'IPv4'
"IPv4Address": "10.0.2.4/24",
# 在Jmm上,ping Jms01中的bb2内网IP,可以ping通
$ docker exec -it bb1 ping -w 5 -c 3 10.0.2.4
PING 10.0.2.4 (10.0.2.4): 56 data bytes
64 bytes from 10.0.2.4: seq=0 ttl=64 time=0.626 ms
...
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.375/0.492/0.626 ms
# 同样在Jmm上,ping Jms01中的bb2主机名,也可以ping通
$ docker exec -it bb1 ping -w 5 -c 3 bb2
PING bb2 (10.0.2.4): 56 data bytes
64 bytes from 10.0.2.4: seq=0 ttl=64 time=0.321 ms
...
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.321/0.382/0.423 ms
# 在Jmm上,ping外网网络,也可以ping通。
docker exec -it bb1 ping -w 5 -c 3 www.baidu.com
PING www.baidu.com (110.242.68.3): 56 data bytes
64 bytes from 110.242.68.3: seq=0 ttl=52 time=11.813 ms
...
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 11.813/12.389/12.879 ms
3. 搭建Jmeter分布式集群
3.1 等待所有工作节点都正常以后,在创建Jmeter服务,创建过程大概需要5分钟。
docker stack deploy -c jmeter.yml jmeter
3.2 在创建过程中,监控节点中的进度。
$ watch -n1 'docker ps -a'
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f51b6ae69ef9 jmeter-slave:orcaljdk17-jmeter5.5-graphs-plugins-release "/
bin/sh -c \"jmeter-…" 15 seconds ago Up 14 seconds 1109/tcp jmeter_jmeter-slave01.766y5boetlnow84uz227e0bef.whqzyxl2
r6yzcncot7kmrxt0q
3.3 等待所有节点状态都是Running
# 查看集群服务,如果是 Preparing 需要等待一段时间
$ docker stack ps jmeter
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
mc7oz73egjb4 jmeter_jmeter-master.hr0vjp2rw76glzd53bqa2fiod jmeter-master:orcaljdk17-jmeter5.5-graphs-plugins-release jmm Running Running 2 minutes ago
whqzyxl2r6yz jmeter_jmeter-slave01.766y5boetlnow84uz227e0bef jmeter-slave:orcaljdk17-jmeter5.5-graphs-plugins-release jms01 Running Running about a minute ago
xx2l1nvev3s9 jmeter_jmeter-slave02.y2b1i3cb0yi2dep1syl9qzxtd jmeter-slave:orcaljdk17-jmeter5.5-graphs-plugins-release jms02 Running Running 17 seconds ago
4. 执行压测
4.1 查看Jmm节点ID
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7659b125f6f8 jmeter-master:orcaljdk17-jmeter5.5-graphs-plugins-release "/bin/sh -c \"jmeter-…" 3 minutes ago Up 3 minutes 1109/tcp jmeter_jmeter-master.hr0vjp2rw76glzd53bqa2fiod.mc7oz73egjb4odnb2965x36jc
4.2 根据不同的压测场景执行压测过程
# 清除结果集
rm -rf /var/lib/docker/volumes/jmeter_jmeter-master/_data/$CASE
#
CID=`docker ps -a | grep jmeter-master | awk '{print $1}'`
# 开启运行
docker exec $CID jmeter -n \
-t /usr/local/jmeter/apache-jmeter-5.5/work_space/$CASE.jmx \
-r -l /usr/local/jmeter/apache-jmeter-5.5/work_space/$CASE/result.jtl \
-e -o /usr/local/jmeter/apache-jmeter-5.5/work_space/$CASE/
5. 结果收集与展示
5.1 搭建Web报告界面
主节点上部署nginx服务,用于展示压测结果
# 在主节点上执行
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
docker run -itd -p 80:80 \
--name nginx \
-v /var/lib/docker/volumes/jmeter_jmeter-master/_data:/usr/share/nginx/html \
nginx
5.2 访问相应的Url地址查看报告结果