最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux之RabbitMQ集群部署過程

 更新時間:2026年05月04日 10:36:36   作者:無熵  
文章主要介紹了RabbitMQ消息中間件的原理、作用、優(yōu)點、常用模式和配置,以及與Kafka的對比,并詳細(xì)講解了RabbitMQ集群的搭建過程,包括節(jié)點配置、數(shù)據(jù)存儲、防火墻設(shè)置、集群策略設(shè)置等,最后提供了常見問題的解決方法,文章還補充介紹了負(fù)載均衡器haproxy的安裝和配置

RabbitMQ 消息中間件

1、消息中間件

消息(message):

  • 指在服務(wù)之間傳送的數(shù)據(jù)。
  • 可以是簡單的文本消息,也可以是包含復(fù)雜嵌入對象的消息

消息隊列(message queue):

  • 指用來存放消息的隊列,一般采用先進(jìn)先出的隊列方式,即最先進(jìn)入的消息最先被處理。
  • 用于解耦發(fā)送者和接收者之間的關(guān)系,提高系統(tǒng)的可靠性和可伸縮性。發(fā)送者將消息放入隊列中,接收者從隊列中獲取消息進(jìn)行處理。

1、簡介

消息中間件也可以稱消息隊列,是利用高效可靠的消息傳遞機制進(jìn)行異步的數(shù)據(jù)傳輸并基于數(shù)據(jù)通信來進(jìn)行分布式系統(tǒng)的集成。

當(dāng)下主流的消息中間件有RabbitMQ、Kafka、ActiveMQ、RocketMQ等。

2、作用

1. 冗余(存儲)
  • 數(shù)據(jù)持久化:消息中間件通常會將消息存儲在磁盤或其他持久化存儲介質(zhì)中,即使發(fā)生故障,消息也不會丟失。這對于需要確保消息傳遞可靠性的場景尤為重要。
  • 重試機制:如果消息傳遞過程中發(fā)生錯誤,消息中間件可以重新嘗試發(fā)送消息,直到成功為止。這種機制對于保證消息的最終一致性非常有用。
2. 擴展性
  • 水平擴展:通過消息中間件,可以增加更多的消費者實例來處理更多負(fù)載,實現(xiàn)系統(tǒng)的水平擴展。對于應(yīng)對流量峰值尤其有用。
  • 分布式處理:消息中間件允許將任務(wù)分布在不同的服務(wù)器上執(zhí)行,這有助于實現(xiàn)負(fù)載均衡和資源優(yōu)化。
3.解耦
  • 松耦合:消息中間件讓生產(chǎn)者和消費者之間不直接通信,而是通過消息中間件進(jìn)行間接通信。這樣做的好處是,當(dāng)一方發(fā)生變化時,不會直接影響另一方,增加了系統(tǒng)的靈活性和可維護(hù)性。
  • 靈活性:生產(chǎn)者可以向多個消費者發(fā)送消息,同時消費者可以從多個生產(chǎn)者那里接收消息。這種模式允許系統(tǒng)架構(gòu)更加靈活多變。
4.異步通信
  • 非阻塞處理:生產(chǎn)者將消息發(fā)送到消息中間件后,無需等待消費者處理完成即可繼續(xù)執(zhí)行其他任務(wù)。這使得系統(tǒng)可以更快地響應(yīng)新的請求,提高了整體效率。
  • 提高響應(yīng)時間:由于異步處理,系統(tǒng)可以更快地響應(yīng)用戶請求,提高了用戶體驗。
5.削峰
  • 平滑負(fù)載:消息中間件可以作為一個緩沖層,幫助平滑流量高峰,避免后端系統(tǒng)因短時間內(nèi)大量請求而導(dǎo)致過載。
  • 按需處理:消息中間件可以根據(jù)后端系統(tǒng)的處理能力和當(dāng)前的負(fù)載情況,調(diào)整消息處理的速度。例如,在負(fù)載較低時加快處理速度,而在負(fù)載較高時減慢處理速度。

2、消息中間件的兩種模式

1. 點對點 (P2P) 模式

角色
  • 消息隊列 (Queue):消息隊列是消息的臨時存儲容器。它負(fù)責(zé)接收消息,并將消息轉(zhuǎn)發(fā)給消費者。
  • 發(fā)送者 (Sender):也稱為生產(chǎn)者 (Producer),負(fù)責(zé)將消息發(fā)送到指定的消息隊列。
  • 接收者 (Receiver):也稱為消費者 (Consumer),負(fù)責(zé)從消息隊列中拉取消息并處理。
特點
  • 消息唯一性:在一個消息隊列中,每條消息只能被一個消費者消費。一旦被消費,該消息就會從隊列中移除。
  • 可靠性:消息隊列通常會持久化消息,以確保即使消費者暫時不可用,消息也不會丟失。
  • 順序性:消費者一般按照消息進(jìn)入隊列的順序來處理消息。

