偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

一文帶你入門RabbitMQ消息隊(duì)列

開(kāi)發(fā) 前端
消息隊(duì)列是一種用于在應(yīng)用程序之間傳遞消息的通信方式,消息隊(duì)列允許應(yīng)用程序異步的發(fā)送和接收消息,并且不需要直接連接到對(duì)方。消息指的是兩個(gè)應(yīng)用間傳遞的數(shù)據(jù)。數(shù)據(jù)的類型有很多種形式,可能只包含文本字符串,也可能包含嵌入對(duì)象。

基礎(chǔ)概念

什么是消息隊(duì)列

消息隊(duì)列是一種用于在應(yīng)用程序之間傳遞消息的通信方式,消息隊(duì)列允許應(yīng)用程序異步的發(fā)送和接收消息,并且不需要直接連接到對(duì)方。

消息指的是兩個(gè)應(yīng)用間傳遞的數(shù)據(jù)。數(shù)據(jù)的類型有很多種形式,可能只包含文本字符串,也可能包含嵌入對(duì)象。

隊(duì)列指的是存儲(chǔ)數(shù)據(jù)的介質(zhì),遵循先進(jìn)先出的規(guī)則。

圖片圖片

為什么使用消息隊(duì)列

解耦

在傳統(tǒng)模式下,假設(shè)新增物流系統(tǒng)模塊,則需要訂單系統(tǒng)新增調(diào)用物流系統(tǒng)的代碼邏輯。假設(shè)庫(kù)存系統(tǒng)異常,訂單系統(tǒng)調(diào)用出錯(cuò),會(huì)導(dǎo)致整個(gè)服務(wù)不可用。為了降低這種強(qiáng)耦合,就可以使用MQ,系統(tǒng)訂單系統(tǒng)只需要把數(shù)據(jù)發(fā)送到MQ,其他系統(tǒng)如果需要數(shù)據(jù),則從MQ中獲取即可。

  • 傳統(tǒng)模式

圖片圖片

畫板

  • 消息隊(duì)列模式

畫板畫板

異步

如圖所示。進(jìn)行用戶注冊(cè)時(shí),會(huì)進(jìn)行寫入數(shù)據(jù)庫(kù)、發(fā)送郵件、發(fā)送短信操作。同步請(qǐng)求的話,響應(yīng)時(shí)間就是所有操作步驟時(shí)間的總和,也就是1s。如果使用MQ,用戶模塊發(fā)送數(shù)據(jù)到MQ,然后就可以返回響應(yīng)給客戶端,不需要再等待系統(tǒng)其他操作的響應(yīng),可以大大地提高性能。對(duì)于一些非必要的業(yè)務(wù),比如發(fā)送短信,發(fā)送郵件等等,就可以采用MQ。

  • 傳統(tǒng)模式

畫板畫板

  • 消息隊(duì)列模式

畫板畫板

削峰

假設(shè)系統(tǒng)A在某一段時(shí)間請(qǐng)求數(shù)暴增,有5000個(gè)請(qǐng)求發(fā)送過(guò)來(lái),系統(tǒng)A這時(shí)就會(huì)發(fā)送5000條SQL進(jìn)入MySQL進(jìn)行執(zhí)行,MySQL對(duì)于如此龐大的請(qǐng)求當(dāng)然處理不過(guò)來(lái),MySQL就會(huì)崩潰,導(dǎo)致系統(tǒng)癱瘓。如果使用MQ,系統(tǒng)A不再是直接發(fā)送SQL到數(shù)據(jù)庫(kù),而是把數(shù)據(jù)發(fā)送到MQ,MQ短時(shí)間積壓數(shù)據(jù)是可以接受的,然后由消費(fèi)者每次拉取2000條進(jìn)行處理,防止在請(qǐng)求峰值時(shí)期大量的請(qǐng)求直接發(fā)送到MySQL導(dǎo)致系統(tǒng)崩潰。

  • 傳統(tǒng)模式

畫板畫板

  • 消息隊(duì)列模式

畫板畫板

RabbitMQ的特點(diǎn)

RabbitMQ是一款使用Erlang語(yǔ)言開(kāi)發(fā)的,實(shí)現(xiàn)AMQP(高級(jí)消息隊(duì)列協(xié)議)的開(kāi)源消息中間件。

  • 可靠性。支持持久化,傳輸確認(rèn),發(fā)布確認(rèn)等保證了MQ的可靠性。
  • 靈活的分發(fā)消息策略。這應(yīng)該是RabbitMQ的一大特點(diǎn)。在消息進(jìn)入MQ前由Exchange(交換機(jī))進(jìn)行路由消息。分發(fā)消息策略有:簡(jiǎn)單模式、工作隊(duì)列模式、發(fā)布訂閱模式、路由模式、通配符模式。
  • 支持集群。多臺(tái)RabbitMQ服務(wù)器可以組成一個(gè)集群,形成一個(gè)邏輯Broker。
  • 多種協(xié)議。RabbitMQ支持多種消息隊(duì)列協(xié)議,比如 STOMP、MQTT 等等。
  • 支持多種語(yǔ)言客戶端。RabbitMQ幾乎支持所有常用編程語(yǔ)言,包括 Java、.NET、Ruby 等等。
  • 可視化管理界面。RabbitMQ提供了一個(gè)易用的用戶界面,使得用戶可以監(jiān)控和管理消息 Broker。
  • 插件機(jī)制。RabbitMQ提供了許多插件,可以通過(guò)插件進(jìn)行擴(kuò)展,也可以編寫自己的插件。

消息隊(duì)列中間件對(duì)比

目前在市面上比較主流的MQ中間件主要有,ActiveMQ、RabbitMQ、Kafka、RocketMQ 等這幾種,對(duì)比如下表:

特性

ActiveMQ

RabbitMQ

Kafka

RocketMQ

所屬社區(qū)/公司

Apache

Mozilla Public License

Apache

Apache/Ali

單機(jī)呑吐量

萬(wàn)級(jí)

萬(wàn)級(jí)

幾十萬(wàn)級(jí)

十萬(wàn)級(jí)

時(shí)效性

毫秒級(jí)

微秒級(jí)

毫秒級(jí)

毫秒級(jí)

可用性

主從

主從

分布式

分布式

功能特性

MQ領(lǐng)域功能極其完備

基于erlang開(kāi)發(fā),所以并發(fā)能力很強(qiáng),性能極其好,延時(shí)很低

功能較為簡(jiǎn)單,主要支持簡(jiǎn)單的MQ功能,在大數(shù)據(jù)領(lǐng)域的實(shí)時(shí)計(jì)算以及日志采集被大規(guī)模使用

MQ功能比較完備,擴(kuò)展性佳

消息可靠性

有較低的概率丟失數(shù)據(jù)

基本不丟

經(jīng)過(guò)參數(shù)優(yōu)化配置,可以做到 0 丟失

同 Kafka

事務(wù)

支持

不支持

支持

支持

broker端消息過(guò)濾

支持

不支持

