詳解RabbitMQ集群原理钮追,值得收藏

概述

一般來說晃财,如果只是為了學(xué)習(xí)RabbitMQ或者驗證業(yè)務(wù)工程的正確性那么在本地環(huán)境或者測試環(huán)境上使用其單實例部署就可以了,但是出于MQ中間件本身的可靠性建炫、并發(fā)性畦韭、吞吐量和消息堆積能力等問題的考慮,在生產(chǎn)環(huán)境上一般都會考慮使用RabbitMQ的集群方案肛跌。

一. RabbitMQ集群方案的原理

RabbitMQ本身是基于Erlang編寫艺配,Erlang語言天生具備分布式特性(通過同步Erlang集群各節(jié)點的erlang.cookie來實現(xiàn))。因此衍慎,RabbitMQ天然支持集群转唉。集群是保證可靠性的一種方式,同時可以通過水平擴展以達到增加消息吞吐量能力的目的稳捆。

下圖為集群的示例:

上面圖中采用三個節(jié)點組成了一個RabbitMQ的集群赠法,Exchange A(交換器)的元數(shù)據(jù)信息在所有節(jié)點上是一致的,而Queue(存放消息的隊列)的完整數(shù)據(jù)則只會存在于它所創(chuàng)建的那個節(jié)點上乔夯。砖织,其他節(jié)點只知道這個queue的metadata信息和一個指向queue的owner node的指針。

二. RabbitMQ集群元數(shù)據(jù)的同步

RabbitMQ集群會始終同步四種類型的內(nèi)部元數(shù)據(jù):

  • 隊列元數(shù)據(jù):隊列名稱和它的屬性
  • 交換器元數(shù)據(jù):交換器名稱驯嘱、類型和屬性
  • 綁定元數(shù)據(jù):一張簡單的表格展示了如何將消息路由到隊列
  • vhost元數(shù)據(jù):為vhost內(nèi)的隊列镶苞、交換器和綁定提供命名空間和安全屬性

因此,當(dāng)用戶訪問其中任何一個RabbitMQ節(jié)點時鞠评,通過rabbitmqctl查詢到的queue/user/exchange/vhost等信息都是相同的茂蚓。

為何RabbitMQ集群僅采用元數(shù)據(jù)同步的方式?

  1. 存儲空間。如果每個集群節(jié)點都擁有所有Queue的完全數(shù)據(jù)拷貝剃幌,那么每個節(jié)點的存儲空間會非常大聋涨,集群的消息積壓能力會非常弱(無法通過集群節(jié)點的擴容提高消息積壓能力);

  2. 性能负乡。消息的發(fā)布者需要將消息復(fù)制到每一個集群節(jié)點牍白,對于持久化消息,網(wǎng)絡(luò)和磁盤同步復(fù)制的開銷都會明顯增加抖棘。

三. RabbitMQ集群發(fā)送/訂閱消息的基本原理

RabbitMQ集群的工作原理圖如下:

客戶端直接連接隊列所在節(jié)點

如果有一個消息生產(chǎn)者或者消息消費者通過amqp-client的客戶端連接至節(jié)點1進行消息的發(fā)布或者訂閱茂腥,那么此時的集群中的消息收發(fā)只與節(jié)點1相關(guān)。

客戶端連接的是非隊列數(shù)據(jù)所在節(jié)點

如果消息生產(chǎn)者所連接的是節(jié)點2或者節(jié)點3切省,此時隊列1的完整數(shù)據(jù)不在該兩個節(jié)點上最岗,那么在發(fā)送消息過程中這兩個節(jié)點主要起了一個路由轉(zhuǎn)發(fā)作用,根據(jù)這兩個節(jié)點上的元數(shù)據(jù)轉(zhuǎn)發(fā)至節(jié)點1上朝捆,最終發(fā)送的消息還是會存儲至節(jié)點1的隊列1上般渡。同樣,如果消息消費者所連接的節(jié)點2或者節(jié)點3,那這兩個節(jié)點也會作為路由節(jié)點起到轉(zhuǎn)發(fā)作用驯用,將會從節(jié)點1的隊列1中拉取消息進行消費脸秽。

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

1. 磁盤節(jié)點

將配置信息和元信息存儲在磁盤上(單節(jié)點系統(tǒng)必須是磁盤節(jié)點,否則每次重啟RabbitMQ之后所有的系統(tǒng)配置信息都會丟失)蝴乔。

2. 內(nèi)存節(jié)點

