本文將系統的介紹一下RabbitMQ集羣架構的特色、異常處理、搭建和使用中要注意的一些細節。html
知識點node
1、爲何使用集羣?正則表達式
2、集羣的特色docker
3、集羣異常處理json
4、集羣節點類型安全
5、集羣搭建方法bash
6、鏡像隊列服務器
內建集羣做爲RabbitMQ最優秀的功能之一,它的做用有兩個:cookie
RabbitMQ的集羣是由多個節點組成的,但咱們發現不是每一個節點都有全部隊列的徹底拷貝。網絡
RabbitMQ節點不徹底拷貝特性
爲何默認狀況下RabbitMQ不將全部隊列內容和狀態複製到全部節點?
有兩個緣由:
因此其餘非全部者節點只知道隊列的元數據,和指向該隊列節點的指針。
根據節點不無安全拷貝的特性,當集羣節點崩潰時,該節點隊列和關聯的綁定就都丟失了,附加在該隊列的消費者丟失了其訂閱的信息,那麼怎麼處理這個問題呢?
這個問題要分爲兩種狀況:
節點的存儲類型分爲兩種:
磁盤節點就是配置信息和元信息存儲在磁盤上,內次節點把這些信息存儲在內存中,固然內次節點的性能是大大超越磁盤節點的。
單節點系統必須是磁盤節點,不然每次你重啓RabbitMQ以後全部的系統配置信息都會丟失。
RabbitMQ要求集羣中至少有一個磁盤節點,當節點加入和離開集羣時,必須通知磁盤節點。
若是集羣中的惟一一個磁盤節點,結果這個磁盤節點還崩潰了,那會發生什麼狀況?
若是惟一磁盤的磁盤節點崩潰了,不能進行以下操做:
總結:若是惟一磁盤的磁盤節點崩潰,集羣是能夠保持運行的,但你不能更改任何東西。
解決方案:在集羣中設置兩個磁盤節點,只要一個能夠,你就能正常操做。
本章咱們用Docker來建立RabbitMQ集羣,一來是由於操做簡便,二是由於能夠更充分的利用服務器硬件資源,三來是Docker也是如今的主流部署方案,關於更多的Docker詳情能夠查看個人另外一篇:《使用Docker部署RabbitMQ集羣)》 接下來,進入咱們的正文,集羣搭建分爲兩步:
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」部分。
注意點:
設置節點1:
docker exec -it myrabbit1 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit
設置節點2,加入到集羣:
docker exec -it myrabbit2 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbit1
rabbitmqctl start_app
exit
參數「--ram」表示設置爲內存節點,忽略次參數默認爲磁盤節點。
設置節點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個節點,1個磁盤節點和2個內存節點。
若是你想更換節點類型能夠經過命令修改,以下:
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type dist
rabbitmqctl change_cluster_node_type ram
rabbitmqctl start_app
若是想要把節點從集羣中移除,可以使用以下命令實現:
rabbitmqctl stop_app
rabbitmqctl restart
rabbitmqctl start_app
集羣重啓的順序是固定的,而且是相反的。以下所述:
最後關閉必須是磁盤節點,否則可能回形成集羣啓動失敗、數據丟失等異常狀況。
鏡像隊列是Rabbit2.6.0版本帶來的一個新功能,容許內建雙活冗餘選項,與普通隊列不一樣,鏡像節點在集羣中的其餘節點擁有從隊列拷貝,一旦主節點不可用,最老的從隊列將被選舉爲新的主隊列。
鏡像隊列的工做原理:在某種程度上你能夠將鏡像隊列視爲,擁有一個隱藏的fanout交換器,它指示者信道將消息分發到從隊列上。
設置鏡像隊列命令:「rabbitmqctl set_policy 名稱 匹配模式(正則) 鏡像定義」, 例如,設置名稱爲mypolicy的鏡像隊列,匹配全部名稱是amp開頭的隊列都存儲在2個節點上的命令以下:
rabbitmqctl set_policy mypolicy "^amp*" '{"ha-mode":"exactly","ha-params":2}'
能夠看出設置鏡像隊列,一共有三個參數,每一個參數用空格分割。
設置好鏡像隊列存儲2個節點的效果以下圖:
rabbitmqctl list_policies
rabbitmqctl clear_policy
書籍:《RabbitMQ實戰-高效部署分佈式消息隊列》——不建議程序猿購買,偏運維 https://www.cnblogs.com/luo-mao/p/5909889.html https://www.jianshu.com/p/85543491ab00