2. 發(fā)布/訂閱 (Pub/Sub) 模式

角色
  • 主題 (Topic):主題是消息分類的一種方式。發(fā)布者將消息發(fā)布到特定的主題,訂閱者根據(jù)自己的需求訂閱感興趣的主題。
  • 發(fā)布者 (Publisher):發(fā)布者將消息發(fā)送到指定的主題。
  • 訂閱者 (Subscriber):訂閱者訂閱一個或多個主題,以便接收與這些主題相關(guān)的所有消息。
特點
  • 廣播特性:發(fā)布者發(fā)送的消息會被所有訂閱了該主題的訂閱者接收。
  • 解耦:發(fā)布者和訂閱者之間不存在直接聯(lián)系,這使得雙方可以獨立地進(jìn)行開發(fā)和部署。
  • 動態(tài)訂閱:訂閱者可以在運行時動態(tài)地添加或刪除訂閱關(guān)系。
  • 消息過濾:某些消息中間件支持訂閱者基于消息的內(nèi)容進(jìn)行過濾,只接收滿足特定條件的消息。
  • P2P模式 更適合需要保證消息被單個消費者消費且具有嚴(yán)格順序要求的場景,如事務(wù)處理或訂單處理等。
  • Pub/Sub模式 則更適合需要將消息廣播給多個訂閱者并且不需要嚴(yán)格順序的場景,如實時通知系統(tǒng)或消息推送服務(wù)等。

消費者怎么得到消息隊列的數(shù)據(jù)?

消費者怎么從消息隊列里邊得到數(shù)據(jù)?有兩種辦法:?

  • - 生產(chǎn)者將數(shù)據(jù)放到消息隊列中,消息隊列有數(shù)據(jù)了,主動叫消費者去拿(俗稱push)
  • - 消費者不斷去輪訓(xùn)消息隊列,看看有沒有新的數(shù)據(jù),如果有就消費(俗稱pull)

3、常用中間件介紹與對比

1、Kafka

Kafka是LinkedIn開源的分布式發(fā)布-訂閱消息系統(tǒng),目前歸屬于Apache頂級項目。

Kafka主要特點是追求高吞吐量(單機可達(dá)到10萬級),時效性是毫秒級的,一開始的目的就是用于日志收集和傳輸。

對消息的重復(fù)、丟失、錯誤沒有嚴(yán)格要求,適合產(chǎn)生大量數(shù)據(jù)的互聯(lián)網(wǎng)服務(wù)的數(shù)據(jù)收集業(yè)務(wù)。

2、RabbitMQ

RabbitMQ是使用Erlang語言開發(fā)的開源消息隊列系統(tǒng),基于AMQP協(xié)議來實現(xiàn)。

AMQP的主要特征是面向消息、隊列、可靠性、安全。在企業(yè)系統(tǒng)內(nèi)對數(shù)據(jù)一致性、穩(wěn)定性和可靠性要求很高的場景(時效性是微秒級),對性能和吞吐量(單機萬級)的要求還在其次。

  • Erlang是一種通用的面向并發(fā)的編程語言,它專注于構(gòu)建分布式、可伸縮的實時應(yīng)用程序。它具有輕量級進(jìn)程、消息傳遞和內(nèi)置容錯機制等特性,非常適合構(gòu)建高并發(fā)的系統(tǒng)。
  • AMQP(Advanced Message Queuing Protocol)協(xié)議是一種用于進(jìn)程間傳遞異步消息的網(wǎng)絡(luò)協(xié)議。它定義了消息的格式和傳遞規(guī)則,支持可靠的消息傳送、消息路由和隊列管理等功能。

3、區(qū)別

RabbitMQ更適合需要高可靠性和靈活性的應(yīng)用場景,適用于需要確保消息傳遞不丟失且順序性較為重要的場景。而Kafka則更適合對數(shù)據(jù)處理的吞吐量要求較高、并且可以接受一些消息傳遞的延遲和少量數(shù)據(jù)丟失的場景,適用于大規(guī)模數(shù)據(jù)流處理或?qū)崟r日志處理等場景。

RabbiMQ集群

RabbiMQ簡介

RabbiMQ是?erlang語言開發(fā)的,開源的,集群?常?便,支持多種語言客戶端,包括java、Python、ruby、PHP、C/C++等,但其本身并不?持負(fù)載均衡,支持高并發(fā)。支持AJAX,持久化,用于在分布式系統(tǒng)中存儲轉(zhuǎn)發(fā)消息,在易用性、高可用性等方面表現(xiàn)不俗。

Ajax 即“Asynchronous Javascript And XML”(異步 JavaScript 和 XML),是指一種創(chuàng)建交互式網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā)技術(shù)。Ajax = 異步 JavaScript 和 XML

2、RabbitMQ 特點

