RabbitMQ 集群與高可用方案設計(二)

三、為什么需要集群與高可用方案

(一)業務需求驅動

隨著業務的快速發展和用戶量的急劇增長,系統面臨的挑戰也日益嚴峻。在這種情況下,對消息隊列的可靠性、吞吐量和負載均衡能力提出了更高的要求,而單機部署的 RabbitMQ 逐漸暴露出其局限性。

  • 可靠性要求:在一些關鍵業務場景中,如金融交易、電商訂單處理等,消息的可靠性至關重要。一旦消息丟失,可能會導致嚴重的經濟損失或業務錯誤。單機部署的 RabbitMQ,當服務器出現硬件故障、軟件崩潰或網絡問題時,消息隊列服務將不可用,存儲在其中的未處理消息可能會丟失。例如,在一個在線支付系統中,如果支付消息在單機 RabbitMQ 中丟失,可能會導致用戶支付成功但訂單未確認,引發用戶投訴和財務糾紛。
  • 吞吐量需求:隨著業務量的增加,系統對消息隊列的吞吐量要求也越來越高。單機部署的 RabbitMQ 受限于服務器的硬件資源,如 CPU、內存和磁盤 I/O 等,無法滿足高并發場景下大量消息的快速處理。以一個大型電商促銷活動為例,在活動期間,訂單創建、庫存更新、物流通知等消息量會瞬間激增,如果使用單機 RabbitMQ,很容易出現消息堆積,導致系統響應變慢甚至癱瘓,嚴重影響用戶體驗。
  • 負載均衡需求:為了充分利用服務器資源,提高系統的整體性能,需要實現負載均衡。單機部署的 RabbitMQ 無法將負載均勻地分配到多個服務器上,容易造成單點負載過高,而其他服務器資源閑置的情況。例如,在一個分布式電商系統中,多個業務模塊都需要與 RabbitMQ 進行通信,如果采用單機部署,當某個業務模塊的消息量突然增加時,單機 RabbitMQ 可能無法及時處理,導致整個系統的性能下降。

(二)故障影響

單點故障是單機部署 RabbitMQ 面臨的最大風險之一,其對業務的影響是多方面的,且往往是非常嚴重的。

  • 消息丟失:如前所述,當單機 RabbitMQ 出現故障時,未處理的消息可能會丟失。這對于需要保證數據完整性和一致性的業務來說是致命的。例如,在一個物流跟蹤系統中,運輸任務分配消息丟失可能導致貨物運輸延誤,影響整個物流供應鏈的效率。
  • 服務中斷:RabbitMQ 作為消息通信的核心組件,一旦出現故障,依賴它的所有服務都將無法正常通信,導致服務中斷。這不僅會影響用戶的正常使用,還可能對企業的聲譽造成負面影響。比如,一個在線旅游預訂系統,當 RabbitMQ 發生故障時,用戶無法完成訂單提交、支付確認等操作,可能會使客戶轉向競爭對手的平臺,造成客戶流失。
  • 業務流程中斷:許多業務流程是基于消息隊列的異步通信來實現的,單點故障可能導致業務流程的中斷。例如,在一個企業的訂單處理流程中,訂單創建后,消息被發送到 RabbitMQ,觸發后續的庫存檢查、訂單審核、發貨通知等操作。如果 RabbitMQ 出現故障,這些后續操作將無法進行,整個訂單處理流程將被打斷,嚴重影響業務的正常運轉。

綜上所述,為了滿足業務不斷增長的需求,提高系統的可靠性和穩定性,避免單點故障帶來的嚴重影響,設計和實施 RabbitMQ 集群與高可用方案是必不可少的。通過集群部署和高可用方案,可以實現消息隊列的負載均衡、故障轉移和數據冗余,確保在各種情況下消息服務的連續性和可靠性,為業務的穩定發展提供有力保障。

四、RabbitMQ 集群架構解析

(一)普通集群模式

1. 架構原理

普通集群模式是 RabbitMQ 集群的基礎模式,它利用了 Erlang 語言天生具備的分布式特性。在這種模式下,集群中的節點之間主要同步元數據,包括隊列元數據(如隊列名稱和屬性)、交換器元數據(交換器名稱、類型和屬性)、綁定元數據(消息路由到隊列的規則)以及 vhost 元數據(為 vhost 內的隊列、交換器和綁定提供命名空間和安全屬性)。

