当前位置: 首页 > news >正文

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

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

架构

emqx-brench

在设计以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文件定义了服务的配置、网络和卷挂载。

文件目录

|-- 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

配置文件

version: '3'
services:emqx1:image: emqx/emqx:5.4.1container_name: emqx1hostname: emqx1-cluster.emqx.ioenvironment:- 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.ioports:- 18083:18083networks:- emqx-netemqx2:image: emqx/emqx:5.4.1 container_name: emqx2hostname: emqx2-cluster.emqx.ioenvironment:- 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-netemqx3:image: emqx/emqx:5.4.1container_name: emqx3hostname: emqx3-cluster.emqx.ioenvironment:- 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.ionetworks:- emqx-netnginx:image: nginx:1.23.0-alpinecontainer_name: nginxports:- 1883:1883- 8883:8883- 8083:8083 - 8084:8084- 8888:8888 # nginx statusvolumes:- $PWD/nginx.conf:/etc/nginx/nginx.conf- $PWD/certs:/etc/nginx/certsnetworks:- emqx-netmqttx-cli: # 指定压测工具image: emqx/mqttx-clicontainer_name: mqttx-cli command: mqttx bench conn -c 2000 -h nginx  # 对nginx容器进行压测networks:emqx-net: # mqttx-cli 与 其他容器 在同一局域网中ipv4_address: 172.26.0.12networks:emqx-net:driver: bridgeipam:config:- subnet: 172.26.0.0/16

启动服务

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子进程负载数

