您好,登錄后才能下訂單哦!
這篇文章主要介紹了RabbitMQ集群架構的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
內建集群作為RabbitMQ最優(yōu)秀的功能之一,它的作用有兩個:
允許消費者和生產者在Rabbit節(jié)點崩潰的情況下繼續(xù)運行;
通過增加節(jié)點來擴展Rabbit處理更多的消息,承載更多的業(yè)務量;
RabbitMQ的集群是由多個節(jié)點組成的,但我們發(fā)現不是每個節(jié)點都有所有隊列的完全拷貝。
RabbitMQ節(jié)點不完全拷貝特性
為什么默認情況下RabbitMQ不將所有隊列內容和狀態(tài)復制到所有節(jié)點?
有兩個原因:
存儲空間——如果每個節(jié)點都擁有所有隊列的完全拷貝,這樣新增節(jié)點不但沒有新增存儲空間,反而增加了更多的冗余數據。
性能——如果消息的發(fā)布需安全拷貝到每一個集群節(jié)點,那么新增節(jié)點對網絡和磁盤負載都會有增加,這樣違背了建立集群的初衷,新增節(jié)點并沒有提升處理消息的能力,最多是保持和單節(jié)點相同的性能甚至是更糟。
所以其他非所有者節(jié)點只知道隊列的元數據,和指向該隊列節(jié)點的指針。
根據節(jié)點不無安全拷貝的特性,當集群節(jié)點崩潰時,該節(jié)點隊列和關聯的綁定就都丟失了,附加在該隊列的消費者丟失了其訂閱的信息,那么怎么處理這個問題呢?
這個問題要分為兩種情況:
消息已經進行了持久化,那么當節(jié)點恢復,消息也恢復了;
消息未持久化,可以使用下文要介紹的雙活冗余隊列,鏡像隊列保證消息的可靠性;
節(jié)點的存儲類型分為兩種:
磁盤節(jié)點
內存節(jié)點
磁盤節(jié)點就是配置信息和元信息存儲在磁盤上,內次節(jié)點把這些信息存儲在內存中,當然內次節(jié)點的性能是大大超越磁盤節(jié)點的。
單節(jié)點系統必須是磁盤節(jié)點,否則每次你重啟RabbitMQ之后所有的系統配置信息都會丟失。
RabbitMQ要求集群中至少有一個磁盤節(jié)點,當節(jié)點加入和離開集群時,必須通知磁盤節(jié)點。
如果集群中的唯一一個磁盤節(jié)點,結果這個磁盤節(jié)點還崩潰了,那會發(fā)生什么情況?
如果唯一磁盤的磁盤節(jié)點崩潰了,不能進行如下操作:
不能創(chuàng)建隊列
不能創(chuàng)建交換器
不能創(chuàng)建綁定
不能添加用戶
不能更改權限
不能添加和刪除集群幾點
總結:如果唯一磁盤的磁盤節(jié)點崩潰,集群是可以保持運行的,但你不能更改任何東西。
解決方案:在集群中設置兩個磁盤節(jié)點,只要一個可以,你就能正常操作。
本章我們用Docker來創(chuàng)建RabbitMQ集群,一來是因為操作簡便,二是因為可以更充分的利用服務器硬件資源,三來是Docker也是現在的主流部署方案,關于更多的Docker詳情可以查看我的另一篇: 《使用Docker部署RabbitMQ集群)》 接下來,進入我們的正文,集群搭建分為兩步:
步驟一:安裝多個RabbitMQ
步驟二:加入RabbitMQ節(jié)點到集群
docker run -d --hostname rabbit1 --name myrabbit1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-management docker run -d --hostname rabbit2 --name myrabbit2 -p 5673:5672 --link myrabbit1:rabbit1 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-management docker 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
具體的參數含義,參見上文“啟動RabbitMQ”部分。
注意點:
多個容器之間使用“--link”連接,此屬性不能少;
Erlang Cookie值必須相同,也就是RABBITMQ_ERLANG_COOKIE參數的值必須相同,原因見下文“配置相同Erlang Cookie”部分;
設置節(jié)點1:
docker exec -it myrabbit1 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit
設置節(jié)點2,加入到集群:
docker exec -it myrabbit2 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbit1
rabbitmqctl start_app
exit
參數“--ram”表示設置為內存節(jié)點,忽略次參數默認為磁盤節(jié)點。
設置節(jié)點3,加入到集群:
docker exec -it myrabbit3 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbit1
rabbitmqctl start_app
exit
設置好之后,使用http://物理機ip:15672 進行訪問了,默認賬號密碼是guest/guest,效果如下圖:
到此為止,我們已經完成了RabbitMQ集群的建立,啟動了3個節(jié)點,1個磁盤節(jié)點和2個內存節(jié)點。
如果你想更換節(jié)點類型可以通過命令修改,如下:
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type dist
rabbitmqctl change_cluster_node_type ram
rabbitmqctl start_app
如果想要把節(jié)點從集群中移除,可使用如下命令實現:
rabbitmqctl stop_app
rabbitmqctl restart
rabbitmqctl start_app
集群重啟的順序是固定的,并且是相反的。如下所述:
啟動順序:磁盤節(jié)點 => 內存節(jié)點
關閉順序:內存節(jié)點 => 磁盤節(jié)點
最后關閉必須是磁盤節(jié)點,不然可能回造成集群啟動失敗、數據丟失等異常情況。
鏡像隊列是Rabbit2.6.0版本帶來的一個新功能,允許內建雙活冗余選項,與普通隊列不同,鏡像節(jié)點在集群中的其他節(jié)點擁有從隊列拷貝,一旦主節(jié)點不可用,最老的從隊列將被選舉為新的主隊列。
鏡像隊列的工作原理:在某種程度上你可以將鏡像隊列視為,擁有一個隱藏的fanout交換器,它指示者信道將消息分發(fā)到從隊列上。
設置鏡像隊列命令:“rabbitmqctl set_policy 名稱 匹配模式(正則) 鏡像定義”, 例如,設置名稱為mypolicy的鏡像隊列,匹配所有名稱是amp開頭的隊列都存儲在2個節(jié)點上的命令如下:
rabbitmqctl set_policy mypolicy "^amp*" '{"ha-mode":"exactly","ha-params":2}'
可以看出設置鏡像隊列,一共有三個參數,每個參數用空格分割。
參數一:名稱,可以隨便填;
參數二:隊列名稱的匹配規(guī)則,使用正則表達式表示;
參數三:為鏡像隊列的主體規(guī)則,是json字符串,分為三個屬性:ha-mode | ha-params | ha-sync-mode,分別的解釋如下:
ha-mode:鏡像模式,分類:all/exactly/nodes,all存儲在所有節(jié)點;exactly存儲x個節(jié)點,節(jié)點的個數由ha-params指定;nodes指定存儲的節(jié)點上名稱,通過ha-params指定;
ha-params:作為參數,為ha-mode的補充;
ha-sync-mode:鏡像消息同步方式:automatic(自動),manually(手動);
設置好鏡像隊列存儲2個節(jié)點的效果如下圖:
rabbitmqctl list_policies
rabbitmqctl clear_policy
感謝你能夠認真閱讀完這篇文章,希望小編分享的“RabbitMQ集群架構的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業(yè)資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。