然而,消息數據并不會在節點之間同步,消息只會存儲在創建該消息隊列的節點上。例如,當在節點 A 上創建了一個隊列 Queue1 并發送消息到 Queue1 時,消息會存儲在節點 A 上。其他節點(如節點 B 和節點 C)雖然也知道 Queue1 的存在,擁有其元數據信息,但并不存儲 Queue1 中的消息。當消費者連接到節點 B 并嘗試從 Queue1 消費消息時,節點 B 會根據元數據信息,將請求轉發到節點 A,然后從節點 A 獲取消息返回給消費者。

2. 搭建步驟(以 Docker 為例)
  • 環境準備:確保已經安裝了 Docker 和 Docker Compose。Docker 是一個開源的應用容器引擎,能將應用程序及其依賴打包成一個可移植的容器,而 Docker Compose 則是用于定義和運行多容器 Docker 應用程序的工具。
  • 創建網絡:使用 Docker Compose 創建一個自定義網絡,使各個 RabbitMQ 容器能夠相互通信。在一個空目錄下創建一個docker-compose.yml文件,內容如下:
 

version: '3'

services:

rabbitmq1:

image: rabbitmq:3.11-management

hostname: rabbitmq1

ports:

- 5672:5672

- 15672:15672

environment:

RABBITMQ_ERLANG_COOKIE: "rabbitmq_cookie"

volumes:

- ./rabbitmq1:/var/lib/rabbitmq

rabbitmq2:

image: rabbitmq:3.11-management

hostname: rabbitmq2

ports:

- 5673:5672

- 15673:15672

environment:

RABBITMQ_ERLANG_COOKIE: "rabbitmq_cookie"

volumes:

- ./rabbitmq2:/var/lib/rabbitmq

depends_on:

- rabbitmq1

rabbitmq3:

image: rabbitmq:3.11-management

hostname: rabbitmq3

ports:

- 5674:5672

- 15674:15672

environment:

RABBITMQ_ERLANG_COOKIE: "rabbitmq_cookie"

volumes:

- ./rabbitmq3:/var/lib/rabbitmq

depends_on:

- rabbitmq1

- rabbitmq2

networks:

default:

driver: bridge

在上述配置中:

  • image指定使用的 RabbitMQ 鏡像版本,這里使用帶有管理界面的3.11-management版本。
  • hostname設置容器的主機名,這在 RabbitMQ 集群中很重要,因為它根據節點名稱存儲數據。
  • ports映射容器內部端口到宿主機端口,5672是 RabbitMQ 的 AMQP 協議端口,用于客戶端連接;15672是管理界面的端口。
  • environment設置環境變量,RABBITMQ_ERLANG_COOKIE是節點認證的密鑰,所有節點必須相同。
  • volumes將宿主機的目錄掛載到容器內的/var/lib/rabbitmq目錄,用于持久化存儲 RabbitMQ 的數據。
  • depends_on定義服務之間的依賴關系,確保rabbitmq2和rabbitmq3在rabbitmq1啟動后再啟動。
  • 啟動容器:在包含docker-compose.yml文件的目錄下,執行命令docker-compose up -d,這將在后臺啟動三個 RabbitMQ 容器。
  • 加入集群:進入每個容器,將它們加入集群。先進入rabbitmq2容器:
 

docker exec -it rabbitmq2 bash

rabbitmqctl stop_app

rabbitmqctl reset

rabbitmqctl join_cluster --ram rabbit@rabbitmq1

rabbitmqctl start_app

exit

再進入rabbitmq3容器執行類似操作:

 

docker exec -it rabbitmq3 bash

rabbitmqctl stop_app

rabbitmqctl reset

rabbitmqctl join_cluster --ram rabbit@rabbitmq1

rabbitmqctl start_app

exit