# /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
don=`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支持自动化测试脚本,提高测试效率。

劣势:

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

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

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

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

项目地址

emqx-cluster

相关文章

用 NGINX 负载均衡 EMQX 集群

相关文章:

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

从零开始搭建 EMQX 集群压测框架 架构 在设计以EMQX为中心的MQTT消息队列集群压力测试框架时,我们采用微服务架构模式。EMQX作为消息队列的核心,负责处理MQTT协议的消息发布和订阅。Nginx作为EMQX的反向代理,负责负载均衡和SSL/TLS终端。MQT…...

ArkUI基本介绍

ArkUI:提供HarmonyOS应用UI开发框架,几件开发、精致体验、跨设备/跨平台。 ArkUI(方舟UI框架)为应用的UI开发提供了完整的基础设施,包括简洁的UI语法、丰富的UI功能(组件、布局、动画以及交互事件&#xff…...

vue2+OpenLayers 天地图上打点并且显示相关的信息(2)

上次是在地图上打点 这次鼠标移动在图标上面显示相关的信息 首先有两个事件 鼠标移入 和 鼠标移出事件 pointermove pointerout 鼠标放上去之前 放上去后 代码如下 <template><div class"container"><div id"vue-openlayers" class&quo…...

c++继承(二)

一、友元函数的继承 友元函数不能被继承&#xff0c;就像爸爸的朋友不是你的朋友&#xff0c;如果要有友元函数&#xff0c;在子类重新定义一个。 二、静态成员的继承 静态成员的继承仍然是那个成员&#xff0c;普通成员的继承是不同的。 父类的静态成员属于当前类&#xf…...

低代码开发的崛起:机遇与挑战

近年来&#xff0c;“低代码”开发平台的迅速崛起&#xff0c;已经成为IT行业中不可忽视的趋势。这些平台承诺让非专业人士也能快速构建应用程序&#xff0c;通过减少代码编写的需求&#xff0c;大幅提高开发效率。对于许多企业而言&#xff0c;低代码开发工具成为了一个加速数…...

Json-JacksonUtils工具类

为了创建一个通用的 Jackson 工具类,我们可以定义一个名为 JacksonUtils 的工具类,该类将提 供多种方法来支持不同类型的 JSON 转换需求。下面是一个示例实现,包括基本的 JSON 到 Java 对象的转换、Java 对象到 JSON 的转换、以及更复杂的类型如 CommonResult 的转换。 C…...

svn客户端装完后没有svn.exe

如果SVN客户端&#xff08;如TortoiseSVN&#xff09;安装完成后&#xff0c;在预期的安装目录&#xff08;通常是bin目录&#xff09;中没有找到svn.exe文件&#xff0c;这通常是因为在安装过程中没有选择安装命令行客户端工具&#xff08;Command Line Client Tools&#xff…...

TinyWebserver的复现与改进(4):主线程的具体实现

GitHub - yzfzzz/MyWebServer: Linux高并发服务器项目&#xff0c;参考了TinyWebServer&#xff0c;将在此基础上进行性能改进与功能增加。为方便读者学习&#xff0c;附带详细注释和博客&#xff01; TinyWebserver的复现与改进&#xff08;1&#xff09;&#xff1a;服务器环…...

DaemonSet 不能帮助我们做什么事情?

DaemonSet 不能帮助我们做什么事情&#xff1f; A. 保证集群内每一个(或者一些)节点都运行一组相同的Pod B. 跟踪集群节点状态&#xff0c;保证新加入的节点自动创建对应的Pod C. 跟踪集群节点状态&#xff0c;保证移除的节点删除对应的Pod D. 能够设置Pod重试次数&#xff0c;…...

开源模型应用落地-LangChain高阶-记忆组件-RedisChatMessageHistory正确使用(八)

一、前言 LangChain 的记忆组件发挥着至关重要的作用,其旨在协助大语言模型(LLM)有效地留存历史对话信息。通过这一功能,使得大语言模型在对话过程中能够更出色地维持上下文的连贯性和一致性,进而能够像人类的记忆运作方式那样,进行更为自然、流畅且智能化的交互。 它仿佛…...

解决Openwrt 串口默认是没有密码的方法

将串口登录加入密码方法如下&#xff1a; 步骤一&#xff1a;配置busybox的登录&#xff0c;可以在.config文件中添加如下 CONFIG_BUSYBOX_CONFIG_LOGINy 添加后&#xff0c;需要重新编译busybox。 步骤二&#xff1a;修改target/linux/ramips/base-files/etc/inittab文件 将…...

【vue讲解:v-model 之 lazy、number、trim、与后端交互、小电影案例】

2 v-model 之 lazy、number、trim lazy&#xff1a;等待input框的数据绑定时区焦点之后再变化 number&#xff1a;数字开头&#xff0c;只保留数字&#xff0c;后面的字母不保留&#xff1b;字母开头&#xff0c;都保留 trim&#xff1a;去除首位的空格<!DOCTYPE html> …...

ECCV 2024 | 南洋理工三维数字人生成新范式:结构扩散模型

该论文作者均来自于新加坡南洋理工大学 S-Lab 团队&#xff0c;包括博士后胡涛&#xff0c;博士生洪方舟&#xff0c;以及计算与数据学院刘子纬教授&#xff08;《麻省理工科技评论》亚太地区 35 岁以下创新者&#xff09;。S-Lab 近年来在顶级会议如 CVPR, ICCV, ECCV, NeurIP…...

2024.8.13-算法学习(原创+转载)

一、什么是张量并行&#xff08;Tensor Parallelism&#xff09; &#xff1f; 张量并行&#xff08;Tensor Parallelism&#xff09; 是一种分布式矩阵算法。 随着模型越来越大&#xff0c;模型内的矩阵也越来越大。一个大矩阵的乘法可以拆分成多个小矩阵的运算&#xff0c;…...

beautifulsoup的简单使用

文章目录 beautifulsoup一. beautifulsoup的简单使用1、安装2、如何使用3、对象的种类 二、beautifulsoup的遍历文档树2.1 子节点.contents 和 .children descendants2.2 节点内容.string.text 2.3 多个内容.strings**.stripped_strings** 2.4 父节点.parent.parents 三、beaut…...

【Python】Jupyter Notebook的安装及简单使用

Jupyter Notebook的安装及简单使用1、安装2、language设置为中文3、Jupyter Notebook启动4、Jupyter Notebook的常用快捷方式5、将Notebook笔记转为其他文件格式保存 Jupyter Notebook的安装及简单使用 不安装AnaCoda&#xff0c;但需要使用Jupyter Notebook 1、安装 pip inst…...

中国自动驾驶出租车冲击网约车市场

近年来&#xff0c;中国的自动驾驶技术迅速发展&#xff0c;对传统网约车市场构成了越来越大的冲击。随着科技巨头百度旗下的萝卜快跑等公司加速推广无人驾驶出租车&#xff0c;这一趋势引发了广泛的讨论和担忧。 自动驾驶技术的迅猛发展 中国自动驾驶行业正处于快速发展阶段&…...

解决浏览器书签同步问题,极空间部署开源免费的跨平台书签同步工具『xBrowserSync』

解决浏览器书签同步问题&#xff0c;极空间部署开源免费的跨平台书签同步工具『xBrowserSync』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 作为一个喜欢折腾的数码党&#xff0c;我平时上网冲浪使用的浏览器绝不会只限于一种&#xff0c;就比如说我在上班的地方只会用到Edge浏…...

14个SpringBoot优化小妙招

今天我们来分享一下平时用SpringBoot开发时候的一些优化小妙招&#xff0c;用好这些优化小妙招让我们开发的系统架构、系统代码、开发流程、测试流程、运维监控看起来就跟写诗一样优雅&#xff0c;让我们每个人手头负责的代码和工程都要很漂亮~~~ 这里的优化小妙招很多不是说直…...

Elasticsearch 度量(Metric)聚合详解及示例

Elasticsearch 提供了强大的聚合功能&#xff0c;允许用户对数据进行深入的统计分析。度量&#xff08;Metric&#xff09;聚合是其中一种&#xff0c;它用于对数值型数据进行计算&#xff0c;如求和、平均值、最大值、最小值等。本文将详细介绍 Elasticsearch 的度量聚合&…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

链式法则中 复合函数的推导路径 多变量“信息传递路径”

非常好&#xff0c;我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题&#xff0c;统一使用 二重复合函数&#xff1a; z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y))​ 来全面说明。我们会展示其全微分形式&#xff08;偏导…...

python打卡第47天

昨天代码中注意力热图的部分顺移至今天 知识点回顾&#xff1a; 热力图 作业&#xff1a;对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图&#xff0c;展示模…...

Axure零基础跟我学:展开与收回

亲爱的小伙伴,如有帮助请订阅专栏!跟着老师每课一练,系统学习Axure交互设计课程! Axure产品经理精品视频课https://edu.csdn.net/course/detail/40420 课程主题:Axure菜单展开与收回 课程视频:...