精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

開發(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è)庫存系統(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)行用戶注冊時(shí),會(huì)進(jìn)行寫入數(shù)據(jù)庫、發(fā)送郵件、發(fā)送短信操作。同步請求的話,響應(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í)間請求數(shù)暴增,有5000個(gè)請求發(fā)送過來,系統(tǒng)A這時(shí)就會(huì)發(fā)送5000條SQL進(jìn)入MySQL進(jìn)行執(zhí)行,MySQL對(duì)于如此龐大的請求當(dāng)然處理不過來,MySQL就會(huì)崩潰,導(dǎo)致系統(tǒng)癱瘓。如果使用MQ,系統(tǒng)A不再是直接發(fā)送SQL到數(shù)據(jù)庫,而是把數(shù)據(jù)發(fā)送到MQ,MQ短時(shí)間積壓數(shù)據(jù)是可以接受的,然后由消費(fèi)者每次拉取2000條進(jìn)行處理,防止在請求峰值時(shí)期大量的請求直接發(fā)送到MySQL導(dǎo)致系統(tǒng)崩潰。

  • 傳統(tǒng)模式

畫板畫板

  • 消息隊(duì)列模式

畫板畫板

RabbitMQ的特點(diǎn)

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

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

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

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

特性

ActiveMQ

RabbitMQ

Kafka

RocketMQ

所屬社區(qū)/公司

Apache

Mozilla Public License

Apache

Apache/Ali

單機(jī)呑吐量

萬級(jí)

萬級(jí)

幾十萬級(jí)

十萬級(jí)

時(shí)效性

毫秒級(jí)

微秒級(jí)

毫秒級(jí)

毫秒級(jí)

可用性

主從

主從

分布式

分布式

功能特性

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

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

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

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

消息可靠性

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

基本不丟

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

同 Kafka

事務(wù)

支持

不支持

支持

支持

broker端消息過濾

支持

不支持

不支持

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

消息查詢

支持

根據(jù)消息id查詢

不支持

支持Message id或Key查詢

消息回溯

支持

不支持

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

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

路由邏輯


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

根據(jù)topic

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

持久化

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

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

磁盤,大量堆積

磁盤,大量堆積

順序消息

支持

不支持

支持

支持

社區(qū)活躍度





適用場景

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

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

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

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

RabbitMQ原理

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

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

圖片圖片

  • Publisher:消息的生產(chǎn)者,也是一個(gè)向交換器發(fā)布消息的客戶端應(yīng)用程序
  • Exchange:交換器,用來接收生產(chǎn)者發(fā)送的消息并將這些消息路由給服務(wù)器中的隊(duì)列
  • Binding:綁定,用于將消息隊(duì)列和交換器之間建立關(guān)聯(lián)。一個(gè)綁定就是基于路由鍵將交換器和消息隊(duì)列連接起來的路由規(guī)則,所以可以將它理解成一個(gè)由綁定構(gòu)成的路由表。
  • Queue:消息隊(duì)列,用來保存消息直到發(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綁定,作用就是通過路由鍵Key將交換器和隊(duì)列建立綁定關(guān)系。

圖片圖片

就好比類似**用戶表和角色表,中間通過用戶角色表**來將用戶和角色建立關(guān)系,從而實(shí)現(xiàn)關(guān)系綁定,在 RabbitMQ 中,消息生產(chǎn)者不直接跟隊(duì)列建立關(guān)系,而是將消息發(fā)送到交換器之后,由交換器通過已經(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ā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ī)模式,也是最簡單的模式,消息中的路由鍵(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 則是通過一個(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

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

rpm部署

安裝Erlang

RabbitMQ是采用 Erlang語言開發(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安裝過程中需要依賴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沒有安裝web端的客戶端軟件,需要安裝才可以生效

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

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

圖片圖片

高可用集群部署

高可用集群方案

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

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

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

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

圖片圖片

集群角色規(guī)劃

通過hk1和hk2兩臺(tái)服務(wù),部署HA-proxy和KeepAlived實(shí)現(xiàn)高可用和負(fù)載均衡服務(wù),通過VIP 192.168.10.90對(duì)外提供服務(wù),所有請求反向代理至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 "/" ...

瀏覽器訪問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 開始,官方不推薦使用經(jīng)典的鏡像隊(duì)列,而是推薦使用 隊(duì)列克隆(Quorum Queues) 來代替鏡像隊(duì)列。Quorum Queues 提供了更穩(wěn)定的高可用性,尤其是在節(jié)點(diǎn)故障和網(wǎng)絡(luò)分區(qū)的情況下。

  1. name:策略名,可自定義
  2. pattern:隊(duì)列的匹配模式(正則表達(dá)式)
  • "^" 可以使用正則表達(dá)式,比如"^queue_" 表示對(duì)隊(duì)列名稱以“queue_”開頭的所有 隊(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ì)列的最大長度,以限制存儲(chǔ)的消息數(shù)量。當(dāng)隊(duì)列中的消息數(shù)超過此限制時(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
# 開啟管理員監(jiān)控頁面
listen admin_stats
    bind    *:8080    #監(jiān)聽的ip端口號(hào)
    stats   enable
    stats   refresh 30s   #統(tǒng)計(jì)頁面自動(dòng)刷新時(shí)間
    stats   uri /admin    #訪問的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)證成功了,可通過webui管理節(jié)點(diǎn)                       
# 配置前端監(jiān)聽
frontend main
    bind *:5672 # 監(jiān)聽地址
    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))

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

圖片圖片

確認(rèn)無誤后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 # 心跳檢測時(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
    }
}

高可用測試

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

[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

訪問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)介紹一些如何通過 web 頁面來操作 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ù)來建立綁定關(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)程終止,沒有啟動(dòng)RabbitMQ應(yīng)用,就會(huì)返回錯(cuò)誤。
# 合適的pid file是有rabbitmq-server 腳本創(chuàng)建的,默認(rèn)保存在 Mnesia 目錄下,可以通過修改 RABBITMQ_PID_FILE 環(huán)境變量來修改
# 例如 rabbitmqctl wait /var/run/rabbitmq/pid

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

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

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

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è)。通過該命令時(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)。
# 為了離開集群,可以 reset 該節(jié)點(diǎn),也可以使用命令 forget_cluster_node 遠(yuǎn)程刪除節(jié)點(diǎn)

