基于 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 文档