不支持

可以支持Tag標(biāo)簽過(guò)濾和SQL表達(dá)式過(guò)濾

消息查詢

支持

根據(jù)消息id查詢

不支持

支持Message id或Key查詢

消息回溯

支持

不支持

理論上可以支持時(shí)間或offset回溯,但是得修改代碼。

支持按時(shí)間來(lái)回溯消息,精度毫秒,例如從一天之前的某時(shí)某分某秒開(kāi)始重新消費(fèi)消息。

路由邏輯

無(wú)

基于交換機(jī),可配置復(fù)雜路由邏輯

根據(jù)topic

根據(jù)topic,可以配置過(guò)濾消費(fèi)

持久化

內(nèi)存、文件、數(shù)據(jù)庫(kù)

隊(duì)列基于內(nèi)存,只能少量堆積

磁盤,大量堆積

磁盤,大量堆積

順序消息

支持

不支持

支持

支持

社區(qū)活躍度





適用場(chǎng)景

解耦和異步調(diào)用,較少在大規(guī)模吞吐的場(chǎng)景中使用

數(shù)據(jù)量小對(duì)時(shí)效性要求高的場(chǎng)景中使用

大數(shù)據(jù)類的系統(tǒng)來(lái)進(jìn)行實(shí)時(shí)數(shù)據(jù)計(jì)算、日志采集等場(chǎng)景。

目前在阿里被廣泛應(yīng)用在訂單、交易、充值、流計(jì)算、消息推送、日志流式處理、binglog分發(fā)消息等場(chǎng)景。

RabbitMQ原理

內(nèi)部結(jié)構(gòu)

RabbitMQ 本質(zhì)是 AMQP 協(xié)議的一個(gè)開(kāi)源實(shí)現(xiàn),在詳細(xì)介紹 RabbitMQ 之前,我們先來(lái)看一下 AMQP 的內(nèi)部結(jié)構(gòu)圖

圖片圖片

  • Publisher:消息的生產(chǎn)者,也是一個(gè)向交換器發(fā)布消息的客戶端應(yīng)用程序
  • Exchange:交換器,用來(lái)接收生產(chǎn)者發(fā)送的消息并將這些消息路由給服務(wù)器中的隊(duì)列
  • Binding:綁定,用于將消息隊(duì)列和交換器之間建立關(guān)聯(lián)。一個(gè)綁定就是基于路由鍵將交換器和消息隊(duì)列連接起來(lái)的路由規(guī)則,所以可以將它理解成一個(gè)由綁定構(gòu)成的路由表。
  • Queue:消息隊(duì)列,用來(lái)保存消息直到發(fā)送給消費(fèi)者
  • Connection:網(wǎng)絡(luò)連接,比如一個(gè) TCP 連接
  • Channel:信道,多路復(fù)用連接中的一條獨(dú)立的雙向數(shù)據(jù)流通道
  • Consumer:消息的消費(fèi)者,表示一個(gè)從消息隊(duì)列中取得消息的客戶端應(yīng)用程序
  • Virtual Host:虛擬主機(jī),表示一批交換器、消息隊(duì)列和相關(guān)對(duì)象。虛擬主機(jī)是共享相同的身份認(rèn)證和加密環(huán)境的獨(dú)立服務(wù)器域。每個(gè) vhost 本質(zhì)上就是一個(gè) mini 版的 RabbitMQ 服務(wù)器,擁有自己的隊(duì)列、交換器、綁定和權(quán)限機(jī)制。vhost 是 AMQP 概念的基礎(chǔ),必須在連接時(shí)指定,RabbitMQ 默認(rèn)的 vhost 是 /
  • Broker:表示消息隊(duì)列服務(wù)器實(shí)體
  • Message:消息實(shí)體,它由消息頭和消息體組成。消息頭主要由路由鍵、交換器、隊(duì)列、priority(相對(duì)于其他消息的優(yōu)先權(quán))、delivery-mode(指出該消息可能需要持久性存儲(chǔ))等屬性組成,而消息體就是指具體的業(yè)務(wù)對(duì)象。

相比傳統(tǒng)的 JMS 模型,AMQP 主要多了 Exchange、Binding 這個(gè)新概念。

在 AMQP 模型中,消息的生產(chǎn)者不是直接將消息發(fā)送到Queue隊(duì)列,而是將消息發(fā)送到Exchange交換器,其中還新加了一個(gè)中間層Binding綁定,作用就是通過(guò)路由鍵Key將交換器和隊(duì)列建立綁定關(guān)系。

圖片圖片

就好比類似**用戶表和角色表,中間通過(guò)用戶角色表**來(lái)將用戶和角色建立關(guān)系,從而實(shí)現(xiàn)關(guān)系綁定,在 RabbitMQ 中,消息生產(chǎn)者不直接跟隊(duì)列建立關(guān)系,而是將消息發(fā)送到交換器之后,由交換器通過(guò)已經(jīng)建立好的綁定關(guān)系,將消息發(fā)送到對(duì)應(yīng)的隊(duì)列!

RabbitMQ 最終的架構(gòu)模型,核心部分就變成如下圖所示:

圖片圖片

從圖中很容易看出,與 JMS 模型最明顯的差別就是消息的生產(chǎn)者不直接將消息發(fā)送給隊(duì)列,而是由Binding綁定決定交換器的消息應(yīng)該發(fā)送到哪個(gè)隊(duì)列,進(jìn)一步實(shí)現(xiàn)了在消息的推送方面,更加靈活!

交換器分發(fā)策略

當(dāng)消息的生產(chǎn)者將消息發(fā)送到交換器之后,是不會(huì)存儲(chǔ)消息的,而是通過(guò)中間層綁定關(guān)系將消息分發(fā)到不同的隊(duì)列上,其中交換器的分發(fā)策略分為四種:Direct、Topic、Headers、Fanout!

  • Direct:直連類型,即在綁定時(shí)設(shè)定一個(gè) routing_key, 消息的 routing_key 匹配時(shí), 才會(huì)被交換器投送到綁定的隊(duì)列中去,原則是先匹配、后投送;
  • Topic:按照規(guī)則轉(zhuǎn)發(fā)類型,支持通配符匹配,和 Direct 功能一樣,但是在匹配 routing_key的時(shí)候,更加靈活,支持通配符匹配,原則也是先匹配、后投送;
  • Headers:頭部信息匹配轉(zhuǎn)發(fā)類型,根據(jù)消息頭部中的 header attribute 參數(shù)類型,將消息轉(zhuǎn)發(fā)到對(duì)應(yīng)的隊(duì)列,原則也是先匹配、后投送;
  • Fanout:廣播類型,將消息轉(zhuǎn)發(fā)到所有與該交互機(jī)綁定的隊(duì)列上,不關(guān)心 routing_key;

Direct

Direct 是 RabbitMQ 默認(rèn)的交換機(jī)模式,也是最簡(jiǎn)單的模式,消息中的路由鍵(routing key)如果和 Binding 中的 binding key 一致, 交換器就將消息發(fā)到對(duì)應(yīng)的隊(duì)列中。

