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

基于 HAProxy 搭建 EMQ X 集群

负载均衡器(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.xdnf.cn/news/16036.html

相关文章:

  • C++的“链”珠妙笔:list的编程艺术
  • 解决vscode中vue格式化后缩进太小的问题,并去除分号 - 设置Vetur tabSize从2到4,设置prettier取消分号semi
  • 计算机发展史:人工智能时代的智能变革与无限可能
  • 基于WebSocket的安卓眼镜视频流GPU硬解码与OpenCV目标追踪系统实现
  • 【PTA数据结构 | C语言版】哥尼斯堡的“七桥问题”
  • C# Lambdab表达式 Var 类
  • Elupload实现多个文件上传与已上传列表中做对比,若重复则只保留已上传列表中的数据,同时告诉用户,有哪些文件重复上传了
  • 搭建种草商城框架指南
  • 飞算科技:以原创技术为翼,赋能产业数字化转型
  • Linux第三课:需要自己安装的远程登录工具PuTTY的介绍
  • 【PTA数据结构 | C语言版】求单源最短路的Dijkstra算法
  • Taro 本地存储 API 详解与实用指南
  • G7打卡——Semi-Supervised GAN
  • EMBMS1820芯祥科技18单元电池监控器芯片数据手册
  • 华控的科技布局——全球化战略与合作生态
  • 力扣(LeetCode)第 161 场双周赛
  • macbookpro m1 max本儿上速搭一个elasticsearch+kibana环境
  • 基于deepseek的LORA微调
  • 【设计模式C#】简单工厂模式(用于简化获取对象实例化的复杂性)
  • 个人中心产品设计指南:从信息展示到用户体验的细节把控
  • mongodb源代码分析createCollection命令由create.idl变成create_gen.cpp过程
  • 在.NET Core API 微服务中使用 gRPC:从通信模式到场景选型
  • uniapp使用uni-ui怎么修改默认的css样式比如多选框及样式覆盖小程序/安卓/ios兼容问题
  • taro微信小程序的tsconfig.json文件说明
  • Hyperledger Fabric V2.5 生产环境部署及安装Java智能合约
  • 从env到mm_struct:环境变量与虚拟内存的底层实现
  • 来伊份养馋记社区零售 4.0 上海首店落沪:重构 “家门口” 的生活服务生态
  • Django实战:基于Django和openpyxl实现Excel导入导出功能
  • AWS IoT Core CloudWatch监控完整指南
  • 前端包管理工具深度对比:npm、yarn、pnpm 全方位解析