負載均衡器(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 文檔