如果傳入的 routing key 為 black,不會(huì)轉(zhuǎn)發(fā)到black.green。Direct 類型交換器是完全匹配、單播的模式。

圖片圖片

Topic

Topic 類型交換器轉(zhuǎn)發(fā)消息和 Direct 一樣,不同的是:它支持通配符轉(zhuǎn)發(fā),相比 Direct 類型更加靈活!

兩種通配符:*只能匹配一個(gè)單詞,#可以匹配零個(gè)或多個(gè)。

如果傳入的 routing key 為 black#,不僅會(huì)轉(zhuǎn)發(fā)到black,也會(huì)轉(zhuǎn)發(fā)到black.green。

圖片圖片

Headers

headers 也是根據(jù)規(guī)則匹配, 相比 direct 和 topic 固定地使用 routing_key , headers 則是通過(guò)一個(gè)自定義匹配規(guī)則的消息頭部類進(jìn)行匹配。

在隊(duì)列與交換器綁定時(shí),會(huì)設(shè)定一組鍵值對(duì)規(guī)則,消息中也包括一組鍵值對(duì)( headers 屬性),當(dāng)這些鍵值對(duì)有一對(duì), 或全部匹配時(shí),消息被投送到對(duì)應(yīng)隊(duì)列。

此外 headers 交換器和 direct 交換器完全一致,但性能差很多,目前幾乎用不到了。

圖片圖片

Fanout

Fanout  類型交換器與上面幾個(gè)不同,不管路由鍵或者是路由模式,會(huì)把消息發(fā)給綁定給它的全部隊(duì)列,如果配置了 routing_key 會(huì)被忽略,也被成為消息廣播模式。很像子網(wǎng)廣播,每臺(tái)子網(wǎng)內(nèi)的主機(jī)都獲得了一份復(fù)制的消息

fanout 類型轉(zhuǎn)發(fā)消息在四種類型中是最快的。

單節(jié)點(diǎn)部署

docker部署

參考文檔:https://hub.docker.com/_/rabbitmq

docker run -d --name RabbitMQ -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123456 -p 15672:15672 rabbitmq:4.0-management

然后打開(kāi)瀏覽器訪問(wèn)服務(wù)器ip:15672,輸入我們創(chuàng)建的賬號(hào)密碼登錄即可。

rpm部署

安裝Erlang

RabbitMQ是采用 Erlang語(yǔ)言開(kāi)發(fā)的,所以系統(tǒng)環(huán)境必須提供 Erlang環(huán)境,需要是安裝 Erlang

Erlang和RabbitMQ版本對(duì)照:https://www.rabbitmq.com/which-erlang.html

本次安裝4.0版本的RabbitMQ,需要的Erlang版本為26.2,

下載地址:https://packagecloud.io/rabbitmq/erlang

[root@tiaoban ~]# wget https://packagecloud.io/rabbitmq/erlang/packages/el/8/erlang-26.2.5.3-1.el8.x86_64.rpm/download.rpm -O ./erlang-26.2.5.3-1.el8.x86_64.rpm
[root@tiaoban ~]# ls
erlang-26.2.5.3-1.el8.x86_64.rpm
# 安裝erlang
[root@tiaoban ~]# rpm -ivh erlang-26.2.5.3-1.el8.x86_64.rpm
警告:erlang-26.2.5.3-1.el8.x86_64.rpm: 頭V4 RSA/SHA256 Signature, 密鑰 ID 6026dfca: NOKEY
Verifying...                          ################################# [100%]
準(zhǔn)備中...                          ################################# [100%]
正在升級(jí)/安裝...
   1:erlang-26.2.5.3-1.el8            ################################# [100%]
# 驗(yàn)證
[root@tiaoban ~]# erl -v
Erlang/OTP 26 [erts-14.2.5.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit:ns]

Eshell V14.2.5.3 (press Ctrl+G to abort, type help(). for help)
1>

安裝RabbitMQ

下載地址:https://www.rabbitmq.com/docs/install-rpm

在RabiitMQ安裝過(guò)程中需要依賴socat和logrotate插件,首先安裝該插件

[root@tiaoban ~]# dnf -y install socat logrotate

安裝RabbitMQ

[root@tiaoban ~]# wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v4.0.1/rabbitmq-server-4.0.1-1.el8.noarch.rpm
[root@tiaoban ~]# ls
erlang-26.2.5.3-1.el8.x86_64.rpm  k8s  rabbitmq-server-4.0.1-1.el8.noarch.rpm
[root@tiaoban ~]# rpm -ivh rabbitmq-server-4.0.1-1.el8.noarch.rpm
警告:rabbitmq-server-4.0.1-1.el8.noarch.rpm: 頭V4 RSA/SHA512 Signature, 密鑰 ID 6026dfca: NOKEY
Verifying...                          ################################# [100%]
準(zhǔn)備中...                          ################################# [100%]
正在升級(jí)/安裝...
   1:rabbitmq-server-4.0.1-1.el8      ################################# [100%]
[/usr/lib/tmpfiles.d/rabbitmq-server.conf:1] Line references path below legacy directory /var/run/, updating /var/run/rabbitmq → /run/rabbitmq; please update the tmpfiles.d/ drop-in file accordingly.

啟動(dòng)RabbitMQ服務(wù)

[root@tiaoban ~]# systemctl start rabbitmq-server
[root@tiaoban ~]# systemctl enable rabbitmq-server
Created symlink /etc/systemd/system/multi-user.target.wants/rabbitmq-server.service → /usr/lib/systemd/system/rabbitmq-server.service.
[root@tiaoban ~]# systemctl status rabbitmq-server

默認(rèn)情況下,rabbitmq沒(méi)有安裝web端的客戶端軟件,需要安裝才可以生效

[root@tiaoban ~]# rabbitmq-plugins enable rabbitmq_management

訪問(wèn)服務(wù)器ip:15672,就可以看到管理界面

圖片圖片

高可用集群部署

高可用集群方案

RabbitMQ的集群主要有兩種模式:普通集群模式和克隆隊(duì)列模式。

普通集群模式:集群中各個(gè)節(jié)點(diǎn)之間只會(huì)相互同步元數(shù)據(jù),消息數(shù)據(jù)不會(huì)被同步。不論是生產(chǎn)者還是消費(fèi)者,假如連接到的節(jié)點(diǎn)上沒(méi)有存儲(chǔ)隊(duì)列數(shù)據(jù),那么內(nèi)部會(huì)將其轉(zhuǎn)發(fā)到存儲(chǔ)隊(duì)列數(shù)據(jù)的節(jié)點(diǎn)上進(jìn)行存儲(chǔ)。雖然說(shuō)內(nèi)部可以實(shí)現(xiàn)轉(zhuǎn)發(fā),但是因?yàn)橄H僅只是存儲(chǔ)在一個(gè)節(jié)點(diǎn),所以這種普通集群模式并沒(méi)有達(dá)到高可用的目的。

