4. 集群环境搭建(一):操作系统与JDK版本选择、网络配置要求、防火墙与端口开放策略

分布式压测集群的底层环境是稳定性的基石。本章聚焦于搭建前的环境选型与网络规划,涵盖操作系统与JDK的版本匹配、网络延迟与带宽要求、防火墙端口策略三个核心维度。错误的版本组合或端口遗漏会导致节点间通信失败、RMI调用超时、聚合报告数据丢失等严重问题。

4.1 操作系统与JDK版本选择

JMeter 是纯 Java 应用,其运行稳定性高度依赖 JDK 版本与操作系统的兼容性。以下为经过大规模压测验证的推荐组合:

组件 推荐版本 最低版本 关键说明
操作系统 CentOS 7.9 / Rocky Linux 8.6+ CentOS 7.0 / Ubuntu 20.04 生产环境优先选择 RHEL 系,避免桌面版 OS
JDK JDK 11 (LTS) 或 JDK 17 (LTS) JDK 8u202 JMeter 5.5+ 已移除对 JDK 8 的官方支持
JMeter 5.6.3 / 5.7 5.4.1 建议统一集群内所有节点的 JMeter 大版本
⚠️ 版本避坑: 切勿在 Controller 节点使用 JDK 8、在 Worker 节点使用 JDK 17。RMI 序列化机制在跨大版本 JDK 间存在兼容风险,轻则报 UnmarshalException,重则导致聚合数据乱码。集群内所有节点必须使用完全相同的 JDK 主版本。

4.1.1 JDK 安装与验证

以下为 CentOS 7.9 环境下的 JDK 11 安装步骤:

# 1. 卸载系统自带 OpenJDK(如有)
sudo yum remove -y java-1.8.0-openjdk*

# 2. 下载并安装 JDK 11(以 tar.gz 方式,避免 yum 源版本不一致)
wget https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz
sudo tar -zxf openjdk-11.0.2_linux-x64_bin.tar.gz -C /usr/local/
sudo mv /usr/local/jdk-11.0.2 /usr/local/java

# 3. 配置环境变量
cat >> ~/.bashrc << 'EOF'
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
EOF
source ~/.bashrc

# 4. 验证版本
java -version
# 输出示例:openjdk version "11.0.2" 2019-01-15 LTS

4.2 网络配置要求

分布式压测对网络质量敏感。Controller 与 Worker 之间通过 RMI 协议交换测试计划、采样结果和控制指令,网络延迟和丢包会直接拉低压测吞吐上限。

4.2.1 网络拓扑与延迟要求

  • 同机房部署: Controller 与所有 Worker 必须位于同一内网网段,建议二层互通。RTT(往返延迟)应 < 1ms。
  • 跨机房/云区域: 必须通过专线或高带宽 VPN 连接,RTT 不得超过 5ms,否则需启用 mode=StrippedAsynch 或调整 RMI 超时参数。
  • 禁止通过公网 IP 直连: 公网延迟高、丢包不可控,且存在安全风险。所有节点间通信必须走内网或隧道。

4.2.2 带宽估算公式

每个 Worker 节点所需的网络带宽下限:

带宽下限 (Mbps) = (单请求响应体大小 KB × 目标TPS) × 8 / 1024 × 1.5(冗余系数)

示例:单响应 50KB,目标 TPS 2000
带宽 = (50 × 2000) × 8 / 1024 × 1.5 ≈ 1171 Mbps → 需万兆网卡
💡 经验值: 当单 Worker TPS > 5000 或单响应体 > 100KB 时,建议将网卡升级为 10GbE,并启用 jumbo frame(MTU 9000)以降低 CPU 开销。

4.3 防火墙与端口开放策略

JMeter 分布式压测依赖 RMI 动态端口分配,这是防火墙配置中最容易出错的环节。默认情况下,JMeter 的 RMI 端口是随机分配的,必须强制固定端口范围才能通过防火墙白名单。

4.3.1 端口规划清单

用途 协议 默认端口 推荐固定端口 开放方向
Controller → Worker RMI 注册 TCP 1099 1099 Controller 出 → Worker 入
Worker → Controller 数据回传 TCP 随机 (0-65535) 40000-40100 Worker 出 → Controller 入
Controller 自身 RMI 服务 TCP 随机 40101-40110 Controller 本机监听
SSH 管理 TCP 22 22 或自定义 运维跳板机 → 所有节点

4.3.2 固定 RMI 端口配置

在 所有 Worker 节点 的 jmeter.properties 中追加:

# 固定 Worker RMI 注册端口
server.rmi.port=1099
# 固定 Worker RMI 数据回传端口范围
server.rmi.localport=40000-40100
# 关闭 SSL(内网环境)
server.rmi.ssl.disable=true

在 Controller 节点 的 jmeter.properties 中追加:

# 固定 Controller 端 RMI 监听端口范围
client.rmi.localport=40101-40110
# 关闭 SSL
server.rmi.ssl.disable=true

4.3.3 iptables / firewalld 配置示例

以 CentOS 7 的 firewalld 为例,在 Worker 节点执行:

# 开放 RMI 注册端口
sudo firewall-cmd --permanent --add-port=1099/tcp
# 开放 RMI 数据回传端口范围
sudo firewall-cmd --permanent --add-port=40000-40100/tcp
# 重新加载规则
sudo firewall-cmd --reload
# 验证
sudo firewall-cmd --list-ports
🔑 关键检查点: 配置完成后,在 Controller 节点执行 telnet <worker-ip> 1099,确认端口可达。若超时,请检查 Worker 侧防火墙、云平台安全组、以及 iptables 规则链顺序。

4.4 集群网络架构总览

下图展示了 1 个 Controller + 3 个 Worker 的标准分布式压测集群网络拓扑与端口流向:

分布式压测集群网络拓扑与端口流向 分布式压测集群网络拓扑与端口流向 Controller 节点 端口:40101-40110(监听) Worker 节点 1 端口:1099 / 40000-40100 Worker 节点 2 端口:1099 / 40000-40100 Worker 节点 3 端口:1099 / 40000-40100 RMI 注册 (1099) RMI 注册 (1099) RMI 注册 (1099) 数据回传 (40000-40100) 数据回传 (40000-40100) 图例说明: 实线 = RMI 注册连接(Controller 主动发起) 虚线 = 采样数据回传(Worker 主动发起)

4.5 环境验证清单

完成上述配置后,按以下清单逐项确认,避免遗漏:

  1. JDK 版本一致性: 所有节点 java -version 输出完全一致。
  2. 主机名解析: /etc/hosts 中配置所有节点的 IP 与主机名映射,避免 RMI 反向解析失败。
  3. 端口连通性: Controller 节点执行 telnet <worker-ip> 1099 和 telnet <worker-ip> 40000 均返回成功。
  4. 防火墙规则持久化: firewall-cmd --list-ports --permanent 确认规则已持久化,重启后不丢失。
  5. JMeter 配置同步: 所有 Worker 的 jmeter.properties 中 server.rmi.port 和 server.rmi.localport 配置一致。
✅ 快速自检命令: 在 Controller 节点执行 for ip in 192.168.1.10 192.168.1.11 192.168.1.12; do echo "Checking $ip:1099"; timeout 2 bash -c "echo > /dev/tcp/$ip/1099" && echo "OK" || echo "FAIL"; done,批量验证所有 Worker 的 RMI 注册端口。