- 可靠性---提供了多種技術(shù)可以在性能和可靠性之間進(jìn)行權(quán)衡。這些技術(shù)包括持久性機制、投遞確認(rèn)、和高可用性機制。持久性機制:可以通過設(shè)置消息的持久性標(biāo)志來確保消息在服務(wù)器重啟后仍然存在。持久化的消息會被寫入磁盤,并在RabbitMQ重啟后重新加載。投遞確認(rèn):發(fā)布確認(rèn)功能可以讓生產(chǎn)者知道消息是否成功發(fā)送到了消息隊列。如果消息未能成功投遞,生產(chǎn)者可以重新發(fā)送該消息。高可用性機制:RabbitMQ 支持集群部署,可以配置為鏡像隊列模式,這樣即使某個節(jié)點失敗,其他節(jié)點也可以繼續(xù)提供服務(wù),確保消息不會丟失。

- 高可用性:集群:多個RabbitMQ節(jié)點可以組成一個集群,使得消息可以在集群內(nèi)的任意節(jié)點上被發(fā)布和消費。鏡像隊列:在集群中,可以將隊列配置為鏡像隊列,這意味著隊列的內(nèi)容會在所有集群節(jié)點上復(fù)制,從而提高了系統(tǒng)的容錯性和可用性。故障轉(zhuǎn)移:當(dāng)某個節(jié)點發(fā)生故障時,其他節(jié)點可以接管其工作,確保服務(wù)的連續(xù)性。

- 多語言客戶端:RabbitMQ 支持多種編程語言的客戶端庫,這使得開發(fā)者可以用自己熟悉的語言編寫應(yīng)用程序。官方支持的語言包括但不限于 Java、Python、Ruby、.NET 和 JavaScript。此外,由于RabbitMQ基于AMQP標(biāo)準(zhǔn)協(xié)議,所以幾乎所有的編程語言都可以通過第三方庫或自定義客戶端與之交互。

- 管理界面:RabbitMQ 提供了一個直觀的Web管理界面,允許管理員監(jiān)控和管理RabbitMQ服務(wù)器的狀態(tài)。通過這個界面,您可以查看隊列、交換機和連接的狀態(tài),還可以執(zhí)行各種管理操作,例如創(chuàng)建和刪除隊列、查看消息內(nèi)容等。

- 插件機制

MQ如何實現(xiàn)持久化

1. 隊列實現(xiàn)持久化

如果要隊列實現(xiàn)持久化,需要在聲明隊列的時候把 durable 參數(shù)設(shè)置為持久化 。

boolean durable = true;
channel.queueDeclare(ACK_QUEUE_NAME, durable, false, false, null);

但是需要注意的就是如果之前聲明的隊列不是持久化的,需要把原先隊列先刪除,或者重新 創(chuàng)建一個持久化的隊列,不然就會出現(xiàn)錯誤。

當(dāng)我們將durable參數(shù)位置傳遞true之后,即使重啟 rabbitmq 隊列也依然存在。

2. 消息實現(xiàn)持久化

要想讓消息實現(xiàn)持久化需要在消息生產(chǎn)者修改代碼,需要像channel的basicPublish方法中props屬性中傳遞MessageProperties.PERSISTENT_TEXT_PLAIN 參數(shù)

3、消息隊列

MQ 全稱為Message Queue, 消息隊列。是一種應(yīng)用程序?qū)?yīng)用程序的通信方法。應(yīng)用程序通過讀寫出入隊列的消息(針對應(yīng)用程序的數(shù)據(jù))來通信,而無需專用連接來鏈接它們。

RabbiMQ模式

注意:RabbitMQ模式?概分為以下三種:

(1)單?模式。在單一模式下,RabbitMQ僅由單個節(jié)點組成,用于傳遞消息。這種模式適用于簡單的應(yīng)用場景,對可靠性和高可用性要求較低。

(2)普通模式。普通模式是RabbitMQ的默認(rèn)集群模式。多個節(jié)點組成一個集群,消息會在這些節(jié)點之間進(jìn)行分發(fā)和傳遞,以提高消息傳遞的可靠性和高可用性。普通模式適用于大多數(shù)場景。

(3) 鏡像模式。鏡像模式是RabbitMQ的高可用性解決方案之一。在鏡像模式中,需要先建立一個普通集群模式,然后在此基礎(chǔ)上配置鏡像模式。鏡像隊列將消息副本存儲在多個節(jié)點上,以實現(xiàn)高可用性。這種模式適用于對業(yè)務(wù)可靠性要求較高的場景。

集群中的基本概念

RabbitMQ的集群節(jié)點包括內(nèi)存節(jié)點、磁盤節(jié)點。顧名思義內(nèi)存節(jié)點就是將所有數(shù)據(jù)放在內(nèi)存,磁盤節(jié)點將數(shù)據(jù)放在磁盤。

內(nèi)存節(jié)點(RAM節(jié)點):內(nèi)存節(jié)點將所有的隊列、交換器和綁定信息存儲在內(nèi)存中。這種節(jié)點對于低延遲和高吞吐量的場景非常適用,但是在節(jié)點宕機時,存儲在內(nèi)存中的消息會丟失。

