實現RabbitMQ多節點集群搭建

目錄

????????引言

? ? ? ? 一、環境準備

? ? ? ? 二、利用虛擬機搭建

?????????三、鏡像集群配置

????????四、HAProxy實現負載均衡(主用虛擬機操作)

? ? ? ? 五、測試RabbitMQ集群搭建情況


????????引言

在現代分布式系統中,消息隊列(Message Queue)扮演著至關重要的角色,而? RabbitMQ?作為最流行的開源消息代理之一,廣泛應用于異步通信、任務隊列、事件驅動架構等場景。然而,單節點的 RabbitMQ 存在單點故障(SPOF, Single Point of Failure)風險,一旦宕機,整個消息系統就會癱瘓。因此, 搭建 RabbitMQ 集群?成為保障系統高可用性(High Availability, HA)和負載均衡(Load Balancing)的關鍵措施。
????????為了保證MQ 中間件的可靠性、并發性、吞吐量,在生產環境上一般都會考慮使用 RabbitMQ 的集群方案。當然本搭建過程只是用于測試階段,如用于上線產品,需要更嚴格的搭建流程。

? ? ? ? 一、環境準備

本搭建過程搭建需要四臺虛擬機,同時他們都已經安裝了相同版本的RabbitMQ,我建議是由一臺主用虛擬機,克隆復制出另外三臺。完成后如下:
使用遠程連接工具:finalshell

? ? ? ? 二、利用虛擬機搭建

????????這里利用我本地的虛擬機模擬三臺真實的機器

服務器信息表:

IP地址主機名操作系統
192.168.93.135rabbitmq01CentOS7(64位)
192.168.93.136rabbitmq02CentOS7(64位)
192.168.93.137rabbitmq03CentOS7(64位)

????????進行下一步前可以在本地windows的cmd中測試ping一下上面的三個虛擬機的IP地址。如果都能ping通,那可以進行下一步。

? ? ? ? (1)下面修改三臺機器的hosts配置文件,為了方便機器間的相互訪問,三臺centos都執行 vim /etc/hosts , 添加下邊的配置,依次執行:

#將三臺機器上hosts都修改內容如下
vim /etc/hosts192.168.93.135 rabbitmq01
192.168.93.136 rabbitmq02
192.168.93.137 rabbitmq03#通過ping命令看主機名是否生效
ping rabbitmq02#修改三臺主機的主機名 vim /etc/hostname
#修改主機名會導致這臺主機上RabbitMQ的數據丟失,可以只改后兩臺主機名,或者修改前備份
#rabbitmq01 修改為 rabbitmq01.localdomain
#rabbitmq02 修改為 rabbitmq02.localdomain
vim /etc/hostname#然后重啟每臺機器
reboot

? ? ? ? 對應修改如下:

????????(2)如果上述都已準確完成,進行下一步:

????????保持三臺機器的.erlang.cookie 內容一致
????????這個cookie 存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件是 400 的權限
????????必須保證各節點cookie 一致 , 才能使節點之間相互通信
????????例如: 全部使用 rabbitmq01 /.erlang.cookie
#查看rabbitmq01的.erlang.cookie
cat erlang.cookie#修改rabbitmq02和rabbitmq03的.erlang.cookie
vim /var/lib/rabbitmq/.erlang.cookie#該文件是只讀的,加上寫權限
chmod u+w /var/lib/rabbitmq/.erlang.cookie
vim /var/lib/rabbitmq/.erlang.cookie

? ? ? ? 將另外兩臺都改成與這一樣的即可。

? ? ? ? 最后啟動三臺機器上的rabbitMQ服務

#每臺機器的RabbitMQ服務的訪問地址和控制臺的訪問地址分別是
#192.168.93.135:5672     192.168.93.135:15672
#192.168.93.136:5672     192.168.93.136:15672
#192.168.93.137:5672     192.168.93.137:15672#啟動RabbitMQ服務
service rabbitmq-server start

? ? ? ? (3)rabbitmq02,rabbitmq03作為內存節點加入rabbitmq01節點集群中

? ? ? ? 開放端口:

#這里需要開放25672和4369
firewall-cmd --zone=public --add-port=25672/tcp --permanent
systemctl restart firewalld.service
firewall-cmd --reloadfirewall-cmd --zone=public --add-port=4369/tcp --permanent
systemctl restart firewalld.service
firewall-cmd --reload

? ? ? ? 在進行操作:

#在rabbitmq02機器下執行
#停掉rabbit應用
rabbitmqctl stop_app #加入rabbitmq01
rabbitmqctl join_cluster --ram rabbit@rabbitmq01#啟動rabbit應用
rabbitmqctl start_app#查看所有節點狀態
rabbitmqctl cluster_status

????????最后查看所有節點狀態時:

到此:

????????三、鏡像集群配置

????????上面已經完成RabbitMQ 默認集群模式,但并不保證隊列的高可用性,盡管隊列 , 交換機 , 綁定這些可以復制到集群里的任何一個節點,但是隊列內容不會復制.
????????為了保證隊列中的內容也能復制, 要使用鏡像隊列 , 鏡像隊列再添加一些策略。

? ? ? ? 在網頁上打開三個虛擬機的任意一個RabbitMQ的控制臺,按照以下添加策略:

? ? ? ? 當然如果不想用上面的方式,可以執行下面一行命令來完成操作(任意虛擬機即可):

策略參數解讀:# ha-all:為策略名稱;
# ^my:為匹配符,只有一個^代表匹配所有,^abc為匹配名稱以abc開頭的queue或exchange,^.則
匹配所有
# ha-mode:為同步模式,一共3種模式:
# all-所有(所有的節點都同步消息),
# exctly-指定節點的數目(需配置ha-params參數,此參數為int類型比如2,在集群中隨機
抽取2個節點同步消息)
# nodes-指定具體節點(需配置ha-params參數,此參數為數組類型比如
["rabbit@rabbitmq01","rabbit@rabbitmq02"],明確#指定在這兩個節點上同步消息)。
# ha-sync-mode
#ha-sync-mode=manual(默認),鏡像隊列中的消息不會主動同步到新節點,除非顯式調用同步命令,
調用同步命令后,隊列開始阻塞,無法對其進行操作,直到同步完畢
#ha-sync-mode=automatic 新加入節點時會默認同步已知的鏡像隊列#執行該命令等效于上面的頁面添加策略操作
rabbitmqctl set_policy ha-all "^." '{"ha-mode":"all","ha-sync-mode":"automatic"}'

測試:

#關閉rabbitmq01
rabbitmqctl stop_app

????????四、HAProxy實現負載均衡(主用虛擬機操作)

????????HAProxy提供高可用性、負載均衡以及基于 TCP HTTP 應用的代理,支持虛擬主機,它是免費、快速并且可靠的一種解決方案, 包括 Twitter Reddit StackOverflow GitHub 在內的多家知名互聯網公司在使用。HAProxy 實現了一種事件驅動、單一進程模型,此模型支持非常大的并發連接數。?
安裝HAProxy:
yum install -y haproxyhaproxy -v

看到下面則安裝成功:

HAProxy /etc/haproxy/haproxy.cfg 中添加如下配置:
### haproxy 監控頁面地址是:http://192.168.93.134:9188/haproxy_statuslisten admin_statsbind *:9188mode httplog 127.0.0.1 local3 errstats refresh 60sstats uri /haproxy_statusstats realm welcome login\ Haproxystats auth admin:123456     ##記得改成自己的賬號和密碼stats hide-versionstats admin if TRUE### rabbitmq 集群配置,轉發到listen rabbitmq_clusterbind *:5672mode tcpbalance roundrobinserver rabbitnode1 192.168.93.135:5672 check inter 2000 rise 2 fall 3 weight 1server rabbitnode2 192.168.93.136:5672 check inter 2000 rise 2 fall 3 weight 1server rabbitnode3 192.168.93.137:5672 check inter 2000 rise 2 fall 3 weight 1

添加后:

完成上述的修改和配置后,啟動

haproxy -f /etc/haproxy/haproxy.cfg

在網頁上訪問:http://192.168.93.134:9188/haproxy_status

看到下圖,說明已經配置成功:

? ? ? ? 可以看到三個虛擬機已經和HAProxy實現了負載均衡,當有信息發送到三臺主機中的任意一個rabbitMQ時,盡管兩外一臺或兩臺出現宕機的情況,仍然不妨礙我們使用。

? ? ? ? 五、測試RabbitMQ集群搭建情況

? ? ? ? 完成上面的所有配置后,下面使用IDEA來連接RabbitMQ測試搭建情況:

? ? ? ? 連接三臺中任意一臺虛擬機即可:

public class SimpleProducer {public static void main(String[] args) throws IOException, TimeoutException {//1.創建連接工廠,并且設置RabbitMQ相關的連接參數ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("192.168.93.135");connectionFactory.setPort(5672); //設置rabbitMq的默認端口   不修改可以不設置//connectionFactory.setUsername("admin");//connectionFactory.setPassword("123456");//connectionFactory.setVirtualHost("myVH");//2.根據連接工廠創建一個連接,根據這個連接創建一個channelConnection connection = connectionFactory.newConnection();Channel channel = connection.createChannel();//3.創建一個隊列(Queue)//設置隊列名、是否持久化、是否獨占、是否被消費后自動刪除、隊列參數等等channel.queueDeclare("hello",true,false,false,null);//4.發布一條消息//設置交換機名稱、routingKey、信息屬性、消息內容channel.basicPublish("","hello",null,"Hello,World".getBytes());//5.釋放資源channel.close();connection.close();}
}

發送信息后,查看任意頁面:

????????當故意關閉三臺中的任意一臺或兩臺虛擬機(模擬宕機)時,仍可以繼續發送信息,再次啟動“宕機”的虛擬機,會自動同步消息,應為三臺機器已經構成一個集群,可以實現信息互相同步,當出問題時,信息會立刻同步到正常的機器上去,宕機修復后又可以同步,這里不再演示此過程。

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

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

相關文章

異步上傳石墨文件進度條前端展示記錄(采用Redis中String數據結構實現-蘇東坡版本)

昔者,有客臨門,亟需自石墨文庫中擷取卷帙若干。此等文冊,非止一卷,乃累牘連篇,亟需批量轉置。然吾輩慮及用戶體驗,當效東坡"腹有詩書氣自華"之雅意,使操作如行云流水,遂定…

Axure 基礎入門

目錄 認識產品經理 項目團隊* 基本概述 認識產品經理 A公司產品經理 B公司產品經理 C公司產品經理 D公司產品經理 產品經理工作范圍 產品經理工作流程* 產品經理的職責 產品經理的分類 產品經理能力要求 產品工具 產品體驗報告 原型設計介紹 原型設計概述 為…

零基礎學習計算機網絡編程----socket實現UDP協議

本章將會詳細的介紹如何使用 socket 實現 UDP 協議的傳送數據。有了前面基礎知識的鋪墊。對于本章的理解將會變得簡單。將會從基礎的 Serve 的初始化,進階到 Client 的初始化,以及 run。最后實現一個簡陋的小型的網絡聊天室。 目錄 1.UdpSever.h 1.1 構造…

普中STM32F103ZET6開發攻略(二)

接上文:普中STM32F103ZET6開發攻略(一)-CSDN博客 各位看官老爺們,點擊關注不迷路喲。你的點贊、收藏,一鍵三連,是我持續更新的動力喲!!! 目錄 接上文:普中…

用提示詞寫程序(3),VSCODE+Claude3.5+deepseek開發edge擴展插件V2

edge擴展插件;篩選書簽,跳轉搜索,設置背景 鏈接: https://pan.baidu.com/s/1nfnwQXCkePRnRh5ltFyfag?pwd86se 提取碼: 86se 導入解壓的擴展文件夾: 導入擴展成功: edge擴展插件;篩選書簽,跳轉搜索,設置背景

電腦桌面便簽軟件哪個好?桌面好用便簽備忘錄推薦

在日常辦公中,一款優秀的桌面便簽工具能顯著提升工作效率。面對市面上琳瑯滿目的選擇,不少用戶都難以抉擇。如果你正在尋找一款兼具輕量化與多功能性的便簽軟件,那么集實用性與便捷性于一身的"好用便簽",或許就是你的理…

性能優化 - 工具篇:基準測試 JMH

文章目錄 Pre引言1. JMH 簡介2. JMH 執行流程詳解3. 關鍵注解詳解3.1 Warmup3.2 Measurement3.3 BenchmarkMode3.4 OutputTimeUnit3.5 Fork3.6 Threads3.7 Group 與 GroupThreads3.8 State3.9 Setup 與 TearDown3.10 Param3.11 CompilerControl 4. 示例代碼與分析4.1 關鍵點解讀…

2025年十大AI幻燈片工具深度評測與推薦

我來告訴你一個好消息。 我們已經親自測試和對比了市面上最優秀的AI幻燈片工具,讓你無需再為選擇而煩惱。 得益于AI技術的飛速發展,如今你可以快速制作出美觀、專業的幻燈片。 這些智能平臺的功能遠不止于配色美化——它們能幫你頭腦風暴、梳理思路、…

雪花算法:分布式ID生成的優雅解決方案

一、雪花算法的核心機制與設計思想 雪花算法(Snowflake)是由Twitter開源的分布式ID生成算法,它通過巧妙的位運算設計,能夠在分布式系統中快速生成全局唯一且趨勢遞增的ID。 1. 基本結構 雪花算法生成的是一個64位(lo…

第1章:走進Golang

第1章:走進Golang 一、Golang簡介 Go語言(又稱Golang)是由Google的Robert Griesemer、Rob Pike及Ken Thompson開發的一種開源編程語言。它誕生于2007年,2009年11月正式開源。Go語言的設計初衷是為了在不損失應用程序性能的情況下…

Higress項目解析(二):Proxy-Wasm Go SDK

3、Proxy-Wasm Go SDK Proxy-Wasm Go SDK 依賴于 tinygo,同時 Proxy - Wasm Go SDK 是基于 Proxy-Wasm ABI 規范使用 Go 編程語言擴展網絡代理(例如 Envoy)的 SDK,而 Proxy-Wasm ABI 定義了網絡代理和在網絡代理內部運行的 Wasm …

NVMe IP現狀掃盲

SSD優勢 與機械硬盤(Hard Disk Driver, HDD)相比,基于Flash的SSD具有更快的數據隨機訪問速度、更快的傳輸速率和更低的功耗優勢,已經被廣泛應用于各種計算領域和存儲系統。SSD最初遵循為HDD設計的現有主機接口協議,例…

`docker commit` 和 `docker save`區別

理解 docker commit 和 docker save 之間的區別對于正確管理 Docker 鏡像非常重要。讓我們詳細解釋一下這兩個命令的作用及其區別。 1. docker commit 作用: docker commit roop-builder roop:v1 命令的作用是基于一個正在運行的容器 roop-builder 創建一個新的鏡…

Linux內核體系結構簡析

1.Linux內核 1.1 Linux內核的任務 從技術層面講,內核是硬件和軟件之間的一個中間層,作用是將應用層序的請求傳遞給硬件,并充當底層驅動程序,對系統中的各種設備和組件進行尋址。從應用程序的角度講,應用程序與硬件沒有…

python爬蟲:Ruia的詳細使用(一個基于asyncio和aiohttp的異步爬蟲框架)

更多內容請見: 爬蟲和逆向教程-專欄介紹和目錄 文章目錄 一、Ruia概述1.1 Ruia介紹1.2 Ruia特點1.3 安裝Ruia1.4 使用案例二、基本使用2.1 Request 請求2.2 Response - 響應2.3 Item - 數據提取2.4 Field 提取數據2.5 Spider - 爬蟲類2.6 Middleware - 中間件三、高級功能3.1 …

網絡攻防技術二:密碼學分析

文章目錄 一、傳統密碼分析方法1、根據明文、密文等信息的掌握情況分類 2、從密碼分析途徑分類二、密碼旁路分析1、概念2、旁路分析方法三、現代密碼系統1、對稱密碼(單密鑰)2、公開密碼(成對密鑰) 四、典型對稱密碼(單…

Linux --TCP協議實現簡單的網絡通信(中英翻譯)

一、什么是TCP協議 1.1 、TCP是傳輸層的協議,TCP需要連接,TCP是一種可靠性傳輸協議,TCP是面向字節流的傳輸協議; 二、TCPserver端的搭建 2.1、我們最終好實現的效果是 客戶端在任何時候都能連接到服務端,然后向服務…

pc端小卡片功能-原生JavaScript金融信息與節日日歷

代碼如下 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>金融信息與節日日歷</title><…

C語言——獲取變量所在地址(uint8和uint32的區別)

前言&#xff1a; 1.使用uint8 *的原因 在C語言中&#xff0c;獲取或操作一個4字節地址&#xff08;指針&#xff09;時使用uint8_t*&#xff08;即unsigned char*&#xff09;而不是uint32_t*&#xff0c;主要基于以下關鍵原因&#xff1a; 1.1. 避免違反嚴格別名規則&…

Python----目標檢測(《YOLOv3:AnIncrementalImprovement》和YOLO-V3的原理與網絡結構)

一、《YOLOv3:AnIncrementalImprovement》 1.1、基本信息 標題&#xff1a;YOLOv3: An Incremental Improvement 作者&#xff1a;Joseph Redmon, Ali Farhadi 機構&#xff1a;華盛頓大學&#xff08;University of Washington&#xff09; 發表時間&#xff1a;2018年 代…