RabbitMQ 消息中間件

消息中間件

一、簡介

消息中間件也可以稱為消息隊列(MQ:message queue)赂鲤,是指用高效可靠的消息傳遞機制進行與平臺無關的數據交流,并基于數據通信來進行分布式系統(tǒng)的集成。通過提供消息傳遞和消息隊列模型贴铜,可以在分布式環(huán)境下擴展進程的通信。

當下主流的消息中間件有:RabbitMQ、Kafka绍坝、ActiveMQ徘意、RocketMQ等。

二轩褐、作用

1椎咧、消息中間件的主要作用
  • 冗余(存儲)
  • 擴展性
  • 可恢復性
  • 順序保證
  • 緩沖
  • 異步通信
2、消息中間件的兩種模式

①把介、P2P模式
P2P模式包含三個角色:消息隊列(Queue)勤讽、發(fā)送者(Sender)、接收者(Receiver)拗踢。每個消息都被發(fā)送到一個特定的隊列脚牍,接收者從隊列中獲取消息。隊列保留著消息巢墅,直到它們被消費或超時诸狭。

P2P的特點:

  • 每個消息只有一個消費者(Consumer),即一旦被消費君纫,消息就不再在消息隊列中
  • 發(fā)送者和接收者之間在時間上沒有依賴性驯遇,也就是說當發(fā)送者發(fā)送了消息之后,不管接收者有沒有正在運行它不會影響到消息被發(fā)送到隊列
  • 接收者在成功接收消息之后需向隊列應答成功
  • 如果希望發(fā)送的每個消息都會被成功處理的話蓄髓,那么需要P2P模式

②叉庐、Pub/Sub模式

Pub/Sub模式包含三個角色:主題(Topic)、發(fā)布者(Publisher)会喝、訂閱者(Subscriber) 眨唬。多個發(fā)布者將消息發(fā)送到Topic,系統(tǒng)將這些消息傳遞給多個訂閱者好乐。

Pub/Sub的特點:

  • 每個消息可以有多個消費者
  • 發(fā)布者和訂閱者之間有時間上的依賴性匾竿。針對某個主題(Topic)的訂閱者,它必須創(chuàng)建一個訂閱者之后蔚万,才能消費發(fā)布者的消息
  • 為了消費消息岭妖,訂閱者必須保持運行的狀態(tài)
  • 如果希望發(fā)送的消息可以不被做任何處理、或者只被一個消息者處理反璃、或者可以被多個消費者處理的話昵慌,那么可以采用Pub/Sub模型
3、常用中間件介紹與對比

1淮蜈、Kafka

Kafka是LinkedIn開源的分布式發(fā)布-訂閱消息系統(tǒng)斋攀,目前歸屬于Apache頂級項目。Kafka主要特點是基于Pull的模式來處理消息消費梧田,追求高吞吐量淳蔼,一開始的目的就是用于日志收集和傳輸侧蘸。0.8版本開始支持復制,不支持事務鹉梨,對消息的重復讳癌、丟失、錯誤沒有嚴格要求存皂,適合產生大量數據的互聯網服務的數據收集業(yè)務晌坤。

2、RabbitMQ

RabbitMQ是使用Erlang語言開發(fā)的開源消息隊列系統(tǒng)旦袋,基于AMQP協(xié)議來實現骤菠。AMQP的主要特征是面向消息、隊列疤孕、路由(包括點對點和發(fā)布/訂閱)商乎、可靠性、安全胰柑。AMQP協(xié)議更多用在企業(yè)系統(tǒng)內對數據一致性截亦、穩(wěn)定性和可靠性要求很高的場景,對性能和吞吐量的要求還在其次柬讨。

3崩瓤、RocketMQ

RocketMQ是阿里開源的消息中間件,它是純Java開發(fā)踩官,具有高吞吐量却桶、高可用性、適合大規(guī)模分布式系統(tǒng)應用的特點蔗牡。RocketMQ思路起源于Kafka颖系,但并不是Kafka的一個Copy,它對消息的可靠傳輸及事務性做了優(yōu)化辩越,目前在阿里集團被廣泛應用于交易嘁扼、充值、流計算黔攒、消息推送趁啸、日志流式處理、binglog分發(fā)等場景督惰。

