更新時(shí)間:2021-12-14 10:16:23 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1263次
erlang安裝版本一致
RabbitMQ安裝版本一致
以下示例使用 192.168.73.134 和 192.168.73.135 構(gòu)建 Rabbitmq 集群
RabbitMQ 是用 erlang 開發(fā)的。Cluster 非常方便,因?yàn)?erlang 本質(zhì)上是一種分布式語言,但它不支持負(fù)載均衡。在第一次模擬考試中,Rabbit模式可以分為三種:單模、共模和鏡像模式。
第一次模擬考試:最簡單的情況,非集群模式。
普通模式:默認(rèn)集群模式。
about Queue Message實(shí)體只存在于一個(gè)節(jié)點(diǎn),A,B這兩個(gè)節(jié)點(diǎn)只有相同的元數(shù)據(jù),即隊(duì)列結(jié)構(gòu)。
當(dāng)消息進(jìn)入A節(jié)點(diǎn)的Queue中后,consumer從B節(jié)點(diǎn)被拉取時(shí),RabbitMQ會(huì)臨時(shí)在A、B之間傳遞消息,B中的消息實(shí)體發(fā)送給consumer。
因此消費(fèi)者嘗試連接每個(gè)節(jié)點(diǎn)并從中獲取消息。也就是說,對于同一個(gè)邏輯隊(duì)列,需要在多個(gè)節(jié)點(diǎn)建立物理隊(duì)列。否則不管是A還是B的消費(fèi)者,出口總是在A,會(huì)有瓶頸。
這個(gè)模型有問題 A 節(jié)點(diǎn)故障后, B 節(jié)點(diǎn)無法檢索到 A 節(jié)點(diǎn)中尚未消費(fèi)的消息實(shí)體。
如果消息持久化完成,則等待A節(jié)點(diǎn)恢復(fù)后才能被消費(fèi);如果沒有持久化,那么將不會(huì)有更多的節(jié)點(diǎn)
鏡像模式:將需要的隊(duì)列做成鏡像隊(duì)列,存在于多個(gè)節(jié)點(diǎn)中。屬于RabbitMQ的HA方案。
該模式解決了上述問題。其本質(zhì)與普通模式的區(qū)別在于消息實(shí)體會(huì)主動(dòng)在鏡像節(jié)點(diǎn)之間同步,而不是在鏡像節(jié)點(diǎn)消費(fèi)者取數(shù)據(jù)時(shí)臨時(shí)拉取數(shù)據(jù)。
這種模式的副作用也很明顯。除了降低系統(tǒng)性能外,如果圖像隊(duì)列數(shù)量過多,大量消息進(jìn)入,集群內(nèi)的網(wǎng)絡(luò)帶寬也會(huì)被這種同步通信大量消耗。
因此適用于對可靠性要求較高的場合(后面會(huì)詳細(xì)介紹這種模式,我們目前搭建的環(huán)境就屬于這種模式)。
(1)集群中的基本概念
RabbitMQ 的集群節(jié)點(diǎn)包括內(nèi)存節(jié)點(diǎn)和磁盤節(jié)點(diǎn)。
顧名思義,內(nèi)存節(jié)點(diǎn)將所有數(shù)據(jù)放在內(nèi)存中,而磁盤節(jié)點(diǎn)將數(shù)據(jù)放在磁盤上。但是,如上所述,如果在傳遞消息時(shí)開啟消息持久化,即使是內(nèi)存節(jié)點(diǎn),數(shù)據(jù)仍然安全地放置在磁盤上。
RabbitMQ 集群可以共享用戶、虛擬主機(jī)、隊(duì)列、交換器等。必須在所有節(jié)點(diǎn)上復(fù)制所有數(shù)據(jù)和狀態(tài)。例外是當(dāng)前屬于創(chuàng)建它的節(jié)點(diǎn)的消息隊(duì)列,盡管它們是可見的并且可以被所有節(jié)點(diǎn)讀取。RabbitMQ 節(jié)點(diǎn)可以動(dòng)態(tài)加入集群。一個(gè)節(jié)點(diǎn)可以加入集群,也可以從集群環(huán)集群進(jìn)行基本的負(fù)載均衡。
集群中有兩種類型的節(jié)點(diǎn):
內(nèi)存節(jié)點(diǎn):只將狀態(tài)保存到內(nèi)存(例外:持久隊(duì)列的持久內(nèi)容會(huì)保存到磁盤)
磁盤節(jié)點(diǎn):將狀態(tài)保存到內(nèi)存和磁盤。
內(nèi)存節(jié)點(diǎn)不寫入磁盤,但性能優(yōu)于磁盤節(jié)點(diǎn)。在一個(gè)集群中,只需要一個(gè)磁盤節(jié)點(diǎn)來保存狀態(tài),
如果集群中只有內(nèi)存節(jié)點(diǎn),則不能停止,否則所有的狀態(tài)、消息等都會(huì)丟失。
思路:
為了實(shí)現(xiàn)RabbitMQ的高可用,我們先搭建普通集群模式,再配置鏡像模式,實(shí)現(xiàn)高可用。在Rabbit集群前面增加了一個(gè)反向代理,生產(chǎn)者和消費(fèi)者通過反向代理訪問RabbitMQ集群。
架構(gòu)如下:
(2)集群模式配置
step1:局域網(wǎng)配置
在安裝好的三個(gè)節(jié)點(diǎn)服務(wù)器中,分別修改/etc/hosts文件
1. vim /etc/hosts
192.168.73.134 節(jié)點(diǎn) 1
192.168.73.135 節(jié)點(diǎn) 2
step2:為不同節(jié)點(diǎn)之間的相同認(rèn)證設(shè)置Erlang Cookie
Erlang 集群中每個(gè)節(jié)點(diǎn)的魔法 cookie 來實(shí)現(xiàn),這個(gè) cookie 存儲(chǔ)在 /var/lib/rabbitmq/.erlang.cookie 中,該文件的權(quán)限為 400。
因此,必須保證每個(gè)節(jié)點(diǎn)的 cookie 一致,否則節(jié)點(diǎn)之間將無法通信。
從主節(jié)點(diǎn)采用 copy 的方式來保持 Cookie 的一致性:
1. chmod 777 /var/lib/rabbitmq/.erlang.cookie
2. scp -p 22 /var/lib/rabbitmq/.erlang.cookie root@192.168.73.135:/var/lib/rabbitmq/
復(fù)制后,檢查文件的用戶、組和權(quán)限是否符合要求。如果沒有,請修改它。在.erlang.cookie之后恢復(fù),否則可能會(huì)遇到錯(cuò)誤:
3. chown rabbitmq:rabbitmq .erlang.cookie
4. chmod 400 /var/lib/rabbitmq/.erlang.cookie
step3:使用-分離運(yùn)行每個(gè)節(jié)點(diǎn)
在RabbitMQ重啟后設(shè)置cookie:
1. cd /sbin
2.rabbitmqctl停止
3. rabbitmq-server 啟動(dòng)
這里正常重啟可能會(huì)提示節(jié)點(diǎn)實(shí)例再次運(yùn)行。如果出現(xiàn),使用以下命令啟動(dòng):
1. ps -aux | 格雷厄爾
2. kill -9 {pid}
3. RABBITMQ_NODE_PORT=5678 RABBITMQ_NODENAME=rabbit@node1 ./rabbitmq-server -detached
RABBITMQ_NODE_PORT=5678 RABBITMQ_NODENAME=rabbit@node2 ./rabbitmq-server -detached
ps:上面的5678是因?yàn)閞abbitmq端口改成了5678,而且nodename和hosts的設(shè)置是一致的。
依次啟動(dòng)所有節(jié)點(diǎn)。
step4:查看各個(gè)節(jié)點(diǎn)的狀態(tài)
1.查看啟動(dòng)端口:netstat -lntp
活動(dòng) Internet 連接(僅限服務(wù)器)
Proto Recv-Q Send-Q 本地地址 外地址 狀態(tài) PID/程序名稱
tcp 0 0 0.0.0.0:4369 0.0.0.0:* 聽 27321/epmd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 760/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1066/master
tcp 0 0 0.0.0.0:15678 0.0.0.0:* 聽 27862/beam.smp
tcp 0 0 0.0.0.0:25672 0.0.0.0:* 聽 27862/beam.smp
tcp6 0 0 :::5678 :::* 聽 27862/beam.smp
tcp6 0 0 :::8080 :::* 聽 964/java
tcp6 0 0 :::4369 :::* 聽 27321/epmd
tcp6 0 0 :::22 :::* LISTEN 760/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1066/master
tcp6 0 0 127.0.0.1:8005 :::* 聽 964/java
tcp6 0 0 :::8009 :::* 聽 964/java
2.查看rabbitmq啟動(dòng)狀態(tài):
rabbitmqctl -n rabbit1@node1 狀態(tài)
rabbitmqctl -n rabbit1@node2 狀態(tài)
3.訪問http://bbitraq后臺(tái)打開后,可以查看網(wǎng)頁是否可以訪問
step5:創(chuàng)建和部署集群
以rabbit@rabbitmq2和rabbit@rabbitmq1組成集群,rabbitmq2作為內(nèi)存節(jié)點(diǎn)(一個(gè)硬盤節(jié)點(diǎn)就夠了);
兔子MQ2:
1.停止節(jié)點(diǎn)2的應(yīng)用:rabbitmqctl -n rabbit@node2 stop_app
在節(jié)點(diǎn) rabbit@rabbitmq2 上停止兔子應(yīng)用程序
2.添加節(jié)點(diǎn)1作為內(nèi)存節(jié)點(diǎn)rabbitmqctl -n rabbit@node2 join_cluster --ram rabbit@node1
集群節(jié)點(diǎn) rabbit@node2 與 rabbit@node1
3、啟動(dòng)節(jié)點(diǎn)2的應(yīng)用:rabbitmqctl -n rabbit@node2 start_app
起始節(jié)點(diǎn)rabbit@node2
step6:查看集群狀態(tài)
1.查看節(jié)點(diǎn)1的集群狀態(tài):rabbitmqctl -n rabbit@node1 cluster_status
節(jié)點(diǎn)rabbit@node1的集群狀態(tài)
[{nodes,[{disc,[rabbit@node1]},{ram,[rabbit@node2]}]},
{running_nodes,[rabbit@node1]},
{cluster_name,<<"rabbit@node1">>},
{分區(qū),[]},
{警報(bào),[{rabbit@node1,[]}]}]
2.查看節(jié)點(diǎn)2的集群狀態(tài):rabbitmqctl -n rabbit@node2 cluster_status
節(jié)點(diǎn)rabbit@node2的集群狀態(tài)
[{nodes,[{disc,[rabbit@node1]},{ram,[rabbit@node2]}]},
{警報(bào),[{rabbit@node1,[]}]}]
3.后臺(tái)查看集群狀態(tài):
至此,rabbitmq 集群搭建完畢。
上面配置了RabbitMQ默認(rèn)的集群模式,但是不保證隊(duì)列的高可用。雖然可以將切換和綁定復(fù)制到集群中的任何節(jié)點(diǎn),但不會(huì)復(fù)制隊(duì)列內(nèi)容。這種模式雖然解決了一些節(jié)點(diǎn)壓力,但是隊(duì)列節(jié)點(diǎn)宕機(jī)直接導(dǎo)致隊(duì)列無法使用,只能等待重啟。因此,需要關(guān)閉隊(duì)列節(jié)點(diǎn),否則故障也可以正常使用。要將隊(duì)列的內(nèi)容復(fù)制到集群中的每個(gè)節(jié)點(diǎn),需要?jiǎng)?chuàng)建一個(gè)圖像隊(duì)列。
第一步:添加負(fù)載均衡器
在負(fù)載均衡器方面,F(xiàn)5的BIG-IP、Radware的AppDirector等商用產(chǎn)品都是硬件架構(gòu)的產(chǎn)品,可以實(shí)現(xiàn)高處理能力。但是這些產(chǎn)品的高價(jià)會(huì)讓人望而卻步,所以我們也有軟件負(fù)載均衡解決方案。互聯(lián)網(wǎng)公司常用的軟件LB有LVS、HAProxy、Nginx等,LVS是內(nèi)核層產(chǎn)品,主要負(fù)責(zé)第四層的數(shù)據(jù)包轉(zhuǎn)發(fā),使用比較復(fù)雜。HAProxy 和 Nginx 是應(yīng)用層產(chǎn)品,但 Nginx 主要用于處理 HTTP,因此選擇 HAProxy 作為 RabbitMQ 前端的 lb。
1.安裝HAProxy(在192.168.73.136安裝在HAProxy上)
yum -y 安裝haproxy
2.修改haproxy.config進(jìn)行配置
vim /etc/haproxy/haproxy.config
添加以下配置:
聽rabbitmq_cluster 0.0.0.0:5678
模式tcp
平衡循環(huán)
服務(wù)器rabbitmaster 192.168.73.134:5678 檢查inter 2000 上升2 下降3
服務(wù)器rabbitslave 192.168.73.135:5678 檢查inter 2000 上升2 下降3
修改HaProxy配置后,重啟可能會(huì)提示端口綁定失敗。在這種情況下,請執(zhí)行以下命令:
setebool -P haproxy_connect_any=1
負(fù)載均衡器將監(jiān)聽 192.168.73.136 的 5678 端口,并輪詢我們 192.168.73.134 和 192.168.73.135 的 5678 端口這兩個(gè)節(jié)點(diǎn)。這樣磁盤節(jié)點(diǎn)不會(huì)同時(shí)受到影響,除了故障。
第二步:配置Rabbitmq策略
在任意節(jié)點(diǎn)上執(zhí)行:
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
上面的命令會(huì)將所有隊(duì)列設(shè)置為鏡像隊(duì)列,即隊(duì)列會(huì)被復(fù)制到每個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)的狀態(tài)會(huì)保持一致
第三步:使用負(fù)載服務(wù)器發(fā)送消息
客戶端使用負(fù)載服務(wù)器172.16.3.110(panyuntao3)發(fā)送消息,隊(duì)列復(fù)制到所有節(jié)點(diǎn)。到這里我們就完成了RabbitMQ集群的高可用配置。
通過上述相信大家對RabbitMQ集群搭建已經(jīng)有所了解,如果您想了解更多相關(guān)知識(shí),可以關(guān)注一下動(dòng)力節(jié)點(diǎn)的RabbitMQ教程,里面的內(nèi)容細(xì)致全面,由淺到深,適合小白學(xué)習(xí),希望對大家的學(xué)習(xí)能夠有所幫助。