rabbitmq叢集(一)介紹
rabbitmq,以下簡寫為RM
一:介紹
RM內建立叢集有兩個目標:
1、允許生產者和消費者在rabbit節點崩潰的情況下繼續允許。
2、通過新增更多節點來線性擴充套件訊息通訊吞吐量。
二:叢集架構
RM會始終記錄以下四種類型的內部元資料:
佇列元資料:佇列名稱和他們的屬性(是否持久化,是否自動刪除)
交換器元資料:交換器名稱、型別和屬性(可持久化等)
繫結元資料:一張表,展示瞭如何將訊息路由到佇列
vhost元資料:為vhost內的佇列、交換器和繫結提供名稱空間和安全屬性
對於單一的節點,RM把以上這些資訊存在記憶體,同時將標記為可持久化的佇列和交換器,以及繫結關係存到硬碟,確保重啟時可以重建佇列和交換機。 當引入叢集時,RM需要追蹤新的元資料型別:叢集節點的位置,還有節點與其他型別元資料的關係。
RM叢集內元資料儲存有兩種方式:
1、存在硬碟上(獨立節點預設設定)
2、存在RAM上
在深入叢集節點和如何儲存元資料前,先來理解一下叢集環境中的佇列和交換器行為。
叢集中的佇列:
單一節點中,佇列所有資訊(元資料,內容,狀態)都儲存於該節點上;在叢集中,只有某個節點會儲存佇列的全部資訊(該節點稱為佇列的所有者),而其他節點只儲存佇列的元資料和佇列所有者的指標。 當叢集節點崩潰時,會失去該節點的佇列和所關聯的繫結,這個時候我們怎麼辦呢? 有兩種方法:
1、如果最開始時,佇列被設定為可持久化,那麼就恢復故障節點。
2、如果佇列沒有設定為可持久化,消費者可以重連到叢集重新建立佇列。(如果最開始佇列設定持久化,那麼重新連線叢集建立佇列時會得到404錯誤,這是為了確保失敗節點恢復後加入叢集,不會丟失原來的佇列訊息)
問題:為什麼預設狀態下RM不將佇列內容和狀態複製到所有節點呢?
兩個原因:
1、儲存空間:如果所有節點都擁有佇列的完整拷貝,那麼新增新節點不會帶來更多儲存空間。
2、效能:如果每條資訊都複製到所有節點,對於持久化訊息,每一條都會觸發磁碟活動。當增加節點時,網路和磁碟負載都會增加。
分佈交換器:
其實交換器並不是一個實體,不像佇列擁有自己的程序,它只是一個名稱和一個佇列繫結列表。 當訊息釋出到交換器時 ,其實是由通道(channel)根據訊息的key去匹配列表,然後路由到佇列中。
當建立一個exchange時,RM將查詢列表新增到所有節點上,這樣每個節點上的channel都可以訪問它了。當節點故障時,只需要重新連線到叢集即可使用,不用重新建立。
記憶體節點和磁碟節點:
單節點系統只允許磁碟型別的節點,否則重啟RM後,所有系統配置資訊會丟失。
在叢集中,為了效能,大多數節點配置為記憶體節點,RM要求至少一個磁碟節點,但是一般我們配置兩個或以上(根據需要),原因是:
1、磁碟節點故障後,叢集可以執行,但是不能更改任何東西,如:建立佇列,,建立交換器,,建立繫結,,新增使用者,,更改許可權,,新增或刪除節點。所以設定只配置一個沒有保障。
2、新增記憶體節點或是記憶體節點重啟時,它會連線到預先配置的磁碟節點下載叢集的元資料拷貝,那如果這個時候磁碟節點剛好故障怎麼辦?記憶體節點就無法找到叢集。所以我們最好配置兩個以上的磁碟節點,並且全部告知該記憶體節點。(只要記憶體節點可以找到一個磁碟節點,就可以加入叢集)
下一節開始搭建叢集