克隆隊(duì)列模式:集群中各個(gè)節(jié)點(diǎn)之間不僅僅會(huì)同步元數(shù)據(jù),消息內(nèi)容也會(huì)在鏡像節(jié)點(diǎn)間同步,可用性更高。這種方案提升了可用性的同時(shí),因?yàn)橥綌?shù)據(jù)之間也會(huì)帶來(lái)網(wǎng)絡(luò)開(kāi)銷從而在一定程度上會(huì)影響到性能。

程序通過(guò)訪問(wèn) KeepAlived 提供的 VIP(虛擬 ip)指定到其中一個(gè)Haproxy,然后 Haproxy 將訪問(wèn)請(qǐng)求代理到其管理的多個(gè) Rabbitmq Server 中的一個(gè),從而實(shí)現(xiàn)了高可用、負(fù)載均衡的功能。

圖片圖片

集群角色規(guī)劃

通過(guò)hk1和hk2兩臺(tái)服務(wù),部署HA-proxy和KeepAlived實(shí)現(xiàn)高可用和負(fù)載均衡服務(wù),通過(guò)VIP 192.168.10.90對(duì)外提供服務(wù),所有請(qǐng)求反向代理至mq1、mq2、mq3組成的RabbitMQ集群。

服務(wù)器IP

hostname

節(jié)點(diǎn)服務(wù)

192.168.10.90


vip

192.168.10.91

hk1

HA proxy、KeepAlived

192.168.10.92

hk2

HA proxy、KeepAlived

192.168.10.93

mq1

RabbitMQ

192.168.10.94

mq2

RabbitMQ

192.168.10.95

mq3

RabbitMQ

Rabbit MQ集群部署

MQ集群節(jié)點(diǎn)修改hosts解析和主機(jī)名(每臺(tái)mq節(jié)點(diǎn)執(zhí)行)

[root@mq1 ~]# cat /etc/hosts
192.168.10.93  mq1
192.168.10.94  mq2
192.168.10.95  mq3

部署Erlang和RabbitMQ服務(wù)(每臺(tái)mq節(jié)點(diǎn)執(zhí)行)

參考上文單節(jié)點(diǎn)部署流程,此處不再贅述。

啟動(dòng)RabbitMQ服務(wù)(每臺(tái)mq節(jié)點(diǎn)執(zhí)行)

[root@mq1 ~]# systemctl enable rabbitmq-server --now

RabbitMQ集群節(jié)點(diǎn)需要共享一個(gè)Erlang cookie,默認(rèn)存儲(chǔ)在/var/lib/rabbitmq/.erlang.cookie。需要在所有節(jié)點(diǎn)上保持該文件一致:(mq1節(jié)點(diǎn)執(zhí)行)

[root@mq1 ~]# ls /var/lib/rabbitmq/.erlang.cookie
/var/lib/rabbitmq/.erlang.cookie
[root@mq1 ~]# scp /var/lib/rabbitmq/.erlang.cookie mq2:/var/lib/rabbitmq/                                                                                                                      100%   20     9.4KB/s   00:00
[root@mq1 ~]# scp /var/lib/rabbitmq/.erlang.cookie mq3:/var/lib/rabbitmq/
# 確保復(fù)制后的文件權(quán)限為400:
[root@mq2 ~]# chmod 400 /var/lib/rabbitmq/.erlang.cookie

在節(jié)點(diǎn)2和節(jié)點(diǎn)3上執(zhí)行以下命令,將它們加入到節(jié)點(diǎn)1的集群中(mq2和3節(jié)點(diǎn)執(zhí)行):

[root@mq2 ~]# systemctl restart rabbitmq-server
[root@mq2 ~]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@mq2 ...
[root@mq2 ~]# rabbitmqctl join_cluster rabbit@mq1
Clustering node rabbit@mq2 with rabbit@mq1
[root@mq2 ~]# rabbitmqctl start_app
Starting node rabbit@mq2 ...

在任何一個(gè)節(jié)點(diǎn)上查看集群狀態(tài)

[root@mq3 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@mq3 ...
Basics

Cluster name: rabbit@mq3
Total CPU cores available cluster-wide: 12

Disk Nodes

rabbit@mq1
rabbit@mq2
rabbit@mq3

Running Nodes

rabbit@mq1
rabbit@mq2
rabbit@mq3

Versions

rabbit@mq3: RabbitMQ 4.0.1 on Erlang 26.2.5.3
rabbit@mq1: RabbitMQ 4.0.1 on Erlang 26.2.5.3
rabbit@mq2: RabbitMQ 4.0.1 on Erlang 26.2.5.3

CPU Cores

Node: rabbit@mq3, available CPU cores: 4
Node: rabbit@mq1, available CPU cores: 4
Node: rabbit@mq2, available CPU cores: 4

Maintenance status

Node: rabbit@mq3, status: not under maintenance
Node: rabbit@mq1, status: not under maintenance
Node: rabbit@mq2, status: not under maintenance

安裝web端插件并設(shè)置賬戶密碼

# 所有mq節(jié)點(diǎn)執(zhí)行
[root@mq1 ~]# rabbitmq-plugins enable rabbitmq_management
# 其中一個(gè)節(jié)點(diǎn)執(zhí)行
[root@mq1 ~]# rabbitmqctl add_user admin 123.com
Adding user "admin" ...
Done. Dont forget to grant the user permissions to some virtual hosts! See 'rabbitmqctl help set_permissions' to learn more.
[root@mq1 ~]# rabbitmqctl set_user_tags admin administrator
Setting tags for user "admin" to [administrator] ...
[root@mq1 ~]# rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
Setting permissions for user "admin" in vhost "/" ...

瀏覽器訪問(wèn)mq1:15672,查看UI信息

圖片圖片

此時(shí),集群搭建完畢,但是默認(rèn)采用的模式“普通模式”,只會(huì)相互同步元數(shù)據(jù),消息數(shù)據(jù)不會(huì)被同步,如果某一個(gè)節(jié)點(diǎn)宕機(jī),則會(huì)導(dǎo)致該節(jié)點(diǎn)上的消息數(shù)據(jù)不可用。

創(chuàng)建克隆隊(duì)列策略

在之前的mq中,我們可以將所有隊(duì)列設(shè)置為鏡像隊(duì)列,即隊(duì)列會(huì)被復(fù)制到各個(gè)節(jié)點(diǎn),各個(gè)節(jié)點(diǎn)元數(shù)據(jù)和消息內(nèi)容保持一致。從 RabbitMQ 3.8 開(kāi)始,官方不推薦使用經(jīng)典的鏡像隊(duì)列,而是推薦使用 隊(duì)列克?。≦uorum Queues) 來(lái)代替鏡像隊(duì)列。Quorum Queues 提供了更穩(wěn)定的高可用性,尤其是在節(jié)點(diǎn)故障和網(wǎng)絡(luò)分區(qū)的情況下。

  1. name:策略名,可自定義
  2. pattern:隊(duì)列的匹配模式(正則表達(dá)式)
  • "^" 可以使用正則表達(dá)式,比如"^queue_" 表示對(duì)隊(duì)列名稱以“queue_”開(kāi)頭的所有 隊(duì)列進(jìn)行鏡像,而"^"表示匹配所有的隊(duì)列
  1. definition:鏡像定義,**x-queue-type: quorum**:指定隊(duì)列類型為 Quorum Queue。
  • quorum.initial-group-size:指定 Quorum Queue 初始副本數(shù)量(通常與集群節(jié)點(diǎn)數(shù)量相匹配)
  • max-length:設(shè)置隊(duì)列的最大長(zhǎng)度,以限制存儲(chǔ)的消息數(shù)量。當(dāng)隊(duì)列中的消息數(shù)超過(guò)此限制時(shí),RabbitMQ 會(huì)丟棄最早的消息。
  • delivery-limit:設(shè)置消息在投遞失敗后的最大重試次數(shù)。達(dá)到這個(gè)次數(shù)后,消息會(huì)被轉(zhuǎn)移到死信隊(duì)列(DLX)。
  • message-ttl:消息在隊(duì)列中的生存時(shí)間,單位為毫秒。
  1. priority:可選參數(shù),policy的優(yōu)先級(jí)。