磁盤節(jié)點:磁盤節(jié)點將隊列、交換器和綁定信息存儲在磁盤上,以保證數(shù)據(jù)的持久性。即使節(jié)點宕機,數(shù)據(jù)也可以從磁盤中恢復(fù)。磁盤節(jié)點可以通過配置設(shè)置為具有鏡像隊列的高可用性模式,以確保數(shù)據(jù)的冗余備份。

一個rabbitmq集 群中可以共享 user,vhost,queue,exchange等,所有的數(shù)據(jù)和狀態(tài)都是必須在所有節(jié)點上復(fù)制。

  • ConnectionFactory(連接管理器):應(yīng)用程序與Rabbit之間建立tcp連接的管理器,程序代碼中使用;
  • Channel(信道):消息推送使用的通道;
  • Exchange(交換器):用于接受、分配消息;
  • Queue(隊列):用于存儲生產(chǎn)者的消息;類似存放商品的倉庫和商店。是生產(chǎn)商品的工廠和購買商品的用戶之間的中轉(zhuǎn)站。
  • Broker:簡單來說就是消息隊列服務(wù)器實體
  • vhost:虛擬主機,一個broker里可以開設(shè)多個vhost,用作不同用戶的權(quán)限分離.
  • producer:消息生產(chǎn)者,就是投遞消息的程序。
  • consumer:消息消費者,就是接受消息的程序。
  • user:用戶
  • Binding: exchange 與 queue 之間的虛擬鏈接,binding 中可以包含 routing key。binding 信息被保存到 exchange 的查詢表中,用于消息的分發(fā)。

面試注意:集群中有兩種節(jié)點

1 內(nèi)存節(jié)點:只保存狀態(tài)到內(nèi)存(持久的queue的持久內(nèi)容將被保存到disk)

2 磁盤節(jié)點:保存狀態(tài)到內(nèi)存和磁盤。---推薦

內(nèi)存節(jié)點雖然不寫入磁盤,但是它執(zhí)行比磁盤節(jié)點要好。集群中,只需要一個磁盤節(jié)點來保存狀態(tài) 就足夠了。如果集群中只有內(nèi)存節(jié)點,那么不能停止它們,否則所有的狀態(tài),消息等都會丟失。

普通集群準(zhǔn)備環(huán)境

注意,這?三臺服務(wù)器都關(guān)閉防火墻和selinux

192.168.50.138  rabbitmq-1
192.168.50.139  rabbitmq-2
192.168.50.140  rabbitmq-3

三臺機器都操作:

1.配置hosts?件更改三臺MQ節(jié)點的計算機名分別為rabbitmq-1、rabbitmq-2 和rabbitmq-3,然后修改hosts配置?件

