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

基于 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.dtcms.com/a/291028.html

相关文章:

  • vscode创建vue项目报错
  • 如何判断自己的电脑或主机是否支持DDR5内存?
  • Android 默认图库播放视频没有自动循环功能,如何添加2
  • MVC模式
  • vcruntime140_1.dll文件丢失?终极修复指南:从错误分析到修复全流程
  • Ubuntu 22.04 使用 Docker 安装 Redis 5 (安装包形式)
  • linux定时器使用
  • AD域控制器虚拟化的安全加固最佳实践
  • 从IR到DS的转化过程中,如何确保各阶段需求不偏离用户原始场景?有哪些验证方法?
  • 吴恩达 机器学习cs229-学习笔记-更新中
  • 动静态库原理与实战详解
  • Linux 721 创建实现镜像的逻辑卷
  • 网站域名备案和服务器有关系吗
  • 《电⼦元器件零基础⼊⻔》
  • 汽车售后诊断仪DoIP和CANBus诊断指令分析
  • Linux的磁盘存储管理实操——(中)——逻辑卷管理实战
  • Ubuntu 22.04编译安装Nginx 1.28
  • Docker实践:使用Docker部署blog轻量级博客系统
  • 我的NAS进化史:用1Panel和内网穿透把零配件变成远程中枢
  • 超详细解析:Java装箱与拆箱(附完整数据类型清单)
  • 在 HTTP GET 请求中传递参数有两种标准方式
  • 【Java】Spring的依赖注入理解,@Autowired用法
  • 网络数据分层封装与解封过程的详细说明
  • STM32 开发的鼠标:技术详解与实现指南
  • RBAC(Role-Based Access Control,基于角色的访问控制)介绍(一种通过角色来管理用户权限的访问控制模型)
  • 深入解析 SymPy 中的符号计算:导数与变量替换的实践指南
  • 【未限制消息消费导致数据库CPU告警问题排查及解决方案】
  • 司南评测体系全新升级,“五位一体”评估全链路关键能力
  • 神经网络过拟合处理:原理与实践
  • C++实战案例:从static成员到线程安全的单例模式