基于 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.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;能為專業選擇和學習規劃提供更清晰…