[root@rabbitmq-1 ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.50.138 rabbitmq-1
192.168.50.139 rabbitmq-2
192.168.50.140 rabbitmq-3

2.三個節(jié)點配置安裝rabbitmq軟件

安裝依賴

[root@rabbitmq-1 ~]# yum install -y *epel* gcc-c++ unixODBC unixODBC-devel openssl-devel ncurses-devel
yum安裝erlang
[root@rabbitmq-1 ~]# curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
[root@rabbitmq-1 ~]# yum install erlang-21.3.8.21-1.el7.x86_64
測試;
[root@rabbitmq-1 ~]# erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:10] [hipe] [kernel-poll:false]
?
Eshell V9.3  (abort with ^G)
1>
?安裝rabbitmq
https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.7.10 ---選擇版本
下載下來將其上傳到服務(wù)器中,三臺機器相同操作
https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.10/rabbitmq-server-3.7.10-1.el7.noarch.rpm
?
[root@rabbitmq-1 ~]# yum install -y rabbitmq-server-3.7.10-1.el7.noarch.rpm
?
# erlang 版本選擇
https://packagecloud.io/rabbitmq/erlang
# rabbitmq 和erlang兼容版本
https://www.rabbitmq.com/which-erlang.html
3.啟動
[root@rabbitmq-1 ~]# systemctl daemon-reload
[root@rabbitmq-1 ~]# systemctl start rabbitmq-server
[root@rabbitmq-1 ~]# systemctl enable rabbitmq-server
啟動方式二:
[root@rabbitmq-1 ~]# /sbin/service rabbitmq-server status  ---查看狀態(tài)
[root@rabbitmq-1 ~]# /sbin/service rabbitmq-server start   ---啟動
每臺都操作開啟rabbitmq的web訪問界面:
[root@rabbitmq-1 ~]# rabbitmq-plugins enable rabbitmq_management

創(chuàng)建用戶

注意:在一臺機器操作
添加用戶和密碼
[root@rabbitmq-1 ~]# rabbitmqctl add_user soho soso
Creating user "soho" ...
...done.
設(shè)置為管理員
[root@rabbitmq-1 ~]# rabbitmqctl set_user_tags soho administrator
Setting tags for user "soho" to [administrator] ...
...done.
查看用戶
[root@rabbitmq-1 ~]# rabbitmqctl list_users
Listing users ...
guest   [administrator]
soho    [administrator]
...done.
此處設(shè)置權(quán)限時注意'.*'之間需要有空格 三個'.*'分別代表了conf權(quán)限,read權(quán)限與write權(quán)限 
例如:當(dāng)沒有給
soho設(shè)置這三個權(quán)限前是沒有權(quán)限查詢隊列,在ui界面也看不見
[root@rabbitmq-1 ~]# rabbitmqctl set_permissions -p "/" soho ".*" ".*" ".*"
Setting permissions for user "soho" in vhost "/" ...
...done.

所有機器都操作:開啟用戶遠(yuǎn)程登錄:

[root@rabbitmq-1 ~]# cd /etc/rabbitmq/
[root@rabbitmq-1 rabbitmq]# cp /usr/share/doc/rabbitmq-server-3.7.10/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
[root@rabbitmq-1 rabbitmq]# ls
enabled_plugins  rabbitmq.config
[root@rabbitmq-1 rabbitmq]# vim rabbitmq.config #開啟用戶遠(yuǎn)程登錄
修改如下:

三臺機器都操作重啟服務(wù)服務(wù):
[root@rabbitmq-1 ~]# systemctl restart rabbitmq-server

查看端口

4369 -- erlang端口
5672 --程序連接端口
15672 -- 管理界面ui端口
25672 -- server間內(nèi)部通信口

!注意如果是云服務(wù)器,切記添加安全組端口放行。

訪問:192.168.50.138:15672

這里需要注意:

rabbitmq默認(rèn)管理員用戶:guest 密碼:guest

新添加的用戶為:soho 密碼:soso

部署集群

三臺機器都操作

1.創(chuàng)建數(shù)據(jù)存放目錄和日志存放目錄

[root@rabbitmq-1 ~]# mkdir -p /data/rabbitmq/data
[root@rabbitmq-1 ~]# mkdir -p /data/rabbitmq/logs
[root@rabbitmq-1 ~]# chmod 777 -R /data/rabbitmq
[root@rabbitmq-1 ~]# chown rabbitmq.rabbitmq /data/ -R
創(chuàng)建配置文件:
[root@rabbitmq-1 ~]# vim /etc/rabbitmq/rabbitmq-env.conf
[root@rabbitmq-1 ~]# cat /etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_MNESIA_BASE=/data/rabbitmq/data
RABBITMQ_LOG_BASE=/data/rabbitmq/logs
重啟服務(wù)
[root@rabbitmq-1 ~]# systemctl restart rabbitmq-server

2.拷?erlang.cookie

Rabbitmq的集群是依附于erlang的集群來?作的,所以必須先構(gòu)建起erlang的集群鏡像。Erlang的集群中各節(jié)點是經(jīng)由?個cookie來實現(xiàn)的,這個cookie存放在/var/lib/rabbitmq/.erlang.cookie中,?件是400的權(quán)限。所以必須保證各節(jié)點cookie?致,不然節(jié)點之間就?法通信。

如果執(zhí)行 rabbitmqctl stop_app 這條命令報錯:需要執(zhí)行:
chmod 400 .erlang.cookie
chown rabbitmq.rabbitmq .erlang.cookie

(官方在介紹集群的文檔中提到過.erlang.cookie 一般會存在這兩個地址:第一個是home/.erlang.cookie;第二個地方就是/var/lib/rabbitmq/.erlang.cookie。如果我們使用解壓縮方式安裝部署的rabbitmq,那么這個文件會在{home}目錄下,也就是$home/.erlang.cookie。如果我們使用rpm等安裝包方式進(jìn)行安裝的,那么這個文件會在/var/lib/rabbitmq目錄下。)

[root@rabbitmq-1 ~]# cat /var/lib/rabbitmq/.erlang.cookie
HOUCUGJDZYTFZDSWXTHJ
?scp的?式將rabbitmq-1節(jié)點的.erlang.cookie的值復(fù)制到其他兩個節(jié)點中。
~]# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.50.139:/var/lib/rabbitmq/
~]# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.50.140:/var/lib/rabbitmq/

3.將mq-2、mq-3作為內(nèi)存節(jié)點加?mq-1節(jié)點集群中

在mq-2、mq-3執(zhí)?如下命令:
[root@rabbitmq-2 ~]# rabbitmqctl stop_app  #停止節(jié)點,切記不是停止服務(wù)
~]# rabbitmqctl reset   #如果有數(shù)據(jù)需要重置,沒有則不用
~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq-1  
Clustering node 'rabbit@rabbitmq-2' with 'rabbit@rabbitmq-1' ...
~]# rabbitmqctl start_app  #啟動節(jié)點
Starting node 'rabbit@rabbitmq-2' ...

