从零开始搭建 EMQX 集群压测框架

从零开始搭建 EMQX 集群压测框架

架构

在设计以EMQX为中心的MQTT消息队列集群压力测试框架时,我们采用微服务架构模式。EMQX作为消息队列的核心,负责处理MQTT协议的消息发布和订阅。Nginx作为EMQX的反向代理,负责负载均衡和SSL/TLS终端。MQTTX-CLI作为压力测试工具,模拟大量客户端连接和消息交换。

流程

  1. 使用Docker Compose定义EMQX集群服务、Nginx服务和MQTTX-CLI测试客户端。
  2. EMQX集群启动并等待客户端连接。
  3. Nginx启动并配置为EMQX集群的入口,处理来自外部的MQTT连接请求。
  4. MQTTX-CLI启动并模拟成千上万的客户端连接到Nginx代理。
  5. 收集测试数据,分析EMQX集群的性能和稳定性。

各服务功能

  • EMQX:高性能的分布式MQTT消息队列,处理消息发布、订阅和路由。
  • Nginx:反向代理服务器,提供负载均衡、SSL终端、连接限制和访问控制。
  • MQTTX-CLI:命令行工具,用于模拟大量MQTT客户端进行压力测试。

部署

使用DockerDocker Compose进行服务的容器化部署。每个服务都被封装在独立的Docker容器中,通过Docker网络进行通信。Docker Compose文件定义了服务的配置、网络和卷挂载。

文件目录