圖片圖片

HaProxy部署

以下操作在hk1和hk2機(jī)器執(zhí)行

安裝haproxy

[root@hk1 ~]# dnf -y install haproxy

修改配置文件

[root@hk1 ~]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
[root@hk1 ~]# vim /etc/haproxy/haproxy.cfg
# 開(kāi)啟管理員監(jiān)控頁(yè)面
listen admin_stats
    bind    *:8080    #監(jiān)聽(tīng)的ip端口號(hào)
    stats   enable
    stats   refresh 30s   #統(tǒng)計(jì)頁(yè)面自動(dòng)刷新時(shí)間
    stats   uri /admin    #訪問(wèn)的uri   ip:8080/admin
    stats   realm haproxy
    stats   auth admin:admin  #認(rèn)證用戶名和密碼
    stats   hide-version   #隱藏HAProxy的版本號(hào)
    stats   admin if TRUE   #管理界面,如果認(rèn)證成功了,可通過(guò)webui管理節(jié)點(diǎn)                       
# 配置前端監(jiān)聽(tīng)
frontend main
    bind *:5672 # 監(jiān)聽(tīng)地址
    default_backend  rabbitmq # 匹配后端服務(wù)
# 配置后端代理
backend rabbitmq # 后端服務(wù)名稱
    server  rabbitmq1 192.168.10.93:5672 check
    server  rabbitmq2 192.168.10.94:5672 check
    server  rabbitmq3 192.168.10.95:5672 check

啟動(dòng)服務(wù)

[root@hk1 ~]# systemctl start haproxy.service 
[root@hk1 ~]# systemctl enable haproxy.service 
Created symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.
[root@hk1 ~]# ss -tunlp | grep haproxy
udp   UNCONN 0      0            0.0.0.0:59334      0.0.0.0:*    users:(("haproxy",pid=2489,fd=6),("haproxy",pid=2487,fd=6))
tcp   LISTEN 0      2048         0.0.0.0:5672       0.0.0.0:*    users:(("haproxy",pid=2489,fd=7))                          
tcp   LISTEN 0      2048         0.0.0.0:8080       0.0.0.0:*    users:(("haproxy",pid=2489,fd=5))

訪問(wèn)haproxy管理員頁(yè)面驗(yàn)證配置是否生效。

圖片圖片

確認(rèn)無(wú)誤后hk2服務(wù)器同樣的步驟配置。

KeepAlived部署

以下操作在hk1和hk2機(jī)器執(zhí)行,設(shè)備網(wǎng)卡名稱為ens160,VIP為192.168.10.90。

安裝軟件包

[root@hk1 ~]# dnf -y install keepalived

修改配置文件

[root@hk1 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@hk1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL # vrrp協(xié)議路由標(biāo)識(shí)
}

vrrp_instance VI_1 {
    state MASTER # 定義主從類型
    interface ens160 # 網(wǎng)卡名稱
    virtual_router_id 51 # vrrp唯一id號(hào)
    priority 100 # 優(yōu)先級(jí)主大于備
    advert_int 1 # 心跳檢測(cè)時(shí)間間隔
    authentication { # 認(rèn)證類型和密碼
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress { # vip配置
        192.168.10.90/24
    }
}

啟動(dòng)服務(wù)

[root@hk1 ~]# systemctl start keepalived.service 
[root@hk1 ~]# systemctl enable keepalived.service 
[root@hk1 ~]# ip a 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:2a:b6:b3 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.10.91/24 brd 192.168.10.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 192.168.10.90/24 scope global secondary ens160
       valid_lft forever preferred_lft forever

此時(shí)可以看到vip 192.168.10.90綁定到了hk1服務(wù)器ens160網(wǎng)卡上。

同樣的操作配置hk2服務(wù)器,配置文件如下

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state BACKUP # 主備類型
    interface ens160 
    virtual_router_id 51
    priority 99 # 優(yōu)先級(jí)低于主
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.90/24
    }
}

高可用測(cè)試

接下來(lái)停止hk1服務(wù)器,模擬異常故障,查看hk2服務(wù)器,vip已經(jīng)成功飄移過(guò)來(lái)

