|
MQTT 協(xié)議在物聯(lián)網(wǎng),小型設(shè)備場(chǎng)景,移動(dòng)應(yīng)用等方面已經(jīng)有了廣泛的應(yīng)用,并逐漸成為了物聯(lián)網(wǎng)通訊的標(biāo)準(zhǔn)。本文重點(diǎn)介紹了組建 MQTT Broker 集群的挑戰(zhàn)及負(fù)載均衡在 MQTT 集群中所起的作用。
MQTT 協(xié)議與大家熟悉的 HTTP 協(xié)議類似,MQTT 協(xié)議同樣基于 TCP/TLS 之上,屬于應(yīng)用層協(xié)議(它也可以基于 HTTP 協(xié)議之上工作,本文暫不涉及這部分內(nèi)容)。
MQTT 標(biāo)準(zhǔn)委員會(huì)對(duì) MQTT 協(xié)議的釋義如下:
MQTT 是用于物聯(lián)網(wǎng) (IoT) 的 OASIS 標(biāo)準(zhǔn)消息傳遞協(xié)議。它是一種非常輕量級(jí)的消息傳輸協(xié)議,采用了發(fā)布/訂閱的機(jī)制,非常適合連接遠(yuǎn)程設(shè)備,無(wú)論是代碼占用空間還是網(wǎng)絡(luò)帶寬的占用都很小。如今,MQTT 已被廣泛用于汽車、工業(yè)制造、電信、石油和天然氣等各個(gè)行業(yè)。
MQTT 客戶端和 HTTP 客戶端也很相似。它與服務(wù)器端建立一個(gè) TCP 連接,通過(guò)該連接傳輸數(shù)據(jù)。不同的是,HTTP 采用的是請(qǐng)求/響應(yīng)模型,而 MQTT 采用的是發(fā)布/訂閱模型。
舉個(gè)例子:客廳里安裝的溫度傳感器,會(huì)間斷性的把室內(nèi)溫度數(shù)值上傳到 MQTT 服務(wù)器上。而另一個(gè)智能家居設(shè)備訂閱了這個(gè)溫度傳感器發(fā)布消息的頻道,就可以獲得室內(nèi)的溫度數(shù)據(jù),并根據(jù)實(shí)際室溫采取一些智能應(yīng)對(duì)措施,比如當(dāng)室內(nèi)溫度超過(guò) 32°C 時(shí)就打開空調(diào)。
可拓展性挑戰(zhàn)MQTT 協(xié)議聽起來(lái)似乎離我們很遙遠(yuǎn),其實(shí)它早已滲透到了我們的日常生活中。一般情況下,單個(gè) MQTT 節(jié)點(diǎn)就可以滿足單個(gè)家庭的智能家居設(shè)備連接需求,用戶甚至可以在樹莓派上運(yùn)行一個(gè) EMQX Edge (運(yùn)行在邊緣端的 MQTT 服務(wù)器)。而運(yùn)行在云端的一個(gè) EMQX 節(jié)點(diǎn)可以支撐高達(dá) 200 萬(wàn)的連接數(shù),輕松滿足普通智能家居場(chǎng)景需求。
但如果是全國(guó)的千百萬(wàn)輛汽車要聯(lián)網(wǎng),或者是上百萬(wàn)盞路燈要傳遞數(shù)據(jù)之類的場(chǎng)景,那么巨大的設(shè)備數(shù)(MQTT 客戶端)和數(shù)據(jù)吞吐量,就遠(yuǎn)遠(yuǎn)超出了單個(gè) MQTT 節(jié)點(diǎn)所能承受的壓力,需要組建 MQTT 服務(wù)器集群。
在組建集群的同時(shí),也面臨著一系列的技術(shù)挑戰(zhàn):
提供服務(wù)地址:如何讓客戶端知道該連接哪個(gè)地址?
不同節(jié)點(diǎn)如何接管 MQTT 訂閱者的會(huì)話,比如當(dāng)一個(gè)客戶端從一臺(tái)服務(wù)器斷連后,要如何在另一臺(tái)服務(wù)器恢復(fù)連接?
集群中各個(gè)節(jié)點(diǎn)上的路由表如何保持一致性?
通過(guò)在 MQTT 集群前面引入一個(gè)負(fù)載均衡,可以幫助我們輕松解決問(wèn)題 1 和 2。
MQTT 負(fù)載均衡![]()
MQTT 負(fù)載均衡
為了應(yīng)對(duì)上述問(wèn)題,負(fù)載均衡需要能夠根據(jù)配置的均衡策略來(lái)幫助客戶端決定連接到哪個(gè)節(jié)點(diǎn)。 MQTT 集群負(fù)載均衡的主要功能有:
對(duì)外提供集群服務(wù)地址
客戶端只需要關(guān)心負(fù)載均衡的地址,而且不需要知道集群內(nèi)各個(gè)節(jié)點(diǎn)的地址。這大大提升了服務(wù)器遷移和伸縮的靈活性。
TLS 終結(jié)
許多 MQTT 的用戶選擇在負(fù)載均衡這一層來(lái)終結(jié) TLS,這樣可以使 MQTT 服務(wù)器的資源被充分用于消息的處理。
平衡集群中各個(gè)節(jié)點(diǎn)的負(fù)載
負(fù)載均衡服務(wù)通常可以配置不同的均衡策略,如:隨機(jī)分配、輪詢(有些輪詢策略可以調(diào)節(jié)節(jié)點(diǎn)權(quán)重),還有比較有意思的粘性分配。
由于 MQTT 是基于 TCP/IP 之上的協(xié)議,因此可以在傳輸層進(jìn)行負(fù)載均衡。而在傳輸層負(fù)載均衡之外,MQTT 能使用的負(fù)載均衡產(chǎn)品 HAProxy 2.4 和 Nginx Plus 還提供了應(yīng)用層(MQTT 層)的負(fù)載均衡解決方案。
Nginx Plus 是在 Nginx(一個(gè)開源的 Web 服務(wù)器,適用于高流量網(wǎng)站的反向代理)基礎(chǔ)上構(gòu)建的應(yīng)用程序交付平臺(tái)。Nginx Plus 的這篇文章作了較為詳細(xì)的描述。
同樣優(yōu)秀的,還有 HAProxy。它提供高可用性負(fù)載均衡,以及基于 TCP、HTTP 和 MQTT 的應(yīng)用程序代理。到目前為止(2021 年 8月),HAProxy 2.4 是唯一一款可以提供 MQTT 層負(fù)載均衡的免費(fèi)產(chǎn)品。在他們的 release note 中,對(duì) MQTT 負(fù)載均衡的功能作了簡(jiǎn)單的介紹。
在 “MQTT Broker 集群詳解”系列的下一篇文章中,我們將對(duì) HAProxy 2.4 + EMQX 4.3 的集成方案進(jìn)行詳細(xì)展開,敬請(qǐng)期待。
本系列中的其它文章