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