从零开始搭建 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 集群

相关推荐
m0_741768855 小时前
使用docker的小例子
运维·docker·容器
最新小梦8 小时前
Docker日志管理
运维·docker·容器
ZHOU西口9 小时前
微服务实战系列之玩转Docker(十五)
nginx·docker·微服务·云原生·swarm·docker swarm·dockerui
lgbisha10 小时前
828华为云征文|华为云Flexus X实例docker部署最新Appsmith社区版,搭建自己的低代码平台
低代码·docker·华为云
记得开心一点嘛10 小时前
在Linux系统上使用Docker部署javaweb项目
linux·运维·docker
Persistence is gold12 小时前
cassandra指定配置文件的docker启动方法
运维·docker·容器
C语言扫地僧13 小时前
Docker 镜像制作(Dockerfile)
linux·服务器·docker·容器
苹果醋313 小时前
react 路由 react-router/react-router-dom
运维·nginx
EMQX16 小时前
提高数据集成稳定性:EMQX Platform 端到端规则调试指南
mqtt·emqx
无名之逆16 小时前
云原生(Cloud Native)
开发语言·c++·算法·云原生·面试·职场和发展·大学期末