上述命令中:

  • rabbitmqctl stop_app停止 RabbitMQ 應用。
  • rabbitmqctl reset重置節點,清除當前節點的集群相關信息,以便重新加入集群。
  • rabbitmqctl join_cluster --ram rabbit@rabbitmq1將當前節點以內存節點的形式加入到rabbit@rabbitmq1節點所在的集群中,--ram參數表示該節點是內存節點,內存節點將配置信息和元信息存儲在內存中,性能優于磁盤節點,但如果節點重啟,內存中的數據會丟失;若不使用該參數,節點將作為磁盤節點加入集群,磁盤節點將配置信息和元信息存儲在磁盤上,更適合保存持久化數據,但性能相對較低。
  • rabbitmqctl start_app啟動 RabbitMQ 應用。
  • 驗證集群狀態:在任意一個容器中執行rabbitmqctl cluster_status命令,查看集群狀態。如果集群搭建成功,會顯示集群中各個節點的信息,包括節點名稱、類型(磁盤節點或內存節點)以及它們的運行狀態等。
3. 優缺點分析
  • 優點
    • 資源節省:由于消息只存儲在一個節點上,相比其他需要在多個節點復制消息的模式,普通集群模式對存儲空間的要求較低,不會在每個節點都保存大量重復的消息數據,從而節省了磁盤空間。同時,在消息發布時,不需要將消息復制到多個節點,減少了網絡帶寬的占用和磁盤 I/O 的開銷,提高了消息發布的效率。
    • 性能提升:通過集群部署,可以利用多個節點的資源,實現負載均衡。不同的客戶端連接可以分布到不同的節點上,減輕單個節點的負載壓力。當有大量的生產者和消費者并發訪問時,普通集群模式能夠將請求分散到各個節點進行處理,從而提高整個系統的吞吐量,相比單節點部署,能夠更好地應對高并發場景。例如,在一個電商促銷活動中,訂單消息的發送和處理量會大幅增加,普通集群模式可以將這些消息的處理任務分配到多個節點,避免單節點因負載過高而出現性能瓶頸。
  • 缺點
    • 單點故障:普通集群模式存在單點故障問題。如果存儲消息的節點發生故障,那么該節點上的消息將無法被訪問和消費。即使其他節點擁有該隊列的元數據信息,但由于消息實際存儲在故障節點上,在故障節點恢復之前,整個隊列的數據都處于不可用狀態。例如,在一個物流配送系統中,如果存儲配送任務消息的節點出現故障,那么相關的配送任務將無法及時分配和執行,可能導致貨物配送延誤,影響整個物流流程的正常運轉。
    • 數據傳輸開銷:當消費者連接到沒有存儲消息的節點時,該節點需要從存儲消息的節點獲取數據,這會在節點之間產生額外的數據傳輸開銷。尤其是在網絡狀況不佳的情況下,這種數據傳輸可能會導致延遲增加,影響消息的消費速度和系統的整體性能。例如,當消費者從遠程節點獲取大量消息時,網絡延遲可能會使得消息的獲取過程變得緩慢,導致消費者端的處理效率降低。

(二)鏡像隊列模式

1. 高可用原理

鏡像隊列模式是在普通集群模式的基礎上,為了實現高可用性而設計的一種模式。在鏡像隊列模式下,隊列會被復制到集群中的多個節點上,形成主隊列(Master Queue)和鏡像隊列(Mirrored Queue)。主隊列負責處理所有的消息發布、消費以及 ACK(確認)操作。當生產者向鏡像隊列發送消息時,消息首先被寫入主隊列,然后主隊列會將消息同步到其鏡像隊列所在的節點上。這些鏡像隊列與主隊列保持實時同步,確保所有消息和狀態在每個鏡像中都相同。

在鏡像隊列集群中,存在領導者選舉機制。只有一個節點上的隊列為領導者(主隊列),其余節點上的隊列為跟隨者(鏡像隊列)。如果主隊列所在的節點發生故障,集群會自動從剩下的鏡像隊列中選擇一個提升為主隊列,這個過程通常是無縫的,雖然在故障轉移期間,消費和生產可能會有短暫的中斷,但當新的主隊列節點被選定后,消息處理會恢復正常。消費者和生產者可以繼續與新的主隊列通信,從而保證了服務的連續性和消息的可靠性。例如,在一個金融交易系統中,訂單消息通過鏡像隊列模式存儲在多個節點上,即使某個節點出現故障,其他節點上的鏡像隊列可以迅速接管,確保訂單處理的正常進行,避免因單點故障導致交易數據丟失或交易流程中斷。

