负载均衡器(LB)负责分发设备的 MQTT 连接与消息到 EMQ X 集群,采用 LB 可以提高 EMQ X 集群可用性、实现负载平衡以及动态扩容。

HAProxy简介

HAProxy 是一款高性能的 开源负载均衡器 和 反向代理服务器,主要用于在多个服务器之间分配网络流量,提升系统的可用性、可靠性和性能。它广泛应用于 Web 服务、API 网关、数据库代理等场景,支持 HTTP、TCP 等多种协议。

核心功能

负载均衡

  • 根据预设策略(如轮询、权重、IP 哈希、最少连接数等)将客户端请求分发到后端服务器集群,避免单台服务器过载。
  • 支持动态调整后端服务器状态,自动剔除故障节点,保障服务连续性。

 反向代理

  • 隐藏后端服务器的真实 IP 和结构,增强安全性;同时可集中处理 SSL 终止、请求过滤等任务,减轻后端服务器负担。

 高可用性

  • 轻量级设计,资源占用低,支持单机每秒处理数万至数十万请求,适合高并发场景。
  • 支持健康检查机制,实时监控后端服务器状态,快速切换故障节点。

 灵活的规则配置

  • 通过配置文件定义复杂的路由规则、请求改写、访问控制等,满足多样化业务需求(如基于 URL、域名、客户端 IP 的分流)。

监控与统计

  • 内置统计页面,可实时查看流量分布、服务器状态、响应时间等关键指标,便于运维分析。

典型应用场景

  • 大型网站的流量分发(如电商平台、社交媒体)。
  • API 网关,统一管理接口请求的路由、认证和限流。
  • 数据库读写分离代理,分离读请求到从库,提升主库性能。
  • 跨数据中心的流量调度,实现灾备和就近访问。

优势

  • 高性能:基于事件驱动模型,处理效率远超传统代理工具。
  • 稳定性:成熟可靠,被 Netflix、GitHub、Stack Overflow 等大型平台广泛采用。
  • 灵活性:支持自定义配置和扩展,适配复杂业务场景。

本文将介绍如何基于 HAProxy 部署 EMQ X 集群并在 HAProxy 上终结 SSL 连接,这种部署模式下 EMQ X 单集群可轻松支持数百万设备。

准备

软硬件版本

  • Ubuntu 22.04
  • EMQ X Broker v5.8.7
  • HAProxy 2.2+

机器分配

  • 172.16.239.107:HAProxy
  • 172.16.239.108 (node1.emqx.com):EMQ X 节点 1
  • 172.16.239.109 (node2.emqx.com):EMQ X 节点 2

安装

EMQX

参考 EMQ X Broker

下载  

下载 EMQX 开源版

wget https://www.emqx.com/zh/downloads/broker/5.8.7/emqx-5.8.7-elixir-ubuntu22.04-amd64.tar.gz
 安装
sudo mkdir -p emqx && tar -zxvf emqx-5.8.7-elixir-ubuntu22.04-amd64.tar.gz -C emqx

HAProxy

安装
# 更新软件包索引
sudo apt update # 安装 HAProxy
sudo apt install haproxy# 检查版本  
haproxy -v

配置

EMQX

修改 emqx/etc/emqx.conf 配置文件,另一台同理