將配置信息和元信息存儲在內(nèi)存中记餐。性能是優(yōu)于磁盤節(jié)點的。

RabbitMQ要求集群中至少有一個磁盤節(jié)點薇正,當(dāng)節(jié)點加入和離開集群時剥扣,必須通知磁盤節(jié)點(如果集群中唯一的磁盤節(jié)點崩潰了,則不能進行創(chuàng)建隊列铝穷、創(chuàng)建交換器、創(chuàng)建綁定佳魔、添加用戶曙聂、更改權(quán)限、添加和刪除集群節(jié)點)鞠鲜∧梗總之如果唯一磁盤的磁盤節(jié)點崩潰,集群是可以保持運行的贤姆,但不能更改任何東西榆苞。因此建議在集群中設(shè)置兩個磁盤節(jié)點,只要一個可以霞捡,就能正常操作坐漏。

總結(jié)

普通集群模式,并不保證隊列的高可用性碧信。盡管交換機赊琳、綁定這些可以復(fù)制到集群里的任何一個節(jié)點,但是隊列內(nèi)容不會復(fù)制砰碴。雖然該模式解決一項目組節(jié)點壓力躏筏,但隊列節(jié)點宕機直接導(dǎo)致該隊列無法應(yīng)用,只能等待重啟呈枉。所以要想在隊列節(jié)點宕機或故障也能正常應(yīng)用趁尼,就要復(fù)制隊列內(nèi)容到集群里的每個節(jié)點,也就是必須要創(chuàng)建鏡像隊列猖辫。篇幅有限酥泞,RabbitMQ鏡像隊列原理只能后面再分享了,感興趣的朋友可以關(guān)注下住册!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末婶博,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凡人,老刑警劉巖名党,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異挠轴,居然都是意外死亡传睹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門岸晦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欧啤,“玉大人,你說我怎么就攤上這事启上⌒纤恚” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵冈在,是天一觀的道長倒慧。 經(jīng)常有香客問我,道長包券,這世上最難降的妖魔是什么纫谅? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮溅固,結(jié)果婚禮上付秕,老公的妹妹穿的比我還像新娘。我一直安慰自己侍郭,他們只是感情好询吴,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著励幼,像睡著了一般汰寓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苹粟,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天有滑,我揣著相機與錄音,去河邊找鬼嵌削。 笑死毛好,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的苛秕。 我是一名探鬼主播肌访,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼艇劫!你這毒婦竟也來了吼驶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蟹演,沒想到半個月后风钻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡酒请,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年骡技,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羞反。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡布朦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出昼窗,到底是詐尸還是另有隱情是趴,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布澄惊,位于F島的核電站右遭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏缤削。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一吹榴、第九天 我趴在偏房一處隱蔽的房頂上張望亭敢。 院中可真熱鬧,春花似錦图筹、人聲如沸帅刀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扣溺。三九已至,卻和暖如春瓜晤,著一層夾襖步出監(jiān)牢的瞬間锥余,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工痢掠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留驱犹,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓足画,卻偏偏與公主長得像雄驹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子淹辞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • RabbitMQ 原理介紹及安裝部署 標(biāo)簽:RabbitMQ 安裝 簡介 RabbitMQ 是一個用 Erlang...
    神仙CGod閱讀 8,553評論 0 60
  • 什么叫消息隊列医舆? 消息(Message)是指在應(yīng)用間傳送的數(shù)據(jù)。消息可以非常簡單,比如只包含文本字符串蔬将,也可以更復(fù)...
    Agile_dev閱讀 2,368評論 0 24
  • 摘要:實際生產(chǎn)應(yīng)用中都會采用消息隊列的集群方案爷速,如果選擇RabbitMQ那么有必要了解下它的集群方案原理一般來說,...
    癲狂俠閱讀 74,158評論 11 97
  • 關(guān)于消息隊列娃胆,從前年開始斷斷續(xù)續(xù)看了些資料遍希,想寫很久了,但一直沒騰出空里烦,近來分別碰到幾個朋友聊這塊的技術(shù)選型凿蒜,是時...
    預(yù)流閱讀 584,416評論 51 785
  • 關(guān)于消息隊列,從前年開始斷斷續(xù)續(xù)看了些資料胁黑,想寫很久了废封,但一直沒騰出空,近來分別碰到幾個朋友聊這塊的技術(shù)選型丧蘸,是時...
    Johnson_zx閱讀 1,107評論 0 5