你不知道的RabbitMQ集群架构全解
你不知道的RabbitMQ集群架構(gòu)全解
前言
本文將系統(tǒng)的介紹一下RabbitMQ集群架構(gòu)的特點(diǎn)、異常處理、搭建和使用中要注意的一些細(xì)節(jié)。
知識(shí)點(diǎn)
一、為什么使用集群?
二、集群的特點(diǎn)
三、集群異常處理
四、集群節(jié)點(diǎn)類型
五、集群搭建方法
六、鏡像隊(duì)列
一、為什么使用集群?
內(nèi)建集群作為RabbitMQ最優(yōu)秀的功能之一,它的作用有兩個(gè):
二、集群的特點(diǎn)
RabbitMQ的集群是由多個(gè)節(jié)點(diǎn)組成的,但我們發(fā)現(xiàn)不是每個(gè)節(jié)點(diǎn)都有所有隊(duì)列的完全拷貝。
RabbitMQ節(jié)點(diǎn)不完全拷貝特性
為什么默認(rèn)情況下RabbitMQ不將所有隊(duì)列內(nèi)容和狀態(tài)復(fù)制到所有節(jié)點(diǎn)?
有兩個(gè)原因:
所以其他非所有者節(jié)點(diǎn)只知道隊(duì)列的元數(shù)據(jù),和指向該隊(duì)列節(jié)點(diǎn)的指針。
三、集群異常處理
根據(jù)節(jié)點(diǎn)不無(wú)安全拷貝的特性,當(dāng)集群節(jié)點(diǎn)崩潰時(shí),該節(jié)點(diǎn)隊(duì)列和關(guān)聯(lián)的綁定就都丟失了,附加在該隊(duì)列的消費(fèi)者丟失了其訂閱的信息,那么怎么處理這個(gè)問(wèn)題呢?
這個(gè)問(wèn)題要分為兩種情況:
四、集群節(jié)點(diǎn)類型
節(jié)點(diǎn)的存儲(chǔ)類型分為兩種:
- 磁盤(pán)節(jié)點(diǎn)
- 內(nèi)存節(jié)點(diǎn)
磁盤(pán)節(jié)點(diǎn)就是配置信息和元信息存儲(chǔ)在磁盤(pán)上,內(nèi)次節(jié)點(diǎn)把這些信息存儲(chǔ)在內(nèi)存中,當(dāng)然內(nèi)次節(jié)點(diǎn)的性能是大大超越磁盤(pán)節(jié)點(diǎn)的。
單節(jié)點(diǎn)系統(tǒng)必須是磁盤(pán)節(jié)點(diǎn),否則每次你重啟RabbitMQ之后所有的系統(tǒng)配置信息都會(huì)丟失。
RabbitMQ要求集群中至少有一個(gè)磁盤(pán)節(jié)點(diǎn),當(dāng)節(jié)點(diǎn)加入和離開(kāi)集群時(shí),必須通知磁盤(pán)節(jié)點(diǎn)。
特殊異常:集群中唯一的磁盤(pán)節(jié)點(diǎn)崩潰了
如果集群中的唯一一個(gè)磁盤(pán)節(jié)點(diǎn),結(jié)果這個(gè)磁盤(pán)節(jié)點(diǎn)還崩潰了,那會(huì)發(fā)生什么情況?
如果唯一磁盤(pán)的磁盤(pán)節(jié)點(diǎn)崩潰了,不能進(jìn)行如下操作:
- 不能創(chuàng)建隊(duì)列
- 不能創(chuàng)建交換器
- 不能創(chuàng)建綁定
- 不能添加用戶
- 不能更改權(quán)限
- 不能添加和刪除集群幾點(diǎn)
總結(jié):如果唯一磁盤(pán)的磁盤(pán)節(jié)點(diǎn)崩潰,集群是可以保持運(yùn)行的,但你不能更改任何東西。
解決方案:在集群中設(shè)置兩個(gè)磁盤(pán)節(jié)點(diǎn),只要一個(gè)可以,你就能正常操作。
五、集群搭建方法
本章我們用Docker來(lái)創(chuàng)建RabbitMQ集群,一來(lái)是因?yàn)椴僮骱?jiǎn)便,二是因?yàn)榭梢愿浞值睦梅?wù)器硬件資源,三來(lái)是Docker也是現(xiàn)在的主流部署方案,關(guān)于更多的Docker詳情可以查看我的另一篇:《使用Docker部署RabbitMQ集群)》 接下來(lái),進(jìn)入我們的正文,集群搭建分為兩步:
- 步驟一:安裝多個(gè)RabbitMQ
- 步驟二:加入RabbitMQ節(jié)點(diǎn)到集群
步驟一:安裝多個(gè)RabbitMQ
docker run -d --hostname rabbit1 --name myrabbit1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-managementdocker run -d --hostname rabbit2 --name myrabbit2 -p 5673:5672 --link myrabbit1:rabbit1 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-managementdocker run -d --hostname rabbit3 --name myrabbit3 -p 5674:5672 --link myrabbit1:rabbit1 --link myrabbit2:rabbit2 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-management具體的參數(shù)含義,參見(jiàn)上文“啟動(dòng)RabbitMQ”部分。
注意點(diǎn):
步驟二:加入RabbitMQ節(jié)點(diǎn)到集群
設(shè)置節(jié)點(diǎn)1:
docker exec -it myrabbit1 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit
設(shè)置節(jié)點(diǎn)2,加入到集群:
docker exec -it myrabbit2 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster –ram rabbit@rabbit1
rabbitmqctl start_app
exit
參數(shù)“–ram”表示設(shè)置為內(nèi)存節(jié)點(diǎn),忽略次參數(shù)默認(rèn)為磁盤(pán)節(jié)點(diǎn)。
設(shè)置節(jié)點(diǎn)3,加入到集群:
docker exec -it myrabbit3 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster –ram rabbit@rabbit1
rabbitmqctl start_app
exit
設(shè)置好之后,使用http://物理機(jī)ip:15672 進(jìn)行訪問(wèn)了,默認(rèn)賬號(hào)密碼是guest/guest,效果如下圖:
到此為止,我們已經(jīng)完成了RabbitMQ集群的建立,啟動(dòng)了3個(gè)節(jié)點(diǎn),1個(gè)磁盤(pán)節(jié)點(diǎn)和2個(gè)內(nèi)存節(jié)點(diǎn)。
設(shè)置節(jié)點(diǎn)類型
如果你想更換節(jié)點(diǎn)類型可以通過(guò)命令修改,如下:
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type dist
rabbitmqctl change_cluster_node_type ram
rabbitmqctl start_app
移除節(jié)點(diǎn)
如果想要把節(jié)點(diǎn)從集群中移除,可使用如下命令實(shí)現(xiàn):
rabbitmqctl stop_app
rabbitmqctl restart
rabbitmqctl start_app
集群重啟順序
集群重啟的順序是固定的,并且是相反的。如下所述:
- 啟動(dòng)順序:磁盤(pán)節(jié)點(diǎn) => 內(nèi)存節(jié)點(diǎn)
- 關(guān)閉順序:內(nèi)存節(jié)點(diǎn) => 磁盤(pán)節(jié)點(diǎn)
最后關(guān)閉必須是磁盤(pán)節(jié)點(diǎn),不然可能回造成集群?jiǎn)?dòng)失敗、數(shù)據(jù)丟失等異常情況。
六、鏡像隊(duì)列
鏡像隊(duì)列是Rabbit2.6.0版本帶來(lái)的一個(gè)新功能,允許內(nèi)建雙活冗余選項(xiàng),與普通隊(duì)列不同,鏡像節(jié)點(diǎn)在集群中的其他節(jié)點(diǎn)擁有從隊(duì)列拷貝,一旦主節(jié)點(diǎn)不可用,最老的從隊(duì)列將被選舉為新的主隊(duì)列。
鏡像隊(duì)列的工作原理:在某種程度上你可以將鏡像隊(duì)列視為,擁有一個(gè)隱藏的fanout交換器,它指示者信道將消息分發(fā)到從隊(duì)列上。
設(shè)置鏡像隊(duì)列
設(shè)置鏡像隊(duì)列命令:“rabbitmqctl set_policy 名稱 匹配模式(正則) 鏡像定義”, 例如,設(shè)置名稱為mypolicy的鏡像隊(duì)列,匹配所有名稱是amp開(kāi)頭的隊(duì)列都存儲(chǔ)在2個(gè)節(jié)點(diǎn)上的命令如下:
rabbitmqctl set_policy mypolicy “^amp*” ‘{“ha-mode”:”exactly”,”ha-params”:2}’
可以看出設(shè)置鏡像隊(duì)列,一共有三個(gè)參數(shù),每個(gè)參數(shù)用空格分割。
參數(shù)三:為鏡像隊(duì)列的主體規(guī)則,是json字符串,分為三個(gè)屬性:ha-mode | ha-params | ha-sync-mode,分別的解釋如下:
- ha-mode:鏡像模式,分類:all/exactly/nodes,all存儲(chǔ)在所有節(jié)點(diǎn);exactly存儲(chǔ)x個(gè)節(jié)點(diǎn),節(jié)點(diǎn)的個(gè)數(shù)由ha-params指定;nodes指定存儲(chǔ)的節(jié)點(diǎn)上名稱,通過(guò)ha-params指定;
- ha-params:作為參數(shù),為ha-mode的補(bǔ)充;
- ha-sync-mode:鏡像消息同步方式:automatic(自動(dòng)),manually(手動(dòng));
設(shè)置好鏡像隊(duì)列存儲(chǔ)2個(gè)節(jié)點(diǎn)的效果如下圖:
查看鏡像隊(duì)列
rabbitmqctl list_policies
刪除鏡像隊(duì)列
rabbitmqctl clear_policy
參考資料
書(shū)籍:《RabbitMQ實(shí)戰(zhàn)-高效部署分布式消息隊(duì)列》——不建議程序猿購(gòu)買(mǎi),偏運(yùn)維
https://www.cnblogs.com/luo-mao/p/5909889.html
https://www.jianshu.com/p/85543491ab00
長(zhǎng)按二維碼,關(guān)注更多作者動(dòng)態(tài)
總結(jié)
以上是生活随笔為你收集整理的你不知道的RabbitMQ集群架构全解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 单线程的Redis为什么却能支撑高并发?
- 下一篇: react native仿微信性别选择-