1 Rabbitmq集群搭建
1.1 普通安裝方式
1.1.1 環(huán)境準(zhǔn)備
????????要在Linux環(huán)境下安裝RabbitMQ,首先我們要有一個(gè)Linux環(huán)境,此處我們使用CentOS7虛擬機(jī)進(jìn)行演示。如果本地還沒(méi)有裝過(guò)虛擬機(jī),可以參考我之前的文章搭建虛擬機(jī)環(huán)境:VMware Workstation 14安裝教程、虛擬機(jī)環(huán)境搭建(VMware Workstation14 + centos7)、VMware+CentOS7 網(wǎng)絡(luò)及靜態(tài)IP配置。
????????準(zhǔn)備好虛擬機(jī)以后,我們就可以按照下面的步驟安裝RabbitMQ了。
1.1.2 安裝Erlang
????????RabbitMQ依賴(lài)于Erlang,所以,在安裝RabbitMQ之前,需要先安裝Erlang。此處需要注意,Erlang和RabbitMQ之間有版本的依賴(lài)關(guān)系,詳見(jiàn):RabbitMQ Erlang Version Requirements — RabbitMQ。
????????所以,如果我們已經(jīng)確定了要安裝哪個(gè)版本的RabbitMQ后,需要安裝對(duì)應(yīng)版本的Erlang。此處,我們選擇RabbitMQ 3.9.14 + ErLang 23.3。
????????在開(kāi)始安裝之前,先執(zhí)行下面的命令安裝一些必要的依賴(lài):
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel glibc-devel xmlto perl wget socat
????????然后下載23.3版本的Erlang包:
????????將下載好的Erlang包上傳到虛擬機(jī)中,然后執(zhí)行下面命令解壓:
tar -xvf otp_src_23.3.tar.gz
????????解壓完成后,進(jìn)入解壓后的目錄,執(zhí)行下面命令配置erlang的資源文件路徑:
./configure --prefix=/usr/local/erlang
????????然后執(zhí)行下面命令編譯源碼并安裝Erlang:
make && make install
1.1.3 配置Erlang環(huán)境變量
????????執(zhí)行下面命令編輯環(huán)境變量文件:
vim /etc/profile
????????在文件最后加入一行:
export PATH=$PATH:/usr/local/erlang/bin
????????其中,/usr/local/erlang為erlang安裝目錄。
????????執(zhí)行下面的命令編譯生效配置:
source /etc/profile
1.1.4 驗(yàn)證Erlang是否安裝成功
????????執(zhí)行完上面的步驟后,如果中間沒(méi)有出現(xiàn)報(bào)錯(cuò),那么就說(shuō)明已經(jīng)安裝成功了。此時(shí)可以通過(guò)執(zhí)行下面的命令驗(yàn)證Erlang是否安裝成功:erl。
????????輸入erl命令后,如果出現(xiàn)Erlang版本信息,說(shuō)明Erlang已經(jīng)安裝成功了:
1.1.5 安裝RabbitMQ
????????首先,去GitHub上找到自己需要的版本,然后下載對(duì)應(yīng)版本的壓縮包文件:
????????將下載好的文件上傳到虛擬機(jī)上,然后執(zhí)行下面的命令解壓:
tar -xvf rabbitmq-server-generic-unix-3.9.14.tar.xz
1.1.6 配置RabbitMQ環(huán)境變量
????????執(zhí)行下面命令配置環(huán)境變量:
vim /etc/profile
????????在最后加入一行:
export PATH=$PATH:/usr/local/rabbitmq_server-3.9.14/sbin
????????其中/usr/local/rabbitmq_server-3.9.14為RabbitMQ安裝目錄。
????????執(zhí)行下面的命令編譯生效配置:
source /etc/profile
1.1.7 啟動(dòng)RabbitMQ
????????進(jìn)入RabbitMQ安裝目錄下的sbin目錄,通過(guò)里面的rabbit-server命令可以啟動(dòng)RabbitMQ,有三種方式:
# 后臺(tái)方式啟動(dòng)
#./rabbitmq-server -detachedservice
#rabbitmq-server start
#./rabbitmq-server start
????????我們選擇任意一種方式啟動(dòng)即可:
1.1.8 添加用戶
????????RabbitMQ安裝成功后有一個(gè)默認(rèn)用戶和密碼,都是guest,但這個(gè)guest用戶只能在RabbitMQ本機(jī)登錄使用,如果想在其他機(jī)器上訪問(wèn)RabbitMQ需要添加新的賬戶。在RabbitMQ安裝目錄的sbin目錄下,使用下面命令添加一個(gè)admin用戶,并且密碼也是admin:
./rabbitmqctl add_user admin admin
????????然后修改用戶角色為管理員:
./rabbitmqctl set_user_tags admin administrator
????????最后給admin用戶添加權(quán)限:
./rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
1.1.9 啟用web端管理界面插件
????????執(zhí)行下面的命令啟用管理插件:
./rabbitmq-plugins enable rabbitmq_management
????????然后就可以在瀏覽器中訪問(wèn)RabbitMQ的管理界面了。在瀏覽器地址欄中輸入:虛擬機(jī)IP:15672即可:
????????用戶名和密碼輸入我們上面創(chuàng)建的admin登錄:
????????至此,我們的RabbitMQ就已經(jīng)安裝完成,并且可以通過(guò)web界面進(jìn)行管理RabbitMQ了。
1.2 容器安裝方式
1.2.1 搭建普通集群
1、新建三個(gè)docker容器。
docker run -d --hostname rabbit1 --name myrabbit1 -v /home/rabbitmq/data:/var/lib/rabbitmq -p 15671:15672 -p 5671:5672 rabbitmq
docker run -d --hostname rabbit2 --name myrabbit2 -v /home/rabbitmq/data:/var/lib/rabbitmq -p 15672:15672 -p 5672:5672 --link myrabbit1:rabbit1 rabbitmq
docker run -d --hostname rabbit3 --name myrabbit3 -v /home/rabbitmq/data:/var/lib/rabbitmq -p 15673:15672 -p 5673:5672 --link myrabbit1:rabbit1 --link myrabbit2:rabbit2 rabbitmq
2、三個(gè)都進(jìn)入容器下載可視化工具。
3、進(jìn)入第一個(gè)mq容器重啟。
docker exec -it ef4a1f0fade7 /bin/bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit
4、進(jìn)入第二個(gè) 和 第三個(gè) mq容器執(zhí)行。
docker exec -it e36d94d40008 /bin/bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbit1 //如遇到報(bào)錯(cuò)再執(zhí)行上句、再繼續(xù)執(zhí)行
rabbitmqctl start_app
exit
5、進(jìn)去mq可視化界面,overview面板中的Nodes可查看到節(jié)點(diǎn)信息。
6、測(cè)試,在mq上新建交換機(jī)、其余兩個(gè)也出現(xiàn)新建的交換機(jī)。
????????此時(shí)普通集群以構(gòu)建完成:
1、此種集群主節(jié)點(diǎn)down掉后,消費(fèi)者也無(wú)法消費(fèi)從節(jié)點(diǎn)的消息,不能做故障轉(zhuǎn)移,只能當(dāng)作備份。
2、主節(jié)點(diǎn)正常,從節(jié)點(diǎn)則可以消費(fèi)消息
1.2.2 鏡像集群(高可用)(推薦)
????????這種集群彌補(bǔ)第一種的缺陷,需在普通集群的基礎(chǔ)下搭建(確保第一種集群可用)。
????????鏡像隊(duì)列機(jī)制就是將隊(duì)列在三個(gè)節(jié)點(diǎn)之間設(shè)置主從關(guān)系,消息會(huì)在三個(gè)節(jié)點(diǎn)之間進(jìn)行自動(dòng)同步,且如果其中一個(gè)節(jié)點(diǎn)不可用,并不會(huì)導(dǎo)致消息丟失或服務(wù)不可用的情況,提升mq集群的高可用性。
????????該模式帶來(lái)的副作用也很明顯,除了降低系統(tǒng)性能外,如果鏡像隊(duì)列數(shù)量過(guò)多,加之大量的消息進(jìn)入,集群內(nèi)部的網(wǎng)絡(luò)帶寬將會(huì)被這種同步通訊大大消耗掉。
????????所以在對(duì)可靠性要求較高的場(chǎng)合中適用,一個(gè)隊(duì)列想做成鏡像隊(duì)列,需要先設(shè)置policy,然后客戶端創(chuàng)建隊(duì)列的時(shí)候,rabbitmq集群根據(jù)“隊(duì)列名稱(chēng)”自動(dòng)設(shè)置是普通集群模式或鏡像隊(duì)列。具體如下:
????????隊(duì)列通過(guò)策略來(lái)使能鏡像。策略能在任何時(shí)刻改變,rabbitmq隊(duì)列也近可能的將隊(duì)列隨著策略變化而變化;非鏡像隊(duì)列和鏡像隊(duì)列之間是有區(qū)別的,前者缺乏額外的鏡像基礎(chǔ)設(shè)施,沒(méi)有任何slave,因此會(huì)運(yùn)行得更快。
????????為了使隊(duì)列稱(chēng)為鏡像隊(duì)列,你將會(huì)創(chuàng)建一個(gè)策略來(lái)匹配隊(duì)列,設(shè)置策略有兩個(gè)鍵“ha-mode和 ha-params(可選)”。ha-params根據(jù)ha-mode設(shè)置不同的值,下面表格說(shuō)明這些key的選項(xiàng)。
????????為什么RabbitMQ不將隊(duì)列復(fù)制到集群里每個(gè)節(jié)點(diǎn)呢?這與它的集群的設(shè)計(jì)本意相沖突,集群的設(shè)計(jì)目的就是增加更多節(jié)點(diǎn)時(shí),能線性的增加性能(CPU、內(nèi)存)和容量(內(nèi)存、磁盤(pán))。理由如下:
????????Storage Space: If every cluster node had a full copy of every queue, adding nodes wouldn’t give you more storage capacity. For example, if one node could store 1GB of messages, adding two more nodes would simply give you two more copies of the same 1GB of messages.(存儲(chǔ)空間:如果每個(gè)集群節(jié)點(diǎn)每個(gè)隊(duì)列的一個(gè)完整副本,增加節(jié)點(diǎn)需要更多的存儲(chǔ)容量。例如,如果一個(gè)節(jié)點(diǎn)可以存儲(chǔ)1 gb的消息,添加兩個(gè)節(jié)點(diǎn)需要兩份相同的1gb的消息)
????????Performance: Publishing messages would require replicating those messages to every cluster node. For durable messages that would require triggering disk activity on all nodes for every message. Your network and disk load would increase every time you added a node, keeping the performance of the cluster the same (or possibly worse).(性能:發(fā)布消息需要將這些信息復(fù)制到每個(gè)集群節(jié)點(diǎn)。對(duì)持久消息,要求為每條消息觸發(fā)磁盤(pán)活動(dòng)在所有節(jié)點(diǎn)上。每次添加一個(gè)節(jié)點(diǎn)都會(huì)帶來(lái) 網(wǎng)絡(luò)和磁盤(pán)的負(fù)載。)
????????當(dāng)然RabbitMQ新版本集群也支持隊(duì)列復(fù)制(有個(gè)選項(xiàng)可以配置)。比如在有五個(gè)節(jié)點(diǎn)的集群里,可以指定某個(gè)隊(duì)列的內(nèi)容在2個(gè)節(jié)點(diǎn)上進(jìn)行存儲(chǔ),從而在性能與高可用性之間取得一個(gè)平衡(應(yīng)該就是指鏡像模式)。
1、配置集群架構(gòu)
2、進(jìn)入任意節(jié)點(diǎn)配置策略
docker exec -it ef4a1f0fade7 /bin/bash
rabbitmqctl set_policy ha-all "^rabbitmq" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
3、測(cè)試,新建一個(gè)rabbitmq開(kāi)頭的隊(duì)列
????????此時(shí)某個(gè)節(jié)點(diǎn)down掉(包括主節(jié)點(diǎn)),其余節(jié)點(diǎn)也能消費(fèi)。
????????將主節(jié)點(diǎn)down掉,節(jié)點(diǎn)自動(dòng)切換。
4、清除策略
rabbitmqctl clear_policy ha-all
2 界面認(rèn)識(shí)
2.1 概要頁(yè)面
2.2 連接頁(yè)面
2.3 通道頁(yè)面
2.4 交換器頁(yè)面
交換器,用來(lái)接收生產(chǎn)者發(fā)送的消息并將這些消息路由給服務(wù)器中的隊(duì)列
2.5 隊(duì)列頁(yè)面
????????點(diǎn)擊名稱(chēng)進(jìn)去,可以看到隊(duì)列的詳細(xì)信息
????????get Message可以看到消息的內(nèi)容
????????arguments具體參數(shù)如下:
2.6 用戶頁(yè)面
????????就是添加用戶和設(shè)置用戶權(quán)限。
2.7 開(kāi)啟日志
????????進(jìn)入容器,輸入:
rabbitmq-plugins enable rabbitmq_tracing
????????此時(shí)會(huì)多一個(gè)tracing標(biāo)簽,輸入信息添加日志。
- Name: 自定義,建議標(biāo)準(zhǔn)點(diǎn)容易區(qū)分
- Format: 表示輸出的消息日志格式,有Text和JSON兩種,Text格式的日志方便人類(lèi)閱讀,JSON的方便程序解析。
????????JSON格式的payload(消息體)默認(rèn)會(huì)采用Base64進(jìn)行編碼,如上面的“trace test payload.”會(huì)被編碼成“dHJhY2Ug dGVzdCBwYXlsb2FkLg==”。
- Max payload bytes: 表示每條消息的最大限制,單位為B。比如設(shè)置了了此值為10,那么當(dāng)有超過(guò)10B的消息經(jīng)過(guò)Rabbit MQ流轉(zhuǎn)時(shí),在記錄到trace文件的時(shí)候會(huì)被截?cái)?。如上text日志格式中“trace test payload.”會(huì)被截?cái)喑伞皌race tes
- Pattern:
- # 追蹤所有進(jìn)入和離開(kāi)MQ的消息
- publish.# 追蹤所有進(jìn)入MQ的消息
- publish.myExchage 追蹤所有進(jìn)入到myExchange的消息
- deliver.# 跟蹤所有離開(kāi)MQ的消息
- deliver.myQueue 追蹤所有從myQueue離開(kāi)的消息 #.myQueue實(shí)測(cè)效果等同于deliver.myQueue
????????添加后,點(diǎn)擊即可查看日志。
????????如果出現(xiàn)錯(cuò)誤,是因?yàn)椴寮J(rèn)是使用 guest 用戶,是因?yàn)榘?guest 用戶刪除了,或者在配置文件里面使用其他用戶。
????????解決: 配置/etc/rabbitmq/rabbitmq.config,添加配置(未嘗試,可以或者不行或者有其他解決方法請(qǐng)留言)
{rabbitmq_tracing,
[
{directory, "/var/vcap/sys/log/rabbitmq-server/tracing"},
{username, <<"admin">>},
{password, <<"password">>}
]
},
3 rabbitmq常見(jiàn)故障
- 集群狀態(tài)異常
- rabbitmqctl cluster_status檢查集群健康狀態(tài),不正常節(jié)點(diǎn)重新加入集群
- 分析是否節(jié)點(diǎn)掛掉,手動(dòng)啟動(dòng)節(jié)點(diǎn)。
- 保證網(wǎng)絡(luò)連通正常
- 隊(duì)列阻塞、數(shù)據(jù)堆積
- 保證網(wǎng)絡(luò)連通正常
- 保證消費(fèi)者正常消費(fèi),消費(fèi)速度大于生產(chǎn)速度
- 保證服務(wù)器TCP連接限制合理
- 腦裂
- 按正確順序重啟集群
- 保證網(wǎng)絡(luò)連通正常
- 保證磁盤(pán)空間、cpu、內(nèi)存足夠
- 內(nèi)存使用量超過(guò)閥值
=INFO REPORT==== 15-Mar-2022::03:21:13 ===
rabbit on node 'rabbit@hb-lvs-rabbitmq-mem-1' down
=INFO REPORT==== 15-Mar-2022::03:21:16 ===
vm_memory_high_watermark set. Memory used:3194473120 allowed:3188020019
=WARNING REPORT==== 15-Mar-2022::03:21:16 ===
memory resource limit alarm set on node 'rabbit@hb-lvs-rabbitmq-disk-2'.
**********************************************************
*** Publishers will be blocked until this alarm clears ***
**********************************************************
????????這時(shí)會(huì)阻塞生產(chǎn)者,以避免服務(wù)崩潰。
????????臨時(shí)解決辦法是調(diào)大內(nèi)存閥值,默認(rèn)是0.4;
rabbitmqctl set_vmmemory_high_watermark 0.6
4 常用命令
- 啟動(dòng)rabbit服務(wù):service rabbitmq-server start
- 停止rabbit服務(wù):service rabbitmq-server stop
- 后臺(tái)啟動(dòng):rabbitmq-server -detached
- 運(yùn)行狀態(tài):rabbitmqctl status
- 用戶管理
- ????????查看所有用戶:rabbitmqctl list_users
- ????????添加用戶:rabbitmqctl add_user username password
- ????????刪除用戶:rabbitmqctl delete_user username
- ????????修改密碼:rabbitmqctl change_password username newpassword
- 開(kāi)啟rabbit網(wǎng)頁(yè)控制臺(tái)
- ????????進(jìn)入rabbit安裝目錄:cd /usr/lib/rabbitmq
- ????????查看已經(jīng)安裝的插件:rabbitmq-plugins list
- ????????開(kāi)啟網(wǎng)頁(yè)版控制臺(tái):rabbitmq-plugins enable rabbitmq_management
- ????????重啟rabbitmq服務(wù)
- ????????輸入網(wǎng)頁(yè)訪問(wèn)地址:http://localhost:15672/ 使用默認(rèn)賬號(hào):guest/guest登錄
參考鏈接
Linux安裝Erlang和RabbitMQ詳細(xì)步驟
RabbitMQ的工作模式及原理
RabbitMQ如何保證消息的可靠性投遞與消費(fèi)?
rabbitmq詳解-CSDN博客
RabbitMQ(一)——常見(jiàn)消息中間件
深入理解:RabbitMQ的前世今生
RabbitMQ技術(shù)詳解-架構(gòu)
透徹rabbitmq - 知乎
消息隊(duì)列的使用場(chǎng)景是怎樣的? - 知乎
RabbitMQ原理 - 知乎
RabbitMQ 原理解析文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-829028.html
RabbitMQ原理詳解_rabbitmq工作原理-CSDN博客文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-829028.html
到了這里,關(guān)于【云原生進(jìn)階之PaaS中間件】第四章RabbitMQ-3-RabbitMQ安裝的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!