[root@rabbitmq-3 ~]# rabbitmqctl stop_app
Stopping node 'rabbit@rabbitmq-3' ...
[root@rabbitmq-3 ~]# rabbitmqctl reset
Resetting node 'rabbit@rabbitmq-3' ...
[root@rabbitmq-3 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq-1
Clustering node 'rabbit@rabbitmq-3' with 'rabbit@rabbitmq-1' ...
[root@rabbitmq-3 ~]# rabbitmqctl start_app
Starting node 'rabbit@rabbitmq-3' ...
?(1)默認(rèn)rabbitmq啟動后是磁盤節(jié)點,在這個cluster命令下,mq-2和mq-3是內(nèi)存節(jié)點,
mq-1是磁盤節(jié)點。
(2)如果要使mq-2、mq-3都是磁盤節(jié)點,去掉--ram參數(shù)即可。
(3)如果想要更改節(jié)點類型,可以使?命令rabbitmqctl change_cluster_node_type
disc(ram),前提是必須停掉rabbit應(yīng)?
注:
#如果有需要使用磁盤節(jié)點加入集群
 [root@rabbitmq-2 ~]# rabbitmqctl join_cluster  rabbit@rabbitmq-1
 [root@rabbitmq-3 ~]# rabbitmqctl join_cluster  rabbit@rabbitmq-1

4.查看集群狀態(tài)

在 RabbitMQ 集群任意節(jié)點上執(zhí)行 rabbitmqctl cluster_status來查看是否集群配置成功。
在mq-1磁盤節(jié)點上面查看
[root@rabbitmq-1 ~]# rabbitmqctl cluster_status

每臺機器顯示出三臺節(jié)點,表示已經(jīng)添加成功!

5.登錄rabbitmq web管理控制臺

打開瀏覽器輸?http://192.168.50.138:15672

輸?默認(rèn)的Username:guest,輸?默認(rèn)的Password:guest

登錄后出現(xiàn)如圖所示的界?。

創(chuàng)建新的隊列

根據(jù)界?提示創(chuàng)建?條隊列

創(chuàng)建新的用戶

添加主機

切換用戶

RabbitMQ鏡像集群配置

上面已經(jīng)完成RabbitMQ默認(rèn)集群模式,但并不保證隊列的高可用性,隊列內(nèi)容不會復(fù)制。如果隊列節(jié)點宕機直接導(dǎo)致該隊列無法應(yīng)用,只能等待重啟,所以要想在隊列節(jié)點宕機或故障也能正常應(yīng)用,就要復(fù)制隊列內(nèi)容到集群里的每個節(jié)點,必須要創(chuàng)建鏡像隊列。

鏡像隊列是基于普通的集群模式的。

創(chuàng)建鏡像集群

rabbitmq set_policy :設(shè)置策略

[root@rabbitmq-1 ~]# rabbitmqctl set_policy  ha-all "^" '{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...

再次查看隊列已經(jīng)同步到其他兩臺節(jié)點:

"^"匹配所有的隊列,策略名稱為ha-all, '{"ha-mode":"all"}' 策略模式為 all 即復(fù)制到所有節(jié)點,包含新增節(jié)點。

設(shè)置策略介紹:

rabbitmqctl set_policy [-p Vhost] Name Pattern Definition
-p Vhost: 可選參數(shù),針對指定vhost下的queue進(jìn)行設(shè)置(默認(rèn)根虛擬主機)
Name: policy的名稱,可以定義
Pattern: queue的匹配模式(正則表達(dá)式),也就是說會匹配一組。
Definition:鏡像定義,包括ha-mode,ha-params,ha-sync-mode
    ha-mode:指明鏡像隊列的模式
        all:表示在集群中所有的節(jié)點上進(jìn)行鏡像
        exactly:表示在指定個數(shù)的節(jié)點上進(jìn)行鏡像,
      ha-params:指定節(jié)點的個數(shù)
    ha-sync-mode:進(jìn)行隊列中消息的同步方式,有效值為automatic和manual,一般為自動同步
    ha-params:ha-mode模式需要用到的參數(shù)
案例:
例如,對隊列名稱以hello開頭的所有隊列進(jìn)行鏡像,并在集群的兩個節(jié)點上完成鏡像,policy的設(shè)置命令為: 
rabbitmqctl set_policy hello-ha “^hello” ‘{“ha-mode”:”exactly”,”ha-params”:2,”ha-sync-mode”:”automatic”}'

則此時鏡像隊列設(shè)置成功。

示例:

[root@rabbitmq-1 ~]# rabbitmqctl set_policy ha-all-1 -p test "^" '{"ha-mode":"all"}'
Setting policy "ha-all-1" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "test" ...

已經(jīng)部署完成

將所有隊列設(shè)置為鏡像隊列,即隊列會被復(fù)制到各個節(jié)點,各個節(jié)點狀態(tài)保持一致。

三、常見問題

常見錯誤:

1、使用 rabbitmq-server -detached命令啟動rabbitmq時,出現(xiàn)以下提示W(wǎng)arning: PID file not written; -detached was passed,此時使用rabbitmqctl status提示服務(wù)已啟動,可知此問題不用解決。

2、由于更改hostname文件,在每次rabbitmqctl stop或者rabbitmqctl cluster_status等,只要是rabbitmq的命令就報錯,提示大概如下

Cluster status of node rabbit@web2 ...
Error: unable to connect to node rabbit@web2: nodedown
?
DIAGNOSTICS
===========
?
attempted to contact: [rabbit@web2]
?
rabbit@web2:
  * connected to epmd (port 4369) on web2
  * epmd reports node 'rabbit' running on port 25672
  * TCP connection succeeded but Erlang distribution failed
?
  * Hostname mismatch: node "rabbit@mq2" believes its host is different. Please ensure that hostnames resolve the same way locally and on "rabbit@mq2"
?
?
current node details:
- node name: 'rabbitmq-cli-11@web2'
- home dir: /root
- cookie hash: SGwxMdJ3PjEXG1asIEFpBg==

此時先ps aux | grep mq,然后kill -9 該進(jìn)程,然后再rabbitmq-server -detached即可解決。(即先強殺,再重新啟動)

3、使用rabbitmqctl stop,rabbitmq-server -detached重新啟動后,原先添加的用戶admin、虛擬主機coresystem等均丟失,還需要重新添加。

RabbitMQ 高可用集群搭建完成,最后一個步驟就是搭建均衡器。

搭建均衡器

安裝并配置負(fù)載均衡器HA

注意:如果使用阿里云,可以使用阿里云的內(nèi)網(wǎng)slb來實現(xiàn)負(fù)載均衡,不用自己搭建HA。

安裝并配置負(fù)載均衡器HA

1、在192.168.50.138(rabbitmq-1)安裝HAProxy

yum -y install haproxy

2、修改 /etc/haproxy/haproxy.cfg

[root@rabbitmq-1 ~]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
[root@rabbitmq-1 ~]# vim /etc/haproxy/haproxy.cfg
global
    log         127.0.0.1 local2
?
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    nbproc      4
    daemon
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    retries                 3
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout check           10s
    maxconn                 2048
#---------------------------------------------------------------------
##監(jiān)控查看本地狀態(tài)#####
listen admin_stats
        bind *:80
    mode http
    option httplog
    option httpclose
    log 127.0.0.1 local0 err
    stats uri  /haproxy
    stats auth yunjisuan:123
####################################
###反代監(jiān)控
frontend server
    bind *:5670
    log global
    mode tcp
    default_backend rabbitmq
    maxconn 3
backend rabbitmq
    mode        tcp
    log         global
    balance     roundrobin
    server      rabbitmq1 192.168.50.138:5672 check inter 2000s rise 2 fall 3
    server      rabbitmq2 192.168.50.139:5672 check inter 2000s rise 2 fall 3
    server      rabbitmq3 192.168.50.140:5672 check inter 2000s rise 2 fall 3
    
/usr/sbin/haproxy -c -f /etc/haproxy/haproxy.cfg #檢查配置是否有效
systemctl restart haproxy                #重啟

瀏覽器輸入http://192.168.50.138/haproxy查看rabbitmq的狀態(tài)。

常見命令

插件管理

開啟某個插件:rabbitmq-plugins enable  xxx
  關(guān)閉某個插件:rabbitmq-plugins disable xxx
  注意:重啟服務(wù)器后生效。

用戶管理

 新建用戶:rabbitmqctl add_user xxx  pwd
  刪除用戶: rabbitmqctl delete_user xxx
  查看用戶:rabbitmqctl list_users
  改密碼: rabbimqctl change_password {username} {newpassword}
  設(shè)置用戶角色:rabbitmqctl set_user_tags {username} {tag ...}
  Tag可以為 administrator,monitoring, management

其他使用命令:

rabbitmq使用命令:
rabbitmq-plugins list    ----查看安裝的插件
rabbitmq-server -detached  -----------啟動RabbitMQ節(jié)點
rabbitmqctl start_app ----------啟動RabbitMQ應(yīng)用,而不是節(jié)點
rabbitmqctl stop_app  ------停止
rabbitmqctl status  ------查看狀態(tài)
rabbitmqctl add_user mq 123456    -------設(shè)置用戶和密碼
rabbitmqctl set_user_tags mq administrator ------------------新增賬戶并設(shè)置為管理員
rabbitmq-plugins enable rabbitmq_management  --------------------啟用RabbitMQ_Management
rabbitmqctl cluster_status -------------------集群狀態(tài)
rabbitmqctl forget_cluster_node rabbit@rabbit3 -------------------節(jié)點摘除 
rabbitmqctl reset application----------------------重置
 rabbitmqctl set_permissions -p "/" soso  ".*" ".*" ".*"    --------------授權(quán)
--------------------- 
查看Connection,Queue,Channel,User

   rabbitmqctl list_connections  #列出所有連接
   rabbitmqctl list_queues  #列出所有隊列
   rabbitmqctl list_channels #列出所有通道
   rabbitmqctl list_users   #列出所有用戶

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • linux下日志定時輪詢的流程詳解

    linux下日志定時輪詢的流程詳解

    這篇文章主要給大家介紹了關(guān)于在linux下日志定時輪詢流程的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-06-06
  • 淺談Linux的零拷貝技術(shù)

    淺談Linux的零拷貝技術(shù)

    零拷貝主要的任務(wù)就是避免CPU將數(shù)據(jù)從一塊存儲拷貝到另外一塊存儲,主要就是利用各種零拷貝技術(shù),避免讓CPU做大量的數(shù)據(jù)拷貝任務(wù),減少不必要的拷貝,需要的朋友可以參考下
    2023-04-04
  • php-fpm可執(zhí)行文件出現(xiàn)亂碼的解決方法

    php-fpm可執(zhí)行文件出現(xiàn)亂碼的解決方法

    這篇文章主要介紹了php-fpm可執(zhí)行文件出現(xiàn)亂碼的解決方法,需要的朋友可以參考下
    2014-04-04
  • 解決make: *** [Makefile:719: ext/openssl/openssl.lo] Error 1問題

    解決make: *** [Makefile:719: ext/openssl/openss

    在Ubuntu系統(tǒng)上編譯安裝PHP7.4.33時遇到OpenSSL庫文件缺失的錯誤,因為Ubuntu22.04的默認(rèn)OpenSSL版本與PHP不兼容,解決方法是安裝低版本的openssl包,并在編譯PHP時指定openssl路徑
    2024-12-12
  • 在Ubuntu Server上使用Samba共享`/data`目錄過程

    在Ubuntu Server上使用Samba共享`/data`目錄過程

    在Linux與Windows混合環(huán)境中,本文詳細(xì)介紹了如何在Ubuntu Server上配置Samba,實現(xiàn)/data目錄的文件共享,滿足日常文件共享與數(shù)據(jù)交換需求,通過簡單直接的配置步驟,Windows用戶可以方便地訪問與操作該共享目錄
    2026-05-05
  • Linux磁盤開機掛載的實現(xiàn)步驟

    Linux磁盤開機掛載的實現(xiàn)步驟

    在Linux系統(tǒng)中,通過修改/etc/fstab文件,可以實現(xiàn)磁盤開機自動掛載,文章詳細(xì)介紹了掛載和開機自動掛載的基本概念,以及實現(xiàn)步驟,需要的朋友可以參考下
    2025-12-12
  • Ubuntu系統(tǒng)中查看網(wǎng)絡(luò)速率的幾種方法

    Ubuntu系統(tǒng)中查看網(wǎng)絡(luò)速率的幾種方法

    這篇文章主要給大家介紹了在 Ubuntu系統(tǒng)中,可以使用以下幾種方法查看網(wǎng)絡(luò)速率,文中通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-11-11
  • Linux實現(xiàn)線程同步的多種方式匯總

    Linux實現(xiàn)線程同步的多種方式匯總

    本文詳細(xì)介紹了Linux下線程同步的多種方法,包括互斥鎖、自旋鎖、信號量以及它們的使用示例,通過這些同步機制,可以解決線程安全問題,防止資源競爭導(dǎo)致的錯誤,示例代碼展示了如何在多線程環(huán)境中正確地管理共享資源,確保線程安全,需要的朋友可以參考下
    2025-06-06
  • 使用autoconf生成Makefile并編譯工程的步驟

    使用autoconf生成Makefile并編譯工程的步驟

    今天小編就為大家分享一篇關(guān)于使用autoconf生成Makefile并編譯工程的步驟,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • 使用Python生成Shell命令,批量執(zhí)行程序代碼解析

    使用Python生成Shell命令,批量執(zhí)行程序代碼解析

    這篇文章主要介紹了使用Python生成Shell命令,批量執(zhí)行程序代碼解析,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01

最新評論

郧西县| 清镇市| 乌拉特前旗| 丰镇市| 平陆县| 石渠县| 瑞昌市| 象山县| 同德县| 萍乡市| 五原县| 益阳市| 轮台县| 亚东县| 南华县| 沁水县| 华容县| 浏阳市| 昭苏县| 含山县| 双流县| 博乐市| 贡山| 郁南县| 顺平县| 当涂县| 蒙阴县| 徐州市| 内江市| 景洪市| 赫章县| 商洛市| 威信县| 乌鲁木齐县| 清远市| 赤水市| 瑞丽市| 吉木萨尔县| 洪洞县| 时尚| 金塔县|