RabbitMQ比Kafka可靠不傅,Kafka更適合IO高吞吐的處理,一般應用在大數據日志處理或對實時性(少量延遲)赏胚,可靠性(少量丟數據)要求稍低的場景使用访娶,比如ELK日志收集。

RabbiMQ集群

一觉阅、RabbiMQ簡介

RabbiMQ是?Erang開發(fā)的崖疤,集群?常?便秘车,因為Erlang天?就是??分布式語?,但其本身并不?持負載均衡戳晌,支持高并發(fā)鲫尊,支持可擴展痴柔。支持AJAX沦偎,持久化,用于在分布式系統(tǒng)中存儲轉發(fā)消息咳蔚,在易用性豪嚎、擴展性、高可用性等方面表現不俗谈火。

二侈询、RabbitMQ 特點
  • 可靠性
  • 擴展性
  • 高可用性
  • 多種協(xié)議
  • 多語言客戶端
  • 管理界面
  • 插件機制
三、什么是消息隊列

MQ 全稱為Message Queue, 消息隊列糯耍。是一種應用程序對應用程序的通信方法扔字。應用程序通過讀寫出入隊列的消息(針對應用程序的數據)來通信,而無需專用連接來鏈接它們温技。

消息傳遞指的是程序之間通過在消息中發(fā)送數據進行通信革为,而不是通過直接調用彼此來通信。

RabbiMQ模式

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

(1)單?模式舵鳞。

(2)普通模式(默認的集群模式)震檩。

(3) 鏡像模式(把需要的隊列做成鏡像隊列,存在于多個節(jié)點蜓堕,屬于RabbiMQ的HA?案抛虏,在對業(yè)務可靠性要求較?的場合中?較適?)。要實現鏡像模式套才,需要先搭建?個普通集群模式迂猴,在這個模式的基礎上再配置鏡像模式以實現?可?。

了解集群中的基本概念:

RabbitMQ的集群節(jié)點包括內存節(jié)點背伴、磁盤節(jié)點沸毁。顧名思義內存節(jié)點就是將所有數據放在內存,磁盤節(jié)點將數據放在磁盤挂据。如果在投遞消息時以清,打開了消息的持久化,那么即使是內存節(jié)點崎逃,數據還是安全的放在磁盤掷倔。

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

ConnectionFactory(連接管理器):應用程序與Rabbit之間建立連接的管理器凛虽,程序代碼中使用死遭;
Channel(信道):消息推送使用的通道;
Exchange(交換器):用于接受凯旋、分配消息呀潭;
Queue(隊列):用于存儲生產者的消息;
RoutingKey(路由鍵):用于把生成者的數據分配到交換器上至非;
BindingKey(綁定鍵):用于把交換器的消息綁定到隊列上钠署;
Broker:簡單來說就是消息隊列服務器實體
vhost:虛擬主機,一個broker里可以開設多個vhost荒椭,用作不同用戶的權限分離.
producer:消息生產者谐鼎,就是投遞消息的程序。
consumer:消息消費者趣惠,就是接受消息的程序狸棍。
user:用戶

集群中有兩種節(jié)點

1、內存節(jié)點:只保存狀態(tài)到內存(一個例外的情況是:持久的queue的持久內容將被保存到disk)

2味悄、磁盤節(jié)點:保存狀態(tài)到內存和磁盤草戈。---推薦

內存節(jié)點雖然不寫入磁盤,但是它執(zhí)行比磁盤節(jié)點要好傍菇。集群中猾瘸,只需要一個磁盤節(jié)點來保存狀態(tài) 就足夠了

如果集群中只有內存節(jié)點,那么不能停止它們丢习,否則所有的狀態(tài)牵触,消息等都會丟失。

普通集群模式

環(huán)境:

192.168.94.145  rabbitmq1
192.168.94.146  rabbitmq2
192.168.94.147  rabbitmq3

注意咐低,這?三臺服務器都聯?揽思,另外RabbitMQ集群節(jié)點必須在同??段?,如果是跨?域?见擦,效果會變差钉汗。關閉防火墻和selinux