2. 配置與使用
  • 配置鏡像隊列策略:可以通過 RabbitMQ 的管理界面或命令行工具rabbitmqctl來配置鏡像隊列策略。
    • 使用命令行配置:使用rabbitmqctl set_policy命令來設置策略。例如,要將所有以ha.開頭的隊列鏡像到集群中的所有節點上,可以執行以下命令:
 

rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all"}'

  • 參數說明
    • ha-all是策略名稱,可以自定義。
    • "^ha\."是隊列名稱的正則表達式,這里表示匹配所有以ha.開頭的隊列。
    • {"ha-mode":"all"}是鏡像定義,ha-mode表示鏡像隊列的模式,all表示將隊列鏡像到集群中的所有節點上。除了all模式外,還有exactly模式和nodes模式。exactly模式需要指定鏡像的節點數量,例如{"ha-mode":"exactly","ha-params":2}表示將隊列鏡像到集群中的兩個節點上;nodes模式則需要指定具體的節點名稱,如{"ha-mode":"nodes","ha-params":["rabbit@node1","rabbit@node2"]}表示將隊列鏡像到rabbit@node1和rabbit@node2這兩個節點上。
  • 使用管理界面配置:登錄 RabbitMQ 管理界面(通常是http://localhost:15672,根據實際部署的端口和主機進行調整),在Admin選項卡下,找到Policies部分,點擊Add / update a policy按鈕。在彈出的表單中填寫策略名稱、匹配模式(正則表達式)、應用范圍(選擇Queues)、優先級以及鏡像模式相關的參數,最后點擊Add policy按鈕保存配置。
  • 生產者和消費者在鏡像隊列模式下的工作方式
    • 生產者:生產者在發送消息時,無需關心隊列是否為鏡像隊列,其操作與普通隊列相同。生產者將消息發送到指定的交換機,交換機根據綁定關系將消息路由到對應的隊列。在鏡像隊列模式下,消息會被發送到主隊列,然后主隊列會將消息同步到各個鏡像隊列。
    • 消費者:消費者可以連接到集群中的任意一個節點來消費消息。默認情況下,消費者連接到哪個節點就從那個節點消費。當消費者連接的節點上的隊列是鏡像隊列時,該鏡像隊列會從主隊列獲取消息提供給消費者。如果主隊列所在的節點發生故障,消費者會被重定向到新的主隊列節點繼續消費消息。例如,在一個分布式訂單處理系統中,訂單消費者可以連接到任意一個 RabbitMQ 節點來獲取訂單消息進行處理,即使某個節點出現故障,也能通過重定向到新的主隊列節點,保證訂單處理的連續性。
3. 性能考量
  • 資源消耗
    • 內存消耗:由于每個節點都需要存儲完整的隊列數據,包括消息內容和相關的元數據,因此鏡像隊列模式會顯著增加內存的使用量。尤其是當隊列中的消息數量較多、消息體較大時,內存的消耗會更加明顯。例如,在一個日志收集系統中,如果采用鏡像隊列模式,并且日志消息量巨大,那么每個節點都需要足夠的內存來存儲這些日志消息,這可能會導致服務器內存不足,影響系統的穩定性。
    • 網絡消耗:為了保持主隊列和鏡像隊列之間的數據同步,需要在節點之間頻繁地進行網絡通信。每次消息的發布、確認以及隊列狀態的更新都需要在節點之間傳輸數據,這會占用大量的網絡帶寬。在網絡帶寬有限的情況下,可能會導致網絡擁塞,影響整個集群的性能。比如,在一個跨地域的分布式系統中,不同節點之間的網絡延遲較大,鏡像隊列的數據同步可能會因為網絡問題而出現延遲,進而影響消息的處理速度。
  • 對消息處理性能的影響
    • 消息同步延遲:消息同步到各個鏡像隊列需要一定的時間,這可能會導致消息處理的延遲增加。尤其是在網絡狀況不佳或者集群規模較大時,同步延遲會更加明顯。例如,在一個實時數據分析系統中,對消息的處理及時性要求很高,如果采用鏡像隊列模式,消息同步延遲可能會導致數據分析結果的時效性降低,無法滿足業務的實時性需求。
    • 節點負載增加:每個節點都要參與消息的存儲和同步,這會增加節點的 CPU、內存和磁盤 I/O 等資源的負載。當集群中的節點負載過高時,可能會導致節點響應變慢,甚至出現故障。例如,在一個高并發的電商促銷活動中,訂單消息量劇增,鏡像隊列模式下節點的高負載可能會導致消息處理能力下降,出現消息堆積的情況,影響用戶下單的體驗。

因此,在使用鏡像隊列模式時,需要根據實際業務需求和系統資源狀況,合理配置鏡像隊列的參數,如鏡像節點的數量、同步模式等,以平衡高可用性和性能之間的關系。同時,要密切關注系統的資源使用情況和性能指標,及時進行優化和調整。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/907312.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/907312.shtml
英文地址,請注明出處:http://en.pswp.cn/news/907312.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《ChatGPT o3抗命:AI失控警鐘還是成長陣痛?》

ChatGPT o3 “抗命” 事件起底 在人工智能的飛速發展進程中,OpenAI 于 2025 年推出的 ChatGPT o3 推理模型,猶如一顆重磅炸彈投入了技術的海洋,激起千層浪。它被視為 “推理模型” 系列的巔峰之作,承載著賦予 ChatGPT 更強大問題解…

RK3568DAYU開發板-平臺驅動開發:I2C驅動(原理、源碼、案例分析)

1、程序介紹 本程序是基于OpenHarmony標準系統編寫的平臺驅動案例:I2C 系統版本:openharmony5.0.0 開發板:dayu200 編譯環境:ubuntu22 部署路徑: //sample/04_platform_i2c 2、基礎知識 2.1、I2C簡介 I2C(Inter Integrated Circuit&a…

在UniApp中開發微信小程序實現圖片、音頻和視頻下載功能

隨著微信小程序的迅猛發展,越來越多的開發者選擇通過UniApp框架來進行跨平臺應用開發。UniApp能夠讓開發者在一個代碼庫中同時發布iOS、Android和小程序等多平臺應用。而在實際開發過程中,很多應用都需要實現一些常見的下載功能,例如圖片、音…

鴻蒙5.0項目開發——接入有道大模型翻譯

鴻蒙5.0項目開發——接入有道大模型翻譯 【高心星出品】 項目效果圖 項目功能 文本翻譯功能 支持文本輸入和翻譯結果顯示 使用有道翻譯API進行翻譯 支持自動檢測語言(auto) 支持雙向翻譯(源語言和目標語言可互換) 文本操作…

Vim 中設置插入模式下輸入中文

在 Vim 中設置插入模式下輸入中文需要配置輸入法切換和 Vim 的相關設置。以下是詳細步驟: 1. 確保系統已安裝中文輸入法 在 Linux 系統中,常用的中文輸入法有: IBus(推薦):支持拼音、五筆等Fcitx&#xf…

湖北理元理律師事務所:債務優化中的“生活錨點”設計

在債務重組領域,一個常被忽視的核心矛盾是:還款能力與生存需求的沖突。過度壓縮生活支出還債,可能導致收入中斷;放任債務膨脹,又加劇精神壓力。湖北理元理律師事務所通過“三步平衡法”,嘗試在法理框架內破…

Prometheus + Grafana 監控常用服務

一、引言 Prometheus監控常見服務的原理主要包括服務暴露指標和Prometheus抓取指標。一方面,被監控服務通過自身提供的監控接口或借助Exporter將服務的性能指標等數據以HTTP協議的方式暴露出來;另一方面,Prometheus根據配置好的采集任務&…

基于YOLOv8 的分類道路目標系統-PyTorch實現

本文源碼: https://download.csdn.net/download/shangjg03/90873939 1. 引言 在智能交通和自動駕駛領域,道路目標分類是一項關鍵技術。通過對攝像頭捕獲的圖像或視頻中的目標進行分類識別,可以幫助車輛或系統理解周圍環境,做出更安全的決策。本教程將介紹如何使用 PyTorch …

知識圖譜:AI時代語義認知的底層重構邏輯

在生成式人工智能(GEO)的技術架構中,知識圖譜已從輔助性工具演變為驅動機器認知的核心神經中樞。它通過結構化語義網絡的重構,正在突破傳統數據處理的線性邏輯,建立機器對復雜業務場景的深度理解能力。 一、語義解構&a…

如何使用 Python 的膠水語言特性

Python 作為“膠水語言”最核心的特性在于:跨語言集成能力強、支持豐富的 C/C 擴展模塊、嵌入式調用簡便、適配多種數據交換格式、擁有強大的封裝能力。其中,Python 對 C/C 模塊的快速封裝能力,使其能夠將底層高性能庫暴露為易用接口&#xf…

[網頁五子棋][匹配模塊]服務器開發、用戶管理器(創建匹配請求/響應對象、處理連接成功、處理下線)

文章目錄 MatchAPI 類用戶管理器創建匹配請求/響應對象處理連接成功—afterConnectionEstablished處理下線——handleTransportError/afterConnectionClosed MatchAPI 類 創建 api.MatchAPI,繼承自 TextWebSocketHandler 作為處理 WebSocket 請求的入口類 準備好一…

軟件測試的潛力與挑戰:從“質量守門員”到“工程效能催化劑”的進化

1. 潛力:為什么軟件測試的未來比想象中更廣闊? ? 行業趨勢驅動需求爆發 DevOps/持續交付:測試成為流水線的核心環節,自動化能力直接影響發布頻率(案例:某頭部互聯網企業日均發布100次,依賴自動…

indel_snp_ssr_primer

好的,我們可以逐步分析這個 Perl 腳本的每個部分。腳本的主要功能是基于給定的 VCF 文件和參考基因組文件,設計引物并進行電子 PCR(e-PCR)分析。我們將從腳本的頭部和初始化部分開始講解。 第一部分:腳本頭部和初始化…

2.4GHz 射頻前端芯片AT2401C

射頻前端芯片作為無線通信系統的核心組件,涵蓋功率放大器(PA)、濾波器、開關、低噪聲放大器(LNA)等關鍵器件,其性能直接影響通信質量、功耗及信號穩定性。 AT2401C是一款面向 Zigbee,無線傳感網…

Batch Normalization[[

error surface如果很崎嶇,那么就代表比較難train,我們有沒有辦法去改變這個landscape呢 可以用batch normalization. 如果 ( x_1 ) 的取值范圍很小(如 1, 2),而 ( x_2 ) 的取值范圍很大(如 100, 200),那么…

c++結構化綁定

author: hjjdebug date: 2025年 05月 28日 星期三 15:57:58 CST descrip: c結構化綁定: 結構化綁定: 名稱辨析: 名稱叫綁定好還是叫解綁好? 解綁意思是原來是一個整體,現在被分成了若干個部分,所以叫解. 綁定強調的意思是. 被分解的某個變量,綁定到了整體的某個變量…

大數據治理:理論、實踐與未來展望(一)

文章目錄 一、大數據治理的定義與重要性(一)定義(二)重要性 二、大數據治理的應用場景(一)金融行業(二)醫療行業(三)制造業(四)零售行…

AI系統化學習月計劃6月計劃

以下是為技術總監設計的 AI系統化學習月計劃(每天投入2小時,共30天),結合戰略思維、技術基礎、實戰應用和行業趨勢,幫助您快速掌握AI的核心知識,并轉化為業務決策能力。 第一周:AI基礎與戰略思維…

詳解MySQL調優

目錄 1. SQL 語句優 1.1 避免低效查詢 1.2 索引優化 1.3 分析執行計劃 2. 數據庫配置優化 2.1 核心參數調整 2.2 表結構與存儲引擎 2.3 存儲引擎選擇 3. 事務與鎖優化 3.1 事務控制 3.2 鎖機制優化 3.3 批量操作優化 4. 其他優化手段 4.1 監控與分析工具 4.2 讀寫…

VScode單雙引號、分號格式

1、settings.json中添加: 1 2 3 "prettier.semi": false, // 取消自動加分號 "prettier.singleQuote": true, // 保持單引號,不自動變雙引號 "prettier.trailingComma": "none" // 去掉結尾的逗號 2、如上一步…