消息中間件
一、簡介
消息中間件也可以稱為消息隊列(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
修改如下:
三臺機器都操作重啟服務服務:
[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
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
登錄后出現如圖所示的界?
根據界?提示創(chuàng)建?條隊列,然后點擊添加
在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é)點:
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”均加上權限(在頁面直接設置稍坯、點點點即可)酬荞;
創(chuàng)建用戶:
tags指定的從下面的選項中選擇用戶的類型,如管理員之類的瞧哟。
再新添加一條隊列
在第一臺服務器中執(zhí)行以下命令:
[root@rabbitmq1 rabbitmq]# rabbitmqctl set_policy -p v_host a-all "^" '{"ha-mode":"all"}'
將所有隊列設置為鏡像隊列混巧,即隊列會被復制到各個節(jié)點,各個節(jié)點狀態(tài)保持一直.RabbitMQ 高可用集群搭建完成勤揩,最后一個步驟就是搭建均衡器咧党。
常見問題
常見錯誤:
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é)點,不然可能回造成集群啟動失敗窿冯、數據丟失等異常情況骗奖。