bash 复制代码
|-- LICENSE
|-- README.md
|-- mqtt-lb-haproxy
`-- mqtt-lb-nginx
    |-- README.md
    |-- certs
    |   |-- cacert.pem
    |   |-- cert.pem
    |   |-- client-cert.pem
    |   |-- client-key.pem
    |   `-- key.pem
    |-- docker-compose.yaml
    |-- mqttx_cli_emqx_tcp.json
    |-- mqttx_cli_emqx_tls.json
    `-- nginx.conf

配置文件

yaml 复制代码
version: '3'
services:
  emqx1:
    image: emqx/emqx:5.4.1
    container_name: emqx1
    hostname: emqx1-cluster.emqx.io
    environment:
      - EMQX_NODE__NAME=emqx1@emqx1-cluster.emqx.io
      - EMQX_CLUSTER__DISCOVERY_STRATEGY=static
      - EMQX_CLUSTER__STATIC__SEEDS=emqx1@emqx1-cluster.emqx.io,emqx2@emqx2-cluster.emqx.io,emqx3@emqx3-cluster.emqx.io
    ports:
      - 18083:18083
    networks:
      - emqx-net

  emqx2:
    image: emqx/emqx:5.4.1 
    container_name: emqx2
    hostname: emqx2-cluster.emqx.io
    environment:
      - EMQX_NODE__NAME=emqx2@emqx2-cluster.emqx.io
      - EMQX_CLUSTER__DISCOVERY_STRATEGY=static
      - EMQX_CLUSTER__STATIC__SEEDS=emqx1@emqx1-cluster.emqx.io,emqx2@emqx2-cluster.emqx.io,emqx3@emqx3-cluster.emqx.io   
    networks:
      - emqx-net

  emqx3:
    image: emqx/emqx:5.4.1
    container_name: emqx3
    hostname: emqx3-cluster.emqx.io
    environment:
      - EMQX_NODE__NAME=emqx3@emqx3-cluster.emqx.io
      - EMQX_CLUSTER__DISCOVERY_STRATEGY=static
      - EMQX_CLUSTER__STATIC__SEEDS=emqx1@emqx1-cluster.emqx.io,emqx2@emqx2-cluster.emqx.io,emqx3@emqx3-cluster.emqx.io
    networks:
      - emqx-net

  nginx:
    image: nginx:1.23.0-alpine
    container_name: nginx
    ports:
      - 1883:1883
      - 8883:8883
      - 8083:8083 
      - 8084:8084
      - 8888:8888 # nginx status
    volumes:
      - $PWD/nginx.conf:/etc/nginx/nginx.conf
      - $PWD/certs:/etc/nginx/certs
    networks:
      - emqx-net
   
  mqttx-cli: # 指定压测工具
    image: emqx/mqttx-cli
    container_name: mqttx-cli 
    command: mqttx bench conn -c 2000 -h nginx  # 对nginx容器进行压测
    networks:
      emqx-net: # mqttx-cli 与 其他容器 在同一局域网中
        ipv4_address: 172.26.0.12

networks:
  emqx-net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.26.0.0/16

启动服务

bash 复制代码
cd mqtt-lb-nginx && docker-compose up -d

# 查看服务运行状态
[root@master mqtt-lb-nginx]# docker-compose ps
NAME                COMMAND                  SERVICE             STATUS              PORTS
emqx1               "/usr/bin/docker-ent..."   emqx1               running             0.0.0.0:18083->18083/tcp, :::18083->18083/tcp
emqx2               "/usr/bin/docker-ent..."   emqx2               running             18083/tcp
emqx3               "/usr/bin/docker-ent..."   emqx3               running             18083/tcp
mqttx-cli           "docker-entrypoint.s..."   mqttx-cli           running             
nginx               "/docker-entrypoint...."   nginx               running             0.0.0.0:1883->1883/tcp ...

查看nginx子进程负载数

bash 复制代码
# /home/nginx-cores.sh 需要在nginx 容器中先创建
[root@master mqtt-lb-nginx]# docker exec -it nginx cat /home/nginx-cores.sh
#!/bin/sh
nginx_pids=`ps aux |grep "[n]ginx: worker"|awk '{print $1}'`
for pid in $nginx_pids
do
	n=`ls /proc/$pid/fd |wc|awk '{print $1}'`
	echo "pid = $pid $n connection"
done

# 查看nginx子进程负载数
[root@master mqtt-lb-nginx]# docker exec -it nginx sh /home/nginx-cores.sh
pid = 174 1286 connection
pid = 175 1270 connection
pid = 176 1270 connection
pid = 177 1270 connection
pid = 178 1270 connection
pid = 179 1270 connection
pid = 180 1270 connection
pid = 181 1270 connection

emqx dashboard

访问地址:ip:18083

优劣势

优势:

  • 容器化部署:快速部署和易于管理,确保环境一致性。
  • 可扩展性EMQX集群和Nginx可以水平扩展以处理更大的负载。
  • 灵活性Nginx提供灵活的配置选项,如SSL、负载均衡策略等。
  • 自动化测试MQTTX-CLI支持自动化测试脚本,提高测试效率。

劣势:

  • 资源消耗:容器化可能占用较多的服务器资源。
  • 复杂性Docker容器管理和服务编排增加了系统的复杂性。
  • 网络配置:容器间的网络通信需要合理配置,以确保数据流畅。
  • 性能评估 :通过压力测试,评估EMQX集群在高负载下的性能表现。

安全性考虑Nginx作为反向代理,可以实施安全策略,如TLS加密和访问控制。

监控和日志 :集成监控系统,如PrometheusGrafana,收集和分析性能数据。

通过综合考虑这些因素,可以设计并实现一个高效、可靠且易于维护的EMQX集群压力测试框架。通过Docker部署,我们能够实现快速、灵活的系统搭建和管理。

项目地址

emqx-cluster

相关文章

用 NGINX 负载均衡 EMQX 集群

相关推荐
java_logo2 小时前
Apache Doris Docker 部署指南:实时分析数据库实战
数据库·docker·apache·doris·apache doris·轩辕镜像·docker部署doris
Linux-18749 小时前
分布式链路追踪系统之docker-compose安装skywalking
云原生·docker-compose·skywalking·分布式链路追踪系统·应用程序性能监控
生活爱好者!15 小时前
我把NAS当作下载机,docker一键部署qb
运维·docker·容器
隔窗听雨眠15 小时前
Spring Boot在云原生时代的编程范式革新研究
spring boot·后端·云原生
java_logo15 小时前
Docker Compose 部署 ClickHouse:快速搭建高性能列式数据库
数据库·clickhouse·docker·列式数据库·轩辕镜像·高性能数据库·clickhouse部署教程
MC皮蛋侠客16 小时前
uv 系列(七):CI/CD、Docker 与私有索引——生产级交付
python·ci/cd·docker·uv
Hui Baby16 小时前
K8S使用CRD和控制器简单应用
云原生·容器·kubernetes
阿里云云原生17 小时前
从“告警驱动”到“巡检驱动”:Agent 智能体如何实现前端体验治理的闭环?
云原生
AOwhisky18 小时前
Python 学习笔记(第十三期)——运维自动化(下·前篇):远程命令执行——paramiko基础篇
运维·python·学习·云原生·自动化·运维开发·paramiko
用户2333768521818 小时前
Docker 端口"时通时不通"的排查实战
docker