## 修改节点名
node {name = "emqx@node1.emqx.com"
}## 修改集群策略为static,无需手动添加节点了
cluster {discovery_strategy  =  staticstatic {## 所有集群节点	seeds = ["emqx@node1.emqx.com", "emqx@node2.emqx.com"]}
}## 为了获取 真实IP 地址,需要设置 proxy_protocol
listeners.tcp.default {bind = "0.0.0.0:1883"max_connections = 1024000proxy_protocol = true
}

HAProxy

修改 /etc/haproxy/haproxy.cfg

添加 TCP backend 配置
backend backend_emqx_tcpmode tcpbalance roundrobinserver emqx_node_1 node1.emqx.com:1883 check-send-proxy send-proxy-v2 check inter 10s fall 2 rise 5server emqx_node_2 node2.emqx.com:1883 check-send-proxy send-proxy-v2 check inter 10s fall 2 rise 5
 添加 TCP frontend 配置
frontend frontend_emqx_tcpbind *:1883option tcplogmode tcpdefault_backend backend_emqx_tcp

可配置的负载均衡策略

HAProxy 提供了多种负载均衡策略,用于控制连接的分发方式。在实际使用中,根据您的服务器性能、流量需求等选择适当的负载均衡策略非常重要。

以下是 HAProxy 支持的负载均衡策略与配置方式。

轮询(Round Robin)

这是默认的负载均衡策略,它将请求依次分配给每个后端服务器,循环往复。这样可以平均分担负载,适用于后端服务器性能差不多的情况。

backend mqtt_backendmode tcpbalance roundrobinserver emqx1 emqx1-cluster.emqx.io:1883 checkserver emqx2 emqx2-cluster.emqx.io:1883 checkserver emqx3 emqx3-cluster.emqx.io:1883 check

权重轮询(Weighted Round Robin)

在轮询基础上,为每个 EMQX 节点分配不同的权重,从而影响请求分配的比例。权重越高的服务器会获得更多的请求。

backend mqtt_backendmode tcpbalance roundrobinserver emqx1 emqx1-cluster.emqx.io:1883 check weight 5server emqx2 emqx2-cluster.emqx.io:1883 check weight 2server emqx3 emqx3-cluster.emqx.io:1883 check weight 3

IP 哈希(IP Hash)

根据客户端的 IP 地址进行哈希计算,然后将请求分配给一个固定的后端服务器。这确保同一个客户端的请求总是分发到同一个服务器上。

backend mqtt_backendmode tcpbalance sourceserver emqx1 emqx1-cluster.emqx.io:1883server emqx2 emqx2-cluster.emqx.io:1883server emqx3 emqx3-cluster.emqx.io:1883

最少连接数(Least Connections)

请求分发到当前连接数最少的服务器,以确保每个服务器的负载尽可能平衡。适用于后端服务器性能差异较大的情况。

backend mqtt_backendmode tcpbalance leastconnserver emqx1 emqx1-cluster.emqx.io:1883server emqx2 emqx2-cluster.emqx.io:1883server emqx3 emqx3-cluster.emqx.io:1883
 添加 dashboard backend 配置
backend backend_emqx_dashboardbalance roundrobinserver emqx_node_1 node1.emqx.com:18083 checkserver emqx_node_2 node2.emqx.com:18083 check
添加 dashboard frontend 配置
frontend frontend_emqx_dashboardbind *:18083option tcplogmode tcpdefault_backend backend_emqx_dashboard

配置反向代理 MQTT WebSocket

backend mqtt_ws_backendmode tcpbalance roundrobinserver emqx_node_1 node1.emqx.com:8083 checkserver emqx_node_2 node1.emqx.com:8083 checkfrontend mqtt_ws_frontendbind *:8083 mode tcpdefault_backend mqtt_ws_backend

监控 HAProxy 状态

为 HAProxy 配置一个特殊的 frontend 即可实现状态监控,能够查看每个 backend 与 frontend 连接情况,以及全局的连接统计信息。参考 Exploring the HAProxy Stats Page:

frontend statsmode httpbind *:8888stats enablestats uri /statsstats refresh 10s

重新加载 HAProxy 以应用新的配置,建议先检查配置:

sudo service haproxy reload

 打开 http://localhost:8888/stats 查看状态数据:

HAProxy 高可用方案介绍

HAProxy 和 Keepalived 是一种常见的高可用性和负载均衡解决方案的组合。Keepalived 是 Linux下⼀个轻量级别的⾼可⽤解决⽅案,它可以管理多个服务器上的虚拟 IP 地址(VIP),并确保在某个服务器不可用时将 VIP 迁移到另一个服务器,从而实现高可用性。Keepalived 还可以监控 HAProxy 进程,并在需要时重新启动它,以确保负载均衡服务的可用性。

通过使用 Keepalived,可以确保 HAProxy 的高可用性。如果主要的 HAProxy 服务器出现故障,Keepalived 将自动将 VIP 迁移到备用服务器上,从而确保服务的连续性。想要了解如何使用该方案,请参考 HAProxy 文档。

运行

EMQX

# 启动
./bin/emqx start## 查看集群状态
./bin/emqx_ctl cluster statusCluster status: #{running_nodes =>['emqx@node1.emqx.com','emqx@node2.emqx.com'],stopped_nodes => []}

HAProxy

sudo service haproxy start

此时便可以通过 18083 访问 dashboard

通过 1883 连接到集群,连接情况可以在 dashboard 查看,或者在节点上执行命令

 ./bin/emqx_ctl clients list

证书

如果需要 TLS 终结,先准备好 emqx.key 和 emqx.crt 文件,然后合并生成 emqx.pem 文件

cat emqx.crt emqx.key > emqx.pem

然后添加以下配置即可

frontend frontend_emqx_tcpbind *:8883 ssl crt /opt/certs/emqx.pem no-sslv3option tcplogmode tcpdefault_backend backend_emqx_tcp

至此,我们完成了基于 HAProxy 搭建 EMQ X 集群以及使用,HAProxy 更详细的使用参见 HAProxy Documentation。

参考

基于 HAProxy 搭建 EMQ X 集群

用 HAProxy 负载均衡 EMQX 集群 | EMQX 5.8 文档

集群负载均衡 | EMQX 5.8 文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/90263.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/90263.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/90263.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RISC-V基金会Datacenter SIG月会圆满举办,探讨RAS、PMU性能分析实践和经验

一直以来,龙蜥社区在 RISC-V 生态建设中持续投入,并积极贡献上游社区。多位龙蜥社区成员在 RISC-V 国际基金会担任主席/副主席角色,与来自阿里云、阿里达摩院、中兴通讯、浪潮信息、中科院软件所、字节跳动、Google、 MIT、Akeana 等企业的专…

CloudComPy使用PyInstaller打包后报错解决方案

情况描述 笔者在spec文件中,datas变量设置如下。如果你的报错类似于“找不到cloudComPy”,先尝试如下的设置。 datas[(CloudCompare,cloudComPy)], 笔者在打包完成后,打开软件发现报错: from cloudComPy import* ModuleNotFoun…

node.js中的path模块

在 Node.js 中,path 模块提供了处理和操作文件路径的功能,其中 path.join 和 path.resolve 是两个常用的方法。它们在处理路径时有不同的行为和用途: 功能概述 path.join(): 该方法主要用于将多个路径片段拼接成一个完整的路径字符串。它会正…

将Scrapy项目容器化:Docker镜像构建的工程实践

引言:爬虫容器化的战略意义在云原生与微服务架构主导的时代,​​容器化技术​​已成为爬虫项目交付的黄金标准。据2023年分布式系统调查报告显示:92%的生产爬虫系统采用容器化部署容器化使爬虫环境配置时间​​减少87%​​Docker化爬虫的故障…

Unity × RTMP × 头显设备:打造沉浸式工业远控视频系统的完整方案

结合工业现场需求,探索如何通过大牛直播SDK打造可在 Pico、Quest 等头显设备中运行的 RTMP 低延迟播放器,助力构建沉浸式远程操控系统。 一、背景:沉浸式远程操控的新趋势 随着工业自动化、5G 专网、XR 技术的发展,远程操控正在从…

HTTPS如何保障安全?详解证书体系与加密通信流程

HTTP协议本身是明文传输的,安全性较低,因此现代互联网普遍采用 HTTPS(HTTP over TLS/SSL) 来实现加密通信。HTTPS的核心是 TLS/SSL证书体系 和 加密通信流程。一、HTTPS 证书体系HTTPS依赖 公钥基础设施(PKI, Public K…

数据的评估与清洗篇---清洗数据

处理前的准备 检查索引与列名 在处理内容之前,需要先看看索引或列名是否有意义,若索引和列名都是乱七八糟的,应该对他们进行重命名或者重新排序,以便我们理解数据。 清洗数据 清洗数据原则 针对数据内容,一般先解决结构性问题,再处理内容性问题。整洁数据的特点是: …

Ubuntu apt和apt-get的区别

好的,这是一个非常经典且重要的问题。apt install 和 apt-get install 的区别是很多 Ubuntu/Debian 新手都会遇到的困惑。 简单来说,它们的功能非常相似,但设计目标和用户体验不同。 一句话总结 apt 是 apt-get 的一个更新、更友好、更现代化…

多端适配灾难现场:可视化界面在PC/平板/大屏端的响应式布局实战

摘要精心设计的可视化大屏,在平板上显示时图表挤成一团,在PC端操作按钮小到难以点击,某企业的可视化项目曾因多端适配失败沦为“灾难现场”,不仅用户差评如潮,还被竞争对手嘲讽技术落后。多端适配真的只能靠“反复试错…

Vulnhub Web-Machine-N7靶机攻略(附VB安装教程)

1.VB安装 安装地址:https://download.virtualbox.org/virtualbox/7.1.12/VirtualBox-7.1.12-169651-Win.exe 下载好后直接打开即可开始安装。安装前先打开任务管理器(搜索框直接搜索即可)查看性能里面的虚拟化是否打开。 开始安装。 这里显…

vite搭建react-ts项目,@别名配置

vite搭建react-ts项目,别名配置一、配置别名二、输入/能索引文件三、解决找不到模块“/pages/home”或其相应的类型声明一、配置别名 vite.config.ts文件 import { defineConfig, loadEnv, type ConfigEnv, type UserConfig } from "vite"; import reac…

AWS OpenSearch 搜索排序常见用法

背景介绍 AWS OpenSearch是AWS的一个检索分析服务&#xff0c;是基于开源的Elasticsearch 7.x分支fork出来的独立的一个代码仓库&#xff0c;做了独立的维护&#xff0c;加入了一些自己的优化&#xff0c;本文在这里主要介绍是常见的基础用法 引入相关依赖<dependency>&l…

深度分析Java内存结构

Java内存结构是JVM的核心机制&#xff0c;直接关系到程序性能、并发能力和稳定性。下面从规范、实现到实践进行深度分析&#xff1a;一、JVM规范定义的内存区域 1. 程序计数器&#xff08;Program Counter Register&#xff09; 作用&#xff1a;存储当前线程执行的字节码指令地…

vs2019 创建MFC ActiveX的详细步骤

第一步 创建1个MFC ActiveX控件工程 添加方法 输入方法名称选择返回类型点击 添加参数&#xff0c;最后点击确认&#xff0c;如下图 添加的Add方法 注意&#xff0c;如需要添加1个指针类型的参数&#xff0c;需要手动输入* 最后编译&#xff0c;如编译出现下图错误&#xf…

pyarmor加密源代码

使用低版本python 避免出现加密限制&#xff0c;无法加密情况 环境&#xff1a;python3.9.9 安装 pyinsatller 及 pyarmor pip install pyinsatller pyarmor添加 其它pyinstaller 打包参数 一定在下边正式打包命令运行前执行 具体参考 https://pyarmor.readthedocs.io/zh/stabl…

MACOS安装配置Gradle

一、概述 gradle的运行高度依赖jvm版本&#xff0c;所以在安装之前一定要先安装jdk&#xff0c;同时gradle版本必须与jdk版本对应&#xff0c;不然在项目编译的时候会报版本不兼容导致编译不成功的问题。 官方说明地址 以下是官方列出关系对应版本的关系列表&#xff1a; 本文…

1.1.2 建筑构造要求

1、建筑构造的影响因素1&#xff09;荷载因素&#xff08;受力&#xff09;&#xff1a;结构自重、活荷载、风荷载、雪荷载、地震作用2&#xff09;环境因素&#xff1a;自然因素&#xff08;风吹、日晒、雨淋、积雪、冰冻、地下水、地震等&#xff09;、人为因素&#xff08;火…

gig-gitignore工具实战开发(一):项目愿景与蓝图规划

文章目录gig-gitignore工具实战开发&#xff08;一&#xff09;&#xff1a;项目愿景与蓝图规划 &#x1f680;&#x1f631; 一、痛点&#xff1a;被忽视的.gitignore&#x1f3af; 二、愿景&#xff1a;.gitignore的全生命周期管理&#x1f6e0;️ 三、核心功能规划&#x1f…

C# 基于halcon的视觉工作流-章22-直线查找

C# 基于halcon的视觉工作流-章22-直线查找 本章目标&#xff1a; 一、创建直线卡尺工具&#xff1b; 二、测量及拟合直线&#xff1b; 三、匹配批量查找&#xff1b;寻找整图中所有直线&#xff0c;可用霍夫直线查找等算法&#xff0c;而寻找图片中指定区域的直线&#xff0c;除…

统计与大数据分析与数学金融方向课程差异有哪些?如何提升职场竞争力?

准大一新生在选择专业时&#xff0c;常常会在 “统计与大数据分析” 和 “数学金融” 之间犹豫不决。这两个专业看似都与数字、模型打交道&#xff0c;课程设置存在一定交叉&#xff0c;但核心方向又各有侧重。深入了解它们的异同&#xff0c;能为专业选择和学习规划提供更清晰…