? ? ? ? 【高可用篇】
? ? ? ? 做高可用的目的:允許個別節(jié)點(diǎn)崩潰的情況下繼續(xù)平穩(wěn)運(yùn)行,可以通過動態(tài)擴(kuò)容來增加吞吐量。
? ? ? ? RabbitMQ的Cluster集群分為兩種情況:普通集群模式 和 鏡像模式;
? ? ? ? 一、普通模式
? ? ? ? 默認(rèn)的集群模式,以兩個rabbit01和rabbit02為例來進(jìn)行說明。對于Queue來說,消息實(shí)體只存在于其中一個節(jié)點(diǎn)rabbit01,rabbit01和rabbit02兩個節(jié)點(diǎn)僅有相同的元數(shù)據(jù),即隊(duì)列的結(jié)構(gòu)。當(dāng)消息進(jìn)入rabbit01節(jié)點(diǎn)的queue后,如果consumer從rabbit02節(jié)點(diǎn)進(jìn)行消費(fèi),broker會臨時在rabbit01和rabbit02之間進(jìn)行消息傳輸,把rabbit01節(jié)點(diǎn)的消息實(shí)體取出后,經(jīng)過rabbit02發(fā)送給consumer。所以consumer應(yīng)盡量連接每一個節(jié)點(diǎn),從中拉取消息。
? ? ? ? 上述過程存在一個明顯的缺點(diǎn),即consumer無論是連接rabbit01還是rabbit02,如果入口總是在rabbit01,那么瓶頸就在rabbit01上面,如果rabbit01掛掉的話,則會造成消費(fèi)者無法消費(fèi)到消息,此類問題屬于單節(jié)點(diǎn)依賴問題。
? ? ? ? 要避免該模式的缺陷,合理的方式是對于同一個邏輯隊(duì)列,在多個節(jié)點(diǎn)建立物理Queue,從而避免掉單節(jié)點(diǎn)的依賴問題。
? ? ? ? 二、鏡像模式
? ? ? ? 將需要消費(fèi)的隊(duì)列變?yōu)殓R像隊(duì)列,存在于多個節(jié)點(diǎn),這樣就實(shí)現(xiàn)了HA,消息實(shí)體會主動在鏡像節(jié)點(diǎn)之間同步,而不像普通模式那樣,在consumer消費(fèi)時才臨時讀取。
? ? ? ? 鏡像模式的缺點(diǎn)就是在集群內(nèi)部的同步通訊會占用額外的帶寬。
? ? ? ? 三、設(shè)置鏡像模式
? ? ? ? 設(shè)置鏡像隊(duì)列的命令:“rabbitmqctl set_policy 名稱 匹配模式(正則) 鏡像定義”
? ? ? ? 例如:rabbitmqctl set_policy? ?hapolicy? ?"^"? ?'{"ha-mode":"exactly","ha-params":2}'
? ? ? ? 可以看出,設(shè)置鏡像模式一共需要三個參數(shù),參數(shù)之間用空格分割
? ? ? ? 四、鏡像參數(shù)解讀
? ? ? ? 1? 參數(shù)一:hapolicy? 代表策略名稱,內(nèi)容自定義;
? ? ? ? 2? 參數(shù)二:"^"? 隊(duì)列名稱的匹配規(guī)則,使用正則表達(dá)式表示,^代表匹配所有;
? ? ? ? 3? 參數(shù)三:為鏡像隊(duì)列的主體規(guī)則,是個json字符串,分為三個屬性,ha-mode | ha-params | ha-sync-mode,詳細(xì)解釋如下:
? ??????ha-mode:鏡像模式,分類:all/exactly/nodes,all存儲在所有節(jié)點(diǎn);exactly存儲x個節(jié)點(diǎn),節(jié)點(diǎn)的個數(shù)由ha-params指定;nodes指定存儲的節(jié)點(diǎn)上名稱,通過ha-params指定;
? ??????ha-params:作為參數(shù),為ha-mode的補(bǔ)充;
? ??????ha-sync-mode:鏡像消息同步方式:automatic(自動),manually(手動);
? ??????