[root@hk2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:17:68:2a brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.10.92/24 brd 192.168.10.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 192.168.10.90/24 scope global secondary ens160
       valid_lft forever preferred_lft forever

訪問(wèn)vip的8080端口,可正常提供服務(wù)

圖片圖片

web界面使用

進(jìn)入 web 管理界面之后,可以很清晰的看到分了 6 個(gè)菜單目錄,分別是:Overview、Connections、Channels、Exchanges、Queues、Admin。

  • Overview:總覽概述,主要介紹 rabbitmq 一些基礎(chǔ)匯總等信息

圖片圖片

  • Connections:連接池管理,主要介紹客戶端連接等信息

圖片圖片

  • Channels:信道管理,主要介紹信道連接等信息

圖片圖片

點(diǎn)擊具體某個(gè)具體的信道,可以看到對(duì)應(yīng)的消費(fèi)隊(duì)列等信息。

圖片圖片

  • Exchanges:交換器管理,主要介紹交換器等信息

圖片圖片

  • Queues:隊(duì)列管理,主要介紹隊(duì)列等信息

圖片圖片

  • Admin:系統(tǒng)管理,主要介紹用戶、虛擬主機(jī)、權(quán)限等信息

圖片圖片

下面,我們重點(diǎn)介紹一些如何通過(guò) web 頁(yè)面來(lái)操作 rabbitMQ!

交換器管理

點(diǎn)擊進(jìn)入 Exchanges 菜單,最下面有一個(gè)Add a new exchange標(biāo)簽。點(diǎn)擊Add a new exchange,會(huì)展示如下信息!

圖片圖片

  • Name:交換器名稱
  • Type:交換器類型
  • Durability:是否持久化,Durable:持久化,Transient:不持久化
  • Auto delete:是否自動(dòng)刪除,當(dāng)最后一個(gè)綁定(隊(duì)列或者exchange)被unbind之后,該exchange 自動(dòng)被刪除
  • Internal:是否是內(nèi)部專用exchange,是的話,就意味著我們不能往該exchange里面發(fā)消息
  • Arguments:參數(shù),是AMQP協(xié)議留給AMQP實(shí)現(xiàn)做擴(kuò)展使用的

我們先新建一個(gè)名稱為test.exchange,類型為direct的交換器,結(jié)果如下。

圖片圖片

等會(huì)用于跟隊(duì)列關(guān)聯(lián)!

隊(duì)列管理

點(diǎn)擊進(jìn)入 Queues 菜單,最下面也有一個(gè)Add a new queue標(biāo)簽。

點(diǎn)擊標(biāo)簽,即可進(jìn)入添加隊(duì)列操作界面!

圖片圖片

  • Name:隊(duì)列名稱
  • Durability:是否持久化,Durable:持久化,Transient:不持久化
  • Auto delete:是否自動(dòng)刪除,是的話,當(dāng)隊(duì)列內(nèi)容為空時(shí),會(huì)自動(dòng)刪除隊(duì)列
  • Arguments:參數(shù),是AMQP協(xié)議留給AMQP實(shí)現(xiàn)做擴(kuò)展使用的

同樣的,新建一個(gè)名稱為test_queue的消息隊(duì)列,結(jié)果如下。

圖片圖片

隊(duì)列新建好了之后,繼續(xù)來(lái)建立綁定關(guān)系!

綁定管理

建立綁定關(guān)系,既可以從隊(duì)列進(jìn)入也可以從交換器進(jìn)入。

如果是從交換器進(jìn)入,那么被關(guān)聯(lián)的對(duì)象就是隊(duì)列。

圖片圖片

如果是從隊(duì)列進(jìn)入,那么被關(guān)聯(lián)的對(duì)象就是交換器。

圖片圖片

我們選擇從隊(duì)列入手,被綁定的交換器是test.exchange。建立完成之后,在交換器那邊也可以看到對(duì)應(yīng)的綁定關(guān)系。

圖片圖片

發(fā)送消息

最后,我們從交換器入手,選擇對(duì)應(yīng)的交換器,點(diǎn)擊Publish message標(biāo)簽,填寫對(duì)應(yīng)的路由鍵 key,發(fā)送一下數(shù)據(jù),查看數(shù)據(jù)是否發(fā)送到對(duì)應(yīng)的隊(duì)列中。

圖片圖片

然后點(diǎn)擊進(jìn)入 Queues 菜單,查詢消息隊(duì)列基本情況。其中Ready表示待消費(fèi)的消息數(shù),total表示總消息數(shù)。

圖片圖片

接收消息

然后選擇hello-mq消息隊(duì)列,點(diǎn)擊Get messages標(biāo)簽,獲取隊(duì)列中的消息。結(jié)果如下,可以很清晰的看到,消息寫入到隊(duì)列!

圖片圖片

rabbitmqctl命令

服務(wù)管理

rabbitmqctl stop [{pid_file}]
# 表示stop 在RabbitMQ服務(wù)器上運(yùn)行的一個(gè)Erlang 節(jié)點(diǎn),可以指定某一個(gè) *pid_file*,表示會(huì)等待這個(gè)指定的程序結(jié)束

rabbitmqctl shutdown
# 表示終止RabbitMQ 服務(wù)器上的Erlang進(jìn)程,如果終止失敗,會(huì)返回非零數(shù)字

rabbitmqctl stop_app
# 表示終止RabbitMQ的應(yīng)用,但是Erlang節(jié)點(diǎn)還在運(yùn)行。該命令典型的運(yùn)行在一些需要RabbitMQ應(yīng)用被停止的管理行為之前,例如 reset

rabbitmqctl start_app
# 表示啟動(dòng)RabbitMQ的應(yīng)用。該命令典型的運(yùn)行在一些需要RabbitMQ應(yīng)用被停止的管理行為之后,例如 reset

rabbitmqctl wait {pid_file}
# 表示等待RabbitMQ應(yīng)用啟動(dòng)。該命令會(huì)等待指定的pid file被創(chuàng)建,也就是啟動(dòng)的進(jìn)程對(duì)應(yīng)的pid保存在這個(gè)文件中,然后RabbitMQ應(yīng)用在這個(gè)進(jìn)程中啟動(dòng)。如果該進(jìn)程終止,沒(méi)有啟動(dòng)RabbitMQ應(yīng)用,就會(huì)返回錯(cuò)誤。
# 合適的pid file是有rabbitmq-server 腳本創(chuàng)建的,默認(rèn)保存在 Mnesia 目錄下,可以通過(guò)修改 RABBITMQ_PID_FILE 環(huán)境變量來(lái)修改
# 例如 rabbitmqctl wait /var/run/rabbitmq/pid

rabbitmqctl reset
# 表示設(shè)置RabbitMQ節(jié)點(diǎn)為原始狀態(tài)。會(huì)從該節(jié)點(diǎn)所屬的cluster中都刪除,從管理數(shù)據(jù)庫(kù)中刪除所有數(shù)據(jù),例如配置的用戶和vhost,還會(huì)刪除所有的持久消息。
# 要想reset和force_reset操作執(zhí)行成功,RabbitMQ應(yīng)用需要處于停止?fàn)顟B(tài),即執(zhí)行過(guò) stop_app

rabbitmqctl force_reset
# 表示強(qiáng)制性地設(shè)置RabbitMQ節(jié)點(diǎn)為原始狀態(tài)。它和reset的區(qū)別在于,可以忽略目前管理數(shù)據(jù)庫(kù)的狀態(tài)和cluster的配置,無(wú)條件的reset。
# 該方法的使用,應(yīng)當(dāng)用在當(dāng)數(shù)據(jù)庫(kù)或者cluster配置損壞的情況下作為最后的方法。

rabbitmqctl rotate_logs {suffix}
# 表示將日志文件的內(nèi)容追加到新的日志文件中去,這個(gè)新的日志文件的文件名是原有的日志文件名加上命令中的 suffix,并且恢復(fù)日志到原來(lái)位置的新文件中。
# 注意:如果新文件原先不存在,那么會(huì)新建一個(gè);如果suffix為空,那么不會(huì)發(fā)生日志轉(zhuǎn)移,只是重新打開(kāi)了一次日志文件而已。

rabbitmqctl hipe_compile {directory}
# 表示在指定的目錄下執(zhí)行HiPE編譯和緩存結(jié)果文件 .beam-files
# 如果需要父目錄會(huì)被創(chuàng)建。并且在編譯之前,該目錄下的所有 .beam-files會(huì)被自動(dòng)刪除。
# 使用預(yù)編譯的文件,你應(yīng)該設(shè)置 RABBITMQ_SERVER_CODE_PATH 環(huán)境變量為 hipe_compile 調(diào)用指定的目錄。

集群管理

rabbitmqctl join_cluster {clusternode} [--ram]
# 表示結(jié)合到指定的集群,如果有參數(shù) --ram 表示作為RAM節(jié)點(diǎn)結(jié)合到該集群中。
# 該命令指令本節(jié)結(jié)合到指定的集群中,在結(jié)合之前,該節(jié)點(diǎn)需要reset,所以在使用時(shí),需要格外注意。為了成功運(yùn)行本命令,必須要停止RabbitMQ應(yīng)用,例如 stop_app
# 集群節(jié)點(diǎn)有兩種類型: disc 和 RAM。disc類型,復(fù)制數(shù)據(jù)在RAM和disc上,在節(jié)點(diǎn)失效的情況下,提供了冗余保證,也能從一些全局事件中恢復(fù),例如所有節(jié)點(diǎn)失效。RAM類型,只復(fù)制數(shù)據(jù)在RAM上,主要表現(xiàn)在伸縮性上,特別是在管理資源(例如:增加刪除隊(duì)列,交換器,或者綁定)上表現(xiàn)突出。
# 一個(gè)集群必須至少含有一個(gè)disc節(jié)點(diǎn),當(dāng)通常都多余一個(gè)。通過(guò)該命令時(shí),默認(rèn)是設(shè)置為disc節(jié)點(diǎn),如果需創(chuàng)建RAM節(jié)點(diǎn),需要指定參數(shù) --ram
# 執(zhí)行此命令之后,在該節(jié)點(diǎn)上啟動(dòng)的RabbitMQ應(yīng)用,在該節(jié)點(diǎn)掛掉之后,會(huì)嘗試連接節(jié)點(diǎn)所在集群中的其他節(jié)點(diǎn)。
# 為了離開(kāi)集群,可以 reset 該節(jié)點(diǎn),也可以使用命令 forget_cluster_node 遠(yuǎn)程刪除節(jié)點(diǎn)

rabbitmqctl cluster_status
# 表示顯示通過(guò)節(jié)點(diǎn)類型聚合在一起的集群中的所有節(jié)點(diǎn),還有目前正在運(yùn)行的節(jié)點(diǎn)

rabbitmqctl change_cluster_node_type {disc|ram}
# 表示改變集群節(jié)點(diǎn)的類型。該操作的正確執(zhí)行,必定會(huì)停止該節(jié)點(diǎn)。并且在調(diào)整一個(gè)node為ram類型時(shí),該節(jié)點(diǎn)不能為該集群的唯一node

rabbitmqctl forget_cluster_node [--offline]
# 表示遠(yuǎn)程移除一個(gè)集群節(jié)點(diǎn)。要?jiǎng)h除的節(jié)點(diǎn)必須脫機(jī),如果沒(méi)有脫機(jī),需要使用 --offline 參數(shù)。當(dāng)使用 --offline 參數(shù)時(shí),rabbitmqctl不會(huì)去連接節(jié)點(diǎn),而是暫時(shí)變成節(jié)點(diǎn),以便進(jìn)行變更。這在節(jié)點(diǎn)不能正常啟動(dòng)時(shí)非常有用。在這種情況下,節(jié)點(diǎn)會(huì)成為集群元數(shù)據(jù)的規(guī)范來(lái)源(例如哪些隊(duì)列存在)。因此如果可以的話,應(yīng)該使用此命令在最新的節(jié)點(diǎn)上關(guān)閉。
# --offline 參數(shù)使節(jié)點(diǎn)從脫機(jī)節(jié)點(diǎn)上移除。使用場(chǎng)景主要是在所有節(jié)點(diǎn)脫機(jī),且最后一個(gè)節(jié)點(diǎn)無(wú)法聯(lián)機(jī)時(shí),從而防止整個(gè)集群?jiǎn)?dòng)。在其他情況不應(yīng)該使用,否則會(huì)導(dǎo)致不一致。
# 例如 rabbitmqctl -n hare@mcnulty forget_cluster_node  rabbit@stringer
# 上述命令將從節(jié)點(diǎn) hare@mcnulty 中移除節(jié)點(diǎn) rabbit@stringer

rabbitmqctl rename_cluster_node {oldnode1} {newnode1} [oldnode2] [newnode2...]
# 表示在本地?cái)?shù)據(jù)庫(kù)上修改集群節(jié)點(diǎn)名稱。該命令讓rabbitmqctl暫時(shí)成為一個(gè)節(jié)點(diǎn)來(lái)做出做變更。因此,本地的待修改的集群節(jié)點(diǎn)一定要完全停止,其他節(jié)點(diǎn)可以是online或者offline

rabbitmqctl update_cluster_nodes {clusternode}
# 表示指示已經(jīng)集群的節(jié)點(diǎn)在喚醒時(shí)聯(lián)系 {clusternode} 進(jìn)行集群。這與 join_cluster 命令不同,因?yàn)樗患尤肴魏渭海菣z查節(jié)點(diǎn)是否已經(jīng)在具有 {clusternode} 的集群中。
# 該命令的需求,是在當(dāng)一個(gè)節(jié)點(diǎn)offline時(shí),修改了集群節(jié)點(diǎn)的情形下。例如:節(jié)點(diǎn)A和B聚群,節(jié)點(diǎn)A offline了,節(jié)點(diǎn)C和B集群,并且B節(jié)點(diǎn)離開(kāi)了該集群,那么當(dāng)節(jié)點(diǎn)A起來(lái)的時(shí)候,A會(huì)嘗試連接B,但是由于B節(jié)點(diǎn)已經(jīng)不在該集群中,所以會(huì)失敗。
# 通過(guò) update_cluster_nodes -n A C 將會(huì)解決上述問(wèn)題。

rabbitmqctl force_boot
# 表示強(qiáng)制確保節(jié)點(diǎn)啟動(dòng),即使該節(jié)點(diǎn)并不是最后down的。
# 一般情況下,當(dāng)你同時(shí)shut down了RabbitMQ集群時(shí),第一個(gè)重啟的節(jié)點(diǎn)應(yīng)該是最后一個(gè)down掉的,因?yàn)樗赡芤呀?jīng)看到了其他節(jié)點(diǎn)發(fā)生的事情。但是有時(shí)候這并不可能:例如當(dāng)整個(gè)集群lose power,那么該集群的所有節(jié)點(diǎn)會(huì)認(rèn)為他們不是最后一個(gè)關(guān)閉的。
# 如果最后down的節(jié)點(diǎn)永久的lost,那么應(yīng)該優(yōu)先使用 rabbitmqctl forget_cluster_node --offline ,因?yàn)檫@將確保在丟失節(jié)點(diǎn)上的鏡像隊(duì)列得到優(yōu)先處理。

rabbitmqctl sync_queue [-p vhost] {queue}
# {queue} 表示待同步的隊(duì)列名稱
# 指引含有異步slaves的鏡像隊(duì)列去同步自身。當(dāng)隊(duì)列執(zhí)行同步化時(shí),其將會(huì)被鎖定(指所有publishers發(fā)送出去的和consumers獲取到的隊(duì)列都會(huì)被鎖定)。為了成功執(zhí)行此命令,隊(duì)列必須要被鏡像。
# 注意,排除消息的異步隊(duì)列將最終被同步化,此命令主要運(yùn)用于未被排除完全消息的隊(duì)列。

rabbitmqctl cancel_sync_queue [-p vhost] {queue}
# 指引一個(gè)正在同步的鏡像隊(duì)列停止此操作。

rabbitmqctl purge_queue [-p vhost] {queue}
# {queue} 表示待清空消息的隊(duì)列名稱
# 該命令表示清空隊(duì)列(即刪除隊(duì)列中的所有消息)

rabbitmqctl set_cluster_name {name}
# 設(shè)置集群的名稱。在連接中,集群的名稱被聲明在客戶端上,被同盟和插件用來(lái)記錄一個(gè)消息所在的位置。集群的名稱默認(rèn)來(lái)自于集群中第一個(gè)節(jié)點(diǎn)的主機(jī)名,但是可以被修改。

用戶管理

rabbitmq有一個(gè)默認(rèn)的賬號(hào)密碼guest,但該情況僅限于本機(jī)localhost進(jìn)行訪問(wèn),所以需要添加一個(gè)遠(yuǎn)程登錄的用戶

用戶管理命令

# 添加用戶
rabbitmqctl add_user 用戶名 密碼

# 設(shè)置用戶角色,分配操作權(quán)限
rabbitmqctl set_user_tags 用戶名 角色

# 為用戶添加資源權(quán)限(授予訪問(wèn)虛擬機(jī)根節(jié)點(diǎn)的所有權(quán)限)
rabbitmqctl set_permissions -p / 用戶名 ".*" ".*" ".*"

# 修改密碼
rabbitmqctl change_ password 用戶名 新密碼

# 刪除用戶
rabbitmqctl delete_user 用戶名

# 查看用戶清單
rabbitmqctl list_users

角色種類:

  • administrator:可以登錄控制臺(tái)、查看所有信息、并對(duì)rabbitmq進(jìn)行管理
  • monToring:監(jiān)控者;登錄控制臺(tái),查看所有信息
  • policymaker:策略制定者;登錄控制臺(tái)指定策略
  • managment:普通管理員;登錄控制

這里創(chuàng)建用戶admin,密碼123.com,設(shè)置adminstator角色,賦予所有權(quán)限

[root@tiaoban ~]# rabbitmqctl add_user admin 123.com
Adding user "admin" ...
Done. Dont forget to grant the user permissions to some virtual hosts! See 'rabbitmqctl help set_permissions' to learn more.
[root@tiaoban ~]# rabbitmqctl set_user_tags admin administrator
Setting tags for user "admin" to [administrator] ...
[root@tiaoban ~]# rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
Setting permissions for user "admin" in vhost "/" ...

訪問(wèn)控制

rabbitmqctl add_vhost {vhost}
# {vhost} 表示待創(chuàng)建的虛擬主機(jī)項(xiàng)的名稱

rabbitmqctl delete_vhost {vhost}
# 表示刪除一個(gè)vhost。刪除一個(gè)vhost將會(huì)刪除該vhost的所有exchange、queue、binding、用戶權(quán)限、參數(shù)和策略。

rabbitmqctl list_vhosts {vhostinfoitem ...}
# 表示列出所有的vhost。其中 {vhostinfoitem} 表示要展示的vhost的字段信息,展示的結(jié)果將按照 {vhostinfoitem} 指定的字段順序展示。這些字段包括:name(名稱) 和 tracing (是否為此vhost啟動(dòng)跟蹤)。
# 如果沒(méi)有指定具體的字段項(xiàng),那么將展示vhost的名稱。

rabbitmqctl set_permissions [-p vhost] {user} {conf} {write} {read}
# 表示設(shè)置用戶權(quán)限。 {vhost} 表示待授權(quán)用戶訪問(wèn)的vhost名稱,默認(rèn)為 "/"; {user} 表示待授權(quán)反問(wèn)特定vhost的用戶名稱; {conf}表示待授權(quán)用戶的配置權(quán)限,是一個(gè)匹配資源名稱的正則表達(dá)式; {write} 表示待授權(quán)用戶的寫權(quán)限,是一個(gè)匹配資源名稱的正則表達(dá)式; {read}表示待授權(quán)用戶的讀權(quán)限,是一個(gè)資源名稱的正則表達(dá)式。
# rabbitmqctl set_permissions -p myvhost tonyg "^tonyg-.*" ".*" ".*"
# 例如上面例子,表示授權(quán)給用戶 "tonyg" 在vhost為 `myvhost` 下有資源名稱以 "tonyg-" 開(kāi)頭的 配置權(quán)限;所有資源的寫權(quán)限和讀權(quán)限。

rabbitmqctl clear_permissions [-p vhost] {username}
# 表示設(shè)置用戶拒絕訪問(wèn)指定指定的vhost,vhost默認(rèn)值為 "/"

rabbitmqctl list_permissions [-p vhost]
# 表示列出具有權(quán)限訪問(wèn)指定vhost的所有用戶、對(duì)vhost中的資源具有的操作權(quán)限。默認(rèn)vhost為 "/"。
# 注意,空字符串表示沒(méi)有任何權(quán)限。

rabbitmqctl list_user_permissions {username}
# 表示列出指定用戶的權(quán)限vhost,和在該vhost上的資源可操作權(quán)限。

責(zé)任編輯:武曉燕 來(lái)源: 崔亮的博客
相關(guān)推薦

2021-05-29 10:11:00

Kafa數(shù)據(jù)業(yè)務(wù)

2022-05-16 10:49:28

網(wǎng)絡(luò)協(xié)議數(shù)據(jù)

2019-08-23 12:12:49

MQ消息隊(duì)列

2023-12-15 09:45:21

阻塞接口

2022-05-11 11:54:55

Http傳送協(xié)議

2023-07-31 08:18:50

Docker參數(shù)容器

2022-11-11 19:09:13

架構(gòu)

2023-11-06 08:16:19

APM系統(tǒng)運(yùn)維

2022-12-20 07:39:46

2023-11-20 08:18:49

Netty服務(wù)器

2023-12-21 17:11:21

Containerd管理工具命令行

2025-01-08 11:10:46

2024-06-27 10:50:01

2019-06-13 21:31:19

AI

2024-05-22 09:45:49

2021-09-13 22:34:56

區(qū)塊鏈新基建數(shù)字化轉(zhuǎn)型

2023-03-06 21:29:41

mmap技術(shù)操作系統(tǒng)

2020-11-27 09:40:53

Rollup前端代碼

2022-04-08 09:01:14

CSS自定義屬性前端

2022-02-24 07:34:10

SSL協(xié)議加密
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)