1、三臺機器配置主機名&配置本地解析

[root@rabbitmq1 ~]# hostnamectl
   Static hostname: rabbitmq1
[root@rabbitmq1 ~]# systemctl stop firewalld && setenforce 0
[root@rabbitmq1 ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.94.145 rabbitmq1
192.168.94.146 rabbitmq2
192.168.94.147 rabbitmq3

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

安裝依賴:
[root@rabbitmq1 ~]# yum install -y epel-release gcc-c++ unixODBC unixODBC-devel openssl-devel ncurses-devel
yum安裝erlang:
[root@rabbitmq1 ~]# wget --content-disposition https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-20.3-1.el7.centos.x86_64.rpm/download.rpm
[root@rabbitmq1 ~]# yum -y install erlang-20.3-1.el7.centos.x86_64.rpm
測試:
[root@rabbitmq1 ~]# 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> ^G
User switch command
 --> q
安裝rabbitmq
[root@rabbitmq1 ~]# wget https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.5/rabbitmq-server-3.7.5-1.el7.noarch.rpm
[root@rabbitmq1 ~]# yum install rabbitmq-server-3.7.5-1.el7.noarch.rpm

3损痰、三個節(jié)點都啟動rabbitmq

[root@rabbitmq1 ~]# systemctl daemon-reload
[root@rabbitmq1 ~]# ls /usr/lib/systemd/system/ | grep rabbit
[root@rabbitmq1 ~]# systemctl start rabbitmq-server
[root@rabbitmq1 ~]# systemctl enable rabbitmq-server
啟動方式二:
[root@rabbitmq1 ~]# /sbin/service rabbitmq-server status  ---查看狀態(tài)
[root@rabbitmq1 ~]# /sbin/service rabbitmq-server start   ---啟動
每臺都操作開啟rabbitmq的web訪問界面:
[root@rabbitmq1 ~]# rabbitmq-plugins enable rabbitmq_management   //開啟15672端口
# rabbitmq-plugins disable rabbitmq_management  //關閉web頁面

4、三個節(jié)點都開啟用戶遠程登錄

[root@rabbitmq1 ~]# cd /etc/rabbitmq/
[root@rabbitmq1 rabbitmq]# cp /usr/share/doc/rabbitmq-server-3.7.5/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
[root@rabbitmq1 rabbitmq]# ls
enabled_plugins  rabbitmq.config
[root@rabbitmq1 rabbitmq]# vim rabbitmq.config
修改如下:
1564157816348.png
三臺機器都操作重啟服務服務:
[root@rabbitmq1 ~]# systemctl restart rabbitmq-server

查看端口

[root@rabbitmq1 ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:4369            0.0.0.0:*               LISTEN      1562/epmd           
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      986/sshd            
tcp        0      0 0.0.0.0:15672           0.0.0.0:*               LISTEN      1380/beam.smp       
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1086/master         
tcp        0      0 0.0.0.0:25672           0.0.0.0:*               LISTEN      1380/beam.smp       
tcp6       0      0 :::4369                 :::*                    LISTEN      1562/epmd           
tcp6       0      0 :::22                   :::*                    LISTEN      986/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      1086/master         
tcp6       0      0 :::5672                 :::*                    LISTEN      1380/beam.smp
4369 -- erlang發(fā)現口
5672 --程序連接端口
15672 -- 管理界面ui端口
25672 -- server間內部通信口

酒来!注意如果是云服務器卢未,記得添加安全組端口放行。

瀏覽器訪問:192.168.94.141:15672
rabbitmq默認用戶:guest
密碼:guest

image.png
1564158056319.png

5、開始部署集群三臺機器都操作

①:首先創(chuàng)建好數據存放目錄和日志存放目錄

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

②:拷?erlang.cookie

Rabbitmq的集群是依附于erlang的集群來?作的,所以必須先構建起erlang的集群景象辽社。Erlang的集群中

各節(jié)點是經由過程?個magic cookie來實現的,這個cookie存放在/var/lib/rabbitmq/.erlang.cookie中伟墙,?件是400的權限。所以必須保證各節(jié)點cookie?致,不然節(jié)點之間就?法通信.

如果執(zhí)行# rabbitmqctl stop_app 這條命令報錯:需要執(zhí)行

#如果執(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等安裝包方式進行安裝的,那么這個文件會在/var/lib/rabbitmq目錄下盹兢。)

[root@rabbitmq1 ~]# cat /var/lib/rabbitmq/.erlang.cookie
NISLCKPCABOQPYIAKLGB
[root@rabbitmq1 ~]# scp /var/lib/rabbitmq/.erlang.cookie rabbitmq2:/var/lib/rabbitmq
[root@rabbitmq1 ~]# scp /var/lib/rabbitmq/.erlang.cookie rabbitmq3:/var/lib/rabbitmq

③邻梆、將mq2守伸、mq3作為內存節(jié)點加?mq1節(jié)點集群中

在mq2绎秒、mq3執(zhí)?如下命令:
[root@rabbitmq2 ~]# systemctl restart rabbitmq-server
[root@rabbitmq2 ~]# rabbitmqctl stop_app  #停止節(jié)點
[root@rabbitmq2 ~]# rabbitmqctl reset   #如果有數據需要重置,沒有則不用
[root@rabbitmq2 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq1  #添加一個內存節(jié)點到磁盤節(jié)點
Clustering node 'rabbit@rabbitmq2' with 'rabbit@rabbitmq1' ...
[root@rabbitmq2 ~]# rabbitmqctl start_app  #啟動節(jié)點
Starting node 'rabbit@rabbitmq2' ...
======================================================================
[root@rabbitmq3 ~]# systemctl restart rabbitmq-server
[root@rabbitmq3 ~]# rabbitmqctl stop_app
Stopping node 'rabbit@rabbitmq3' ...
[root@rabbitmq3 ~]# rabbitmqctl reset
Resetting node 'rabbit@rabbitmq3' ...
[root@rabbitmq3 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq1
Clustering node 'rabbit@rabbitmq3' with 'rabbit@rabbitmq-1' ...
[root@rabbitmq3 ~]# rabbitmqctl start_app
Starting node 'rabbit@rabbitmq3' ...

(1)默認rabbitmq啟動后是磁盤節(jié)點,在 這個cluster命令下,mq2和mq3是內存節(jié)點耕陷,
mq1是磁盤節(jié)點捏题。
(2)如果要使mq2、mq3都是磁盤節(jié)點蛉顽,去掉--ram參數即可。
(3)如果想要更改節(jié)點類型,可以使?命令rabbitmqctl change_cluster_node_type
disc(ram),前提是必須停掉rabbit應?

#如果有需要使用磁盤節(jié)點加入集群
[root@rabbitmq2 ~]# rabbitmqctl join_cluster  rabbit@rabbitmq1
[root@rabbitmq3 ~]# rabbitmqctl join_cluster  rabbit@rabbitmq1

④徘铝、查看集群狀態(tài)

在 RabbitMQ 集群任意節(jié)點上執(zhí)行 rabbitmqctl cluster_status來查看是否集群配置成功。
在mq1磁盤節(jié)點上面查看
[root@rabbitmq2 ~]# rabbitmqctl cluster_status
[root@rabbitmq1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq1 ...
[{nodes,[{disc,[rabbit@rabbitmq1]},{ram,[rabbit@rabbitmq2,rabbit@rabbitmq3]}]},
 {running_nodes,[rabbit@rabbitmq1]},  #集群的名字
每臺機器顯示出三臺節(jié)點惯吕,表示已經添加成功惕它!
(1)默認rabbitmq啟動后是磁盤節(jié)點,在這個cluster命令下废登,mq-2和mq-3是內存節(jié)點淹魄,mq-1是磁盤節(jié)點。
(2)如果要使mq-2堡距、mq-3都是磁盤節(jié)點甲锡,去掉--ram參數即可。
(3)如果想要更改節(jié)點類型羽戒,可以使用命令rabbitmqctl change_cluster_node_type disc(ram),前提是必須停掉

rabbit應用
在RabbitMQ集群集群中缤沦,必須?少有?個磁盤節(jié)點,否則隊列元數據?法寫?到集群中易稠,當磁盤節(jié)點宕掉時缸废,集群將?法寫?新的隊列元數據信息。

⑤缩多、創(chuàng)建用戶

注意:在一臺機器操作呆奕,所有機器將會同步
添加用戶和密碼
[root@rabbitmq1 ~]# rabbitmqctl add_user duan 123
Creating user "duan" ...
...done.
這是為管理員
[root@rabbitmq1 ~]# rabbitmqctl set_user_tags duan administrator
Setting tags for user "duan" to [administrator] ...
...done.
查看用戶
[root@rabbitmq1 ~]# rabbitmqctl list_users
Listing users ...
guest   [administrator]
duan    [administrator]
...done.

此處設置權限時注意'.*'之間需要有空格养晋,三個'.*'分別代表了conf權限,read權限與write權限 
例如:當沒有給duan設置這三個權限前是沒有權限查詢隊列梁钾,在ui界面也看不見
[root@rabbitmq-1 ~]# rabbitmqctl set_permissions -p "/" duan ".*" ".*" ".*"
Setting permissions for user "duan" in vhost "/" ...
...done.

⑥绳泉、登錄rabbitmq web管理控制臺,創(chuàng)建新的隊列

打開瀏覽器輸?192.168.94.141:15672, 輸?默認的Username:guest姆泻,輸?默認的
Password:guest

登錄后出現如圖所示的界?


image.png

根據界?提示創(chuàng)建?條隊列,然后點擊添加

image.png
image.png

在RabbitMQ集群集群中零酪,必須?少有?個磁盤節(jié)點,否則隊列元數據?法寫?到集群中拇勃,當
磁盤節(jié)點宕掉時四苇,集群將?法寫?新的隊列元數據信息。

RabbitMQ鏡像集群配置

上面已經完成RabbitMQ默認集群模式方咆,但并不保證隊列的高可用性月腋,盡管交換機、綁定這些可以復制到集群里的任何一個節(jié)點瓣赂,但是隊列內容不會復制榆骚。但隊列節(jié)點宕機直接導致該隊列無法應用,只能等待重啟煌集,所以要想在隊列節(jié)點宕機或故障也能正常應用妓肢,就要復制隊列內容到集群里的每個節(jié)點,必須要創(chuàng)建鏡像隊列苫纤。

鏡像隊列是基于普通的集群模式的碉钠,然后再添加一些策略,所以你還是得先配置普通集群卷拘,然后才能設置鏡像隊列喊废,我們就以上面的集群接著做。
保證各個節(jié)點之間數據同步恭金;

1操禀、創(chuàng)建鏡像集群:一臺機器操作就可以同步到其他節(jié)點

rabbitmqctl set_permissions “.*” “.*” “.*”(后面三個”*”代表用戶擁有配置、寫横腿、讀全部權限)

[root@rabbitmq1 rabbitmq]# rabbitmqctl set_policy a-all "^" '{"ha-mode":"all"}'

"-p Vhost" :vhost名稱颓屑, "^"匹配所有的隊列, ha-all 策略名稱為ha-all, '{"ha-mode":"all"}' 策略模式為 all 即復制到所有節(jié)點耿焊,包含新增節(jié)點揪惦。

則此時鏡像隊列設置成功。(這里的虛擬主機是代碼中需要用到的虛擬主機罗侯,虛擬主機的作用是做一個消息的隔離器腋,本質上可認為是一個rabbitmq-server,是否增加虛擬主機,增加幾個纫塌,這是由開發(fā)中的業(yè)務決定诊县,即有哪幾類服務,哪些服務用哪一個虛擬主機措左,這是一個規(guī)劃)依痊。

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

image.png

2、鏡像隊列策略設置說明

rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]

-p Vhost:     可選參數怎披,針對指定vhost下的queue進行設置
Name:          policy的名稱
Pattern:       queue的匹配模式(正則表達式)
Definition:   鏡像定義胸嘁,包括三個部分ha-mode, ha-params, ha-sync-mode
ha-mode:       指明鏡像隊列的模式,有效值為 all/exactly/nodes
all:          表示在集群中所有的節(jié)點上進行鏡像
exactly:      表示在指定個數的節(jié)點上進行鏡像凉逛,節(jié)點的個數由ha-params指定
nodes:        表示在指定的節(jié)點上進行鏡像性宏,節(jié)點名稱通過ha-params指定
ha-params:    ha-mode模式需要用到的參數
ha-sync-mode: 進行隊列中消息的同步方式,有效值為automatic和manual
priority:     可選參數状飞,policy的優(yōu)先級

已經部署完成

3毫胜、實驗創(chuàng)建一個vhost,并給用戶權限添加隊列:

首先昔瞧,在web界面指蚁,登陸后,點擊“Admin--Virtual Hosts(頁面右側)”自晰,在打開的頁面上的下方的“Add a new virtual host”處增加一個虛擬主機,同時創(chuàng)建用戶“admin”和“guest”均加上權限(在頁面直接設置稍坯、點點點即可)酬荞;

image.png
image.png

image.png

創(chuàng)建用戶:
tags指定的從下面的選項中選擇用戶的類型,如管理員之類的瞧哟。
image.png

image.png
image.png
image.png

再新添加一條隊列

在第一臺服務器中執(zhí)行以下命令:

[root@rabbitmq1 rabbitmq]# rabbitmqctl set_policy -p v_host  a-all "^" '{"ha-mode":"all"}'
image.png
image.png

將所有隊列設置為鏡像隊列混巧,即隊列會被復制到各個節(jié)點,各個節(jié)點狀態(tài)保持一直.RabbitMQ 高可用集群搭建完成勤揩,最后一個步驟就是搭建均衡器咧党。


1564160731479.png
常見問題

常見錯誤:

1、使用 rabbitmq-server -detached命令啟動rabbitmq時陨亡,出現以下提示Warning: PID file not written; -detached was passed傍衡,此時使用rabbitmqctl status提示服務已啟動,可知此問題不用解決负蠕。

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 該進程,然后再rabbitmq-server -detached即可解決屡江。(即先強殺芭概,再重新啟動)

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

采用腳本啟動,在腳本中寫好啟動好需要加載的各配置項(創(chuàng)建admin用戶并授權臊诊,創(chuàng)建虛擬主機并授權鸽粉,配置鏡像隊列)。

安裝并配置負載均衡器HA

注意:如果使用阿里云抓艳,可以使用阿里云的內網slb來實現負載均衡触机,不用自己搭建HA。

安裝并配置負載均衡器HA

1玷或、在192.168.94.145安裝HAProxy

yum -y install haproxy

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

[root@rabbitmq1 ~]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
[root@rabbitmq1 ~]# 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 newrain:123456
    stats refresh 30s
####################################
###反代監(jiān)控
frontend server
    bind *:5670
    log global
    mode tcp
    #option forwardfor
    default_backend rabbitmq
    maxconn 3
backend rabbitmq
    mode        tcp
    log         global
    balance     roundrobin
    server      rabbitmq1 192.168.94.145:5672 check inter 2000s rise 2 fall 3
    server      rabbitmq2 192.168.94.146:5672 check inter 2000s rise 2 fall 3
    server      rabbitmq3 192.168.94.147:5672 check inter 2000s rise 2 fall 3
    
[root@rabbitmq1 ~]# systemctl start haproxy

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

常見命令

插件管理

  開啟某個插件:rabbitmq-plugins enable  xxx
  關閉某個插件:rabbitmq-plugins disable xxx
  注意:重啟服務器后生效偏友。

virtual_host管理

  新建virtual_host:rabbitmqctl add_vhost  xxx
  撤銷virtual_host:rabbitmqctl  delete_vhost xxx 

用戶管理

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

其他使用命令:

rabbitmq使用命令:
rabbitmq-plugins list    ----查看安裝的插件
rabbitmq-server -detached  -----------啟動RabbitMQ節(jié)點
rabbitmqctl start_app ----------啟動RabbitMQ應用蔬胯,而不是節(jié)點
rabbitmqctl stop_app  ------停止
rabbitmqctl status  ------查看狀態(tài)
rabbitmqctl add_user mq 123456    -------設置用戶和密碼
rabbitmqctl set_user_tags mq administrator ------------------新增賬戶并設置為管理員
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  ".*" ".*" ".*"    --------------授權
--------------------- 
查看Connection,Queue位他,Channel,User

   rabbitmqctl list_connections  #列出所有連接
   rabbitmqctl list_queues  #列出所有隊列
   rabbitmqctl list_channels #列出所有通道
   rabbitmqctl list_users   #列出所有用戶
--------------------- 
設置節(jié)點類型
如果你想更換節(jié)點類型可以通過命令修改氛濒,如下:

rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type dist
rabbitmqctl change_cluster_node_type ram
rabbitmqctl start_app
===================================================
移除節(jié)點
如果想要把節(jié)點從集群中移除,可使用如下命令實現:

rabbitmqctl stop_app
rabbitmqctl restart
rabbitmqctl start_app
=============================================
集群重啟順序
集群重啟的順序是固定的鹅髓,并且是相反的舞竿。如下所述:

啟動順序:磁盤節(jié)點 => 內存節(jié)點
關閉順序:內存節(jié)點 => 磁盤節(jié)點

最后關閉必須是磁盤節(jié)點,不然可能回造成集群啟動失敗窿冯、數據丟失等異常情況骗奖。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市醒串,隨后出現的幾起案子执桌,更是在濱河造成了極大的恐慌,老刑警劉巖厦凤,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鼻吮,死亡現場離奇詭異,居然都是意外死亡较鼓,警方通過查閱死者的電腦和手機椎木,發(fā)現死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門违柏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人香椎,你說我怎么就攤上這事漱竖。” “怎么了畜伐?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵馍惹,是天一觀的道長。 經常有香客問我玛界,道長万矾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任慎框,我火速辦了婚禮良狈,結果婚禮上,老公的妹妹穿的比我還像新娘笨枯。我一直安慰自己薪丁,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布馅精。 她就那樣靜靜地躺著严嗜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洲敢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天沦疾,我揣著相機與錄音,去河邊找鬼。 笑死凳谦,一個胖子當著我的面吹牛,可吹牛的內容都是我干的尸执。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼绊诲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了掂之?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤世舰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后跟压,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡茸塞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年查剖,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梗搅。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡禾唁,死狀恐怖,靈堂內的尸體忽然破棺而出无切,到底是詐尸還是另有隱情荡短,我是刑警寧澤掘托,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布闪盔,位于F島的核電站泪掀,受9級特大地震影響,放射性物質發(fā)生泄漏塔拳。R本人自食惡果不足惜靠抑,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一荠列、第九天 我趴在偏房一處隱蔽的房頂上張望稚伍。 院中可真熱鬧个曙,春花似錦、人聲如沸呼寸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迈套。三九已至桑李,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間禁荒,已是汗流浹背圈浇。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工召耘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人污它。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓庶弃,卻偏偏與公主長得像德澈,于是被迫代替她去往敵國和親歇攻。 傳聞我的和親對象是個殘疾皇子梆造,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內容

  • 昨天一個開發(fā)朋友說很著急安裝消息中間件rabbitMQ缴守,但是安裝過程有點惡心镇辉,但說是要培訓什么的村砂。讓我?guī)兔匆幌拢?..
    宇晨棒棒的閱讀 819評論 0 1
  • 初識RabbitMQ RabbitMQ是一個開源的消息代理和隊列服務器罕模,用來通過普通協(xié)議在完全不同的應用之間共享數...
    Hey_Shaw閱讀 657評論 1 0
  • 摘要:實際生產應用中都會采用消息隊列的集群方案,如果選擇RabbitMQ那么有必要了解下它的集群方案原理一般來說侥钳,...
    癲狂俠閱讀 74,220評論 11 97
  • 什么叫消息隊列? 消息(Message)是指在應用間傳送的數據敢伸。消息可以非常簡單池颈,比如只包含文本字符串,也可以更復...
    Agile_dev閱讀 2,377評論 0 24
  • 一次又一次地愛上同一個人每币, 那該是多美好的愛情兰怠?痕慢! 只是生活中的人們掖举, 為何多半卻是兩相生厭塔次? 初見的美好與期待名秀,...
    阜南小喬閱讀 700評論 4 14