rabbitmqctl cluster_status
# 表示顯示通過節(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ī),如果沒有脫機(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ī)范來源(例如哪些隊(duì)列存在)。因此如果可以的話,應(yīng)該使用此命令在最新的節(jié)點(diǎn)上關(guān)閉。
# --offline 參數(shù)使節(jié)點(diǎn)從脫機(jī)節(jié)點(diǎn)上移除。使用場景主要是在所有節(jié)點(diǎn)脫機(jī),且最后一個(gè)節(jié)點(diǎn)無法聯(lián)機(jī)時(shí),從而防止整個(gè)集群啟動(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ù)庫上修改集群節(jié)點(diǎn)名稱。該命令讓rabbitmqctl暫時(shí)成為一個(gè)節(jié)點(diǎn)來做出做變更。因此,本地的待修改的集群節(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)離開了該集群,那么當(dāng)節(jié)點(diǎn)A起來的時(shí)候,A會(huì)嘗試連接B,但是由于B節(jié)點(diǎn)已經(jīng)不在該集群中,所以會(huì)失敗。
# 通過 update_cluster_nodes -n A C 將會(huì)解決上述問題。

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è)置集群的名稱。在連接中,集群的名稱被聲明在客戶端上,被同盟和插件用來記錄一個(gè)消息所在的位置。集群的名稱默認(rèn)來自于集群中第一個(gè)節(jié)點(diǎn)的主機(jī)名,但是可以被修改。

用戶管理

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

用戶管理命令

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

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

# 為用戶添加資源權(quá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 "/" ...

訪問控制

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)跟蹤)。
# 如果沒有指定具體的字段項(xiàng),那么將展示vhost的名稱。

rabbitmqctl set_permissions [-p vhost] {user} {conf} {write} {read}
# 表示設(shè)置用戶權(quán)限。 {vhost} 表示待授權(quán)用戶訪問的vhost名稱,默認(rèn)為 "/"; {user} 表示待授權(quá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-" 開頭的 配置權(quán)限;所有資源的寫權(quán)限和讀權(quán)限。

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

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

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

