日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

你不知道的RabbitMQ集群架构全解

發(fā)布時間:2025/3/11 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 你不知道的RabbitMQ集群架构全解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

你不知道的RabbitMQ集群架構(gòu)全解

前言

本文將系統(tǒng)的介紹一下RabbitMQ集群架構(gòu)的特點、異常處理、搭建和使用中要注意的一些細(xì)節(jié)。

知識點

一、為什么使用集群?

二、集群的特點

三、集群異常處理

四、集群節(jié)點類型

五、集群搭建方法

六、鏡像隊列

一、為什么使用集群?

內(nèi)建集群作為RabbitMQ最優(yōu)秀的功能之一,它的作用有兩個:

  • 允許消費者和生產(chǎn)者在Rabbit節(jié)點崩潰的情況下繼續(xù)運行;
  • 通過增加節(jié)點來擴(kuò)展Rabbit處理更多的消息,承載更多的業(yè)務(wù)量;
  • 二、集群的特點

    RabbitMQ的集群是由多個節(jié)點組成的,但我們發(fā)現(xiàn)不是每個節(jié)點都有所有隊列的完全拷貝。

    RabbitMQ節(jié)點不完全拷貝特性

    為什么默認(rèn)情況下RabbitMQ不將所有隊列內(nèi)容和狀態(tài)復(fù)制到所有節(jié)點?

    有兩個原因:

  • 存儲空間——如果每個節(jié)點都擁有所有隊列的完全拷貝,這樣新增節(jié)點不但沒有新增存儲空間,反而增加了更多的冗余數(shù)據(jù)。
  • 性能——如果消息的發(fā)布需安全拷貝到每一個集群節(jié)點,那么新增節(jié)點對網(wǎng)絡(luò)和磁盤負(fù)載都會有增加,這樣違背了建立集群的初衷,新增節(jié)點并沒有提升處理消息的能力,最多是保持和單節(jié)點相同的性能甚至是更糟。
  • 所以其他非所有者節(jié)點只知道隊列的元數(shù)據(jù),和指向該隊列節(jié)點的指針。

    三、集群異常處理

    根據(jù)節(jié)點不無安全拷貝的特性,當(dāng)集群節(jié)點崩潰時,該節(jié)點隊列和關(guān)聯(lián)的綁定就都丟失了,附加在該隊列的消費者丟失了其訂閱的信息,那么怎么處理這個問題呢?

    這個問題要分為兩種情況:

  • 消息已經(jīng)進(jìn)行了持久化,那么當(dāng)節(jié)點恢復(fù),消息也恢復(fù)了;
  • 消息未持久化,可以使用下文要介紹的雙活冗余隊列,鏡像隊列保證消息的可靠性;
  • 四、集群節(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”部分。

    注意點:

  • 多個容器之間使用“–link”連接,此屬性不能少;
  • Erlang Cookie值必須相同,也就是RABBITMQ_ERLANG_COOKIE參數(shù)的值必須相同,原因見下文“配置相同Erlang Cookie”部分;
  • 步驟二:加入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ù)一:名稱,可以隨便填;
  • 參數(shù)二:隊列名稱的匹配規(guī)則,使用正則表達(dá)式表示;
  • 參數(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。