責(zé)任編輯:武曉燕 來源: 崔亮的博客
相關(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-11-20 08:18:49

Netty服務(wù)器

2022-12-20 07:39:46

2023-12-21 17:11:21

Containerd管理工具命令行

2023-07-31 08:18:50

Docker參數(shù)容器

2023-11-06 08:16:19

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

2022-11-11 19:09:13

架構(gòu)

2024-06-27 10:50:01

2025-01-08 11:10:46

2023-10-27 08:15:45

2023-11-08 08:15:48

服務(wù)監(jiān)控Zipkin

2022-02-24 07:34:10

SSL協(xié)議加密

2020-11-27 09:40:53

Rollup前端代碼

2022-04-08 09:01:14

CSS自定義屬性前端

2023-03-06 21:29:41

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

2021-09-13 22:34:56

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

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

亚洲免费福利| 深夜福利影院在线观看| 中国色在线日|韩| 久久网这里都是精品| 国产999精品久久久| 毛片aaaaaa| 国产成人久久精品一区二区三区| 亚洲一区在线视频| 国产欧美一区二区三区不卡高清| 国产午夜免费福利| 91麻豆国产自产在线观看亚洲| 91超碰这里只有精品国产| 欧美在线观看视频免费| 涩涩视频在线观看免费| 久久成人综合网| 国产做受69高潮| 手机看片福利视频| av成人综合| 亚洲va欧美va人人爽午夜| 日韩电影免费观看在| 国产精品综合在线| 久久精品网址| 久久99精品久久久久久青青91| 精品成人av一区二区三区| 玖玖玖电影综合影院| 亚洲丶国产丶欧美一区二区三区| 亚洲7777| 亚洲av激情无码专区在线播放| 六月丁香综合在线视频| 国产91精品久久久| 麻豆chinese极品少妇| 精品日本12videosex| 欧美va亚洲va国产综合| 日本激情综合网| 蜜桃av在线| 夜色激情一区二区| 亚洲资源视频| 无码国产精品一区二区色情男同| 韩日av一区二区| 国产精品久久久久福利| 日韩免费一级片| 欧美一区不卡| 久久精品电影网站| 亚洲v国产v欧美v久久久久久| 中文字幕视频精品一区二区三区| 色综合欧美在线| 久久99中文字幕| av毛片在线| 亚洲欧洲一区二区在线播放| 日韩精品国内| 天天操天天爱天天干| 国产成人精品亚洲午夜麻豆| 成人a在线观看| 日韩不卡高清视频| 日韩中文字幕av电影| 97色在线视频观看| 国产在线一二区| 欧美福利电影在线观看| 久久亚洲精品小早川怜子66| 国产亚洲精品久久久久久豆腐| 欧洲乱码伦视频免费| 精品香蕉在线观看视频一| 美女搡bbb又爽又猛又黄www| 亚洲一区网址| 精品日韩在线一区| 亚洲少妇一区二区三区| 超碰97久久国产精品牛牛| 日韩视频一区二区三区| 在线观看免费av网址| 激情中国色综合| 欧美精品三级日韩久久| 亚洲欧美视频二区| 视频91a欧美| 337p亚洲精品色噜噜| 动漫av免费观看| abab456成人免费网址| 欧美主播一区二区三区| av网站在线不卡| 综合在线影院| 欧美区一区二区三区| 国产一区二区三区黄| 少妇av在线播放| 国产清纯白嫩初高生在线观看91 | 欧亚精品在线观看| 中文字幕观看视频| 国产成人高清视频| 日本在线免费观看一区| www在线视频| 欧美日韩色婷婷| 在线能看的av网站| 国产精品巨作av| 最新国产成人av网站网址麻豆| 欧美交换国产一区内射| 日韩国产欧美一区二区三区| 99国精产品一二二线| 久久精品色图| 一区二区三区加勒比av| 日日碰狠狠躁久久躁婷婷| 久久久91麻豆精品国产一区| 亚洲欧美国产另类| 欧美爱爱小视频| 日本伊人色综合网| 国产一区二区不卡视频| 九色porny在线| 偷偷要91色婷婷| 亚洲黄色片免费看| 精品国产aⅴ| 国产91ⅴ在线精品免费观看| 国产wwwxxx| 国产精品色呦呦| 成人免费毛片网| 试看120秒一区二区三区| 中文在线资源观看视频网站免费不卡| 国产对白videos麻豆高潮| 蜜桃av噜噜一区| 久热国产精品视频一区二区三区| h片在线播放| 欧美三电影在线| 国产精品三级在线观看无码| 国产精品草草| 成人美女免费网站视频| 国产二区视频在线观看| 午夜激情综合网| 毛片毛片毛片毛片毛| 97久久夜色精品国产| 国产成人一区二区三区| 水中色av综合| 亚洲成人免费视频| 韩国黄色一级片| 欧美一区91| 亚洲aaaaaa| 成码无人av片在线观看网站| 欧美精品精品一区| 很污很黄的网站| 美女在线一区二区| 亚洲精品乱码视频| 成人黄色视屏网站| 一区二区成人av| 日韩一级片中文字幕| 久久在线免费观看| 免费无码av片在线观看| 麻豆成人入口| 欧美重口另类videos人妖| 日韩一级中文字幕| 精品福利在线视频| 黄色性生活一级片| 久久精品二区三区| 日韩一本精品| 欧美v亚洲v综合v国产v仙踪林| 综合136福利视频在线| 特级西西444www高清大视频| 欧美国产1区2区| 中文字幕av不卡在线| 欧美国产一级| 91精品视频免费看| 国产视频精品视频| 亚洲天堂一区二区| 亚洲午夜激情在线| 欧美综合国产精品久久丁香| 性感美女福利视频| 日韩欧美在线视频| 丰满少妇高潮一区二区| 快she精品国产999| 天堂资源在线亚洲视频| 四虎国产精品永久在线国在线| 久久香蕉频线观| 亚洲高清视频在线播放| 午夜精品久久久久久久蜜桃app| 97人妻精品一区二区三区免| 久久福利精品| 在线观看欧美激情| 亚洲专区**| 人妖精品videosex性欧美| 午夜精品一区| 欧美成人女星排行榜| 亚洲欧美在线视频免费| 欧美激情在线一区二区三区| 中文字幕线观看| 在线免费高清一区二区三区| 日韩精品大片| 中文字幕日韩高清在线| 国产91在线播放| 国产日产一区二区| 亚洲精品国精品久久99热| 免费在线不卡av| 亚洲欧美一区二区久久| 熟女丰满老熟女熟妇| 久久99精品国产.久久久久| 拔插拔插海外华人免费| 国产成人ay| 粉嫩av四季av绯色av第一区| av日韩亚洲| 欧美精品手机在线| 91亚洲精品久久久| 国产黄色在线播放| 91精品国产日韩91久久久久久| 伊人国产在线观看| 久久蜜桃一区二区| 中文字幕人妻熟女人妻a片| 久久久青草婷婷精品综合日韩 | 亚洲精品1区2区3区| 97aⅴ精品视频一二三区| 黄大色黄女片18第一次| 亚洲伦伦在线| 午夜啪啪免费视频| 色狼人综合干| 91影视免费在线观看| 成人美女黄网站| 久久69精品久久久久久久电影好 | 51vv免费精品视频一区二区| 日本精品久久久久久久| 美足av综合网| 神马国产精品影院av| 亚欧洲精品视频| 日韩午夜av电影| 最好看的日本字幕mv视频大全 | 国产白丝袜美女久久久久| 91精品蜜臀一区二区三区在线| 欧美国产一区二区在线| 亚洲专区**| 亚洲在线视频福利| 欧美xxxx性| 国产福利成人在线| 日本不良网站在线观看| 欧美极品欧美精品欧美视频 | 日本高清视频精品| av影视在线看| 欧美激情视频一区二区三区不卡| 米奇精品一区二区三区| 中文字幕一区二区精品| 国产最新视频在线| 亚洲美女av网站| 三级在线视频| 日韩第一页在线| 天堂a√中文在线| 亚洲精品国精品久久99热一 | 中文字幕亚洲无线码a| 香蕉视频成人在线| 亚洲国产精品久久久久秋霞不卡 | youjizz.com在线观看| 91tv精品福利国产在线观看| 中文字幕一区二区三区在线乱码| 欧美日韩亚洲在线观看| 日韩精品久久一区| 日韩成人影院| 亚洲图片都市激情| 日韩免费在线| 国产精品美女在线播放| 亚洲91中文字幕无线码三区| 尤物国产精品| 一区二区三区四区日韩| 日本免费黄色小视频 | 北条麻妃在线一区| 日韩制服丝袜先锋影音| 高清一区二区视频| 久久99精品一区二区三区三区| caoporm在线视频| 国产精品一区二区三区99| 女王人厕视频2ⅴk| 成人免费高清在线| 亚洲国产精品无码久久久久高潮| 96av麻豆蜜桃一区二区| 无码人妻精品一区二区三应用大全| 91在线视频观看| 99久久久无码国产精品衣服| 国产精品国产馆在线真实露脸| 一区视频免费观看| 亚洲一区av在线| 亚洲黄色激情视频| 欧美日韩在线三区| 性一交一乱一伧老太| 亚洲国产天堂久久国产91| 欧美婷婷久久五月精品三区| 一区二区在线视频| 国产一二区在线| 久久久久久国产| 亚洲一区二区三区四区| 成人欧美在线视频| 日韩欧美影院| 中文字幕欧美人与畜| 在线日韩电影| 爱情岛论坛vip永久入口| 国产精品一区二区三区网站| 好吊一区二区三区视频| 国产精品成人在线观看| 中文字幕一区二区三区手机版| 日韩欧美一区二区三区| 国产精品久久久久久久久久久久久久久久久久 | 最新国产中文字幕| 日韩视频免费观看高清完整版 | 成人h动漫精品一区二区器材| 久久精品成人一区二区三区蜜臀 | 国产av麻豆mag剧集| 日韩成人午夜电影| 精品国产aⅴ一区二区三区东京热 久久久久99人妻一区二区三区 | 日本韩国一区二区三区视频| 欧美日韩一级黄色片| 欧美日韩国产美| 色窝窝无码一区二区三区成人网站 | 7m第一福利500精品视频| 香蕉久久一区| 久久久www免费人成黑人精品| 国产精品久久久久无码av| 国产视频九色蝌蚪| 国产经典欧美精品| 阿v天堂2014| 五月婷婷综合在线| av一区二区三| 国产亚洲精品综合一区91| 女囚岛在线观看| 成人乱人伦精品视频在线观看| 女优一区二区三区| 欧美亚洲色图视频| 狠狠色2019综合网| 国产极品视频在线观看| 精品国产鲁一鲁一区二区张丽 | 99精品国产99久久久久久白柏| 久草视频手机在线| 在线区一区二视频| 三级理论午夜在线观看| 欧美肥臀大乳一区二区免费视频| 国产毛片精品久久| 日本一区二区三区视频在线播放 | 亚洲乱码日产精品bd| 这里只有久久精品视频| 日韩精品在线免费| 成人女同在线观看| 亚洲综合色激情五月| 羞羞答答成人影院www| 三年中国国语在线播放免费| 久久蜜桃av一区精品变态类天堂| 91在线看视频| 亚洲精品在线三区| 福利在线导航136| 97久久夜色精品国产九色| 91精品国产91久久久久久密臀| 成人性视频欧美一区二区三区| 97久久精品人人做人人爽| 日本亚洲欧美在线| 亚洲电影av在线| 黄页网站大全在线免费观看| 99电影在线观看| 午夜日韩在线| 制服.丝袜.亚洲.中文.综合懂| 亚洲精品国产无天堂网2021| 国产免费高清av| 久久夜色精品国产欧美乱| 国产精品99久久免费| 日本丰满少妇黄大片在线观看| 精久久久久久久久久久| 成人高潮免费视频| 日韩一级二级三级| www在线观看播放免费视频日本| 91亚洲va在线va天堂va国| 亚洲精品极品少妇16p| av地址在线观看| 亚洲尤物在线视频观看| 欧美一级淫片aaaaaa| 韩国精品久久久999| 网友自拍区视频精品| 宅男噜噜噜66国产免费观看| 国产精品全国免费观看高清| 国产在成人精品线拍偷自揄拍| 久久电影一区二区| 高清精品视频| 日韩欧美xxxx| 亚洲视频综合在线| 成人免费观看在线视频| 5566成人精品视频免费| 精品视频免费| 日本一二区免费| 亚洲自拍偷拍九九九| 视频在线不卡| 国产女人精品视频| 欧美色图麻豆| 青青草福利视频| 91精品国产综合久久精品麻豆 | 天堂在线中文| 国产欧美精品一区二区三区-老狼| 欧美在线网站| 精品少妇一区二区三区免费观| 欧美日韩一区二区三区在线看| 亚洲男同gay网站| 欧美人与物videos另类| 精品无人区卡一卡二卡三乱码免费卡| 精品少妇theporn| 国产亚洲美女久久| 亚洲日本一区二区三区在线| 日本三级免费观看| 亚洲日本电影在线| 可以在线观看的黄色| 亚洲在线一区二区| 日韩成人伦理电影在线观看| 五月天丁香激情| 伊人精品在线观看| 国产精品极品国产中出| 伊人影院综合在线| 欧美日韩另类在线| 成人在线免费看片| 日本高清久久一区二区三区|