RabbitMQ 的高可用集羣

RabbitMQ 的高可用性

RabbitMQ 是比較有表明性的,由於是基於主從非分佈式)作高可用的服務器

RabbitMQ 有三種模式:單機模式、普通集羣模式、鏡像集羣模式。微信

單機模式

單機模式,生產幾乎不用。網絡

普通集羣模式(無高可用性)

普通集羣模式,有服務器ABC,在服務器ABC上分別啓動RabbitMQ實例,生產者生產消息1,隨機發給某一實例A,實例BC 上記錄消息1的原數據信息(好比消息1具體信息在示例A上),消費者消費消息,隨機鏈接某個示例B,消費消息1,實例B根據 原數據發現消息1在實例A上,則實例B去實例A拉取消息返回給消費者。分佈式

就是個普通集羣。由於這致使你要麼消費者每次隨機鏈接一個實例而後拉取數據,要麼固定鏈接那個 queue 所在實例消費數據,前者有數據拉取的開銷,後者致使單實例性能瓶頸性能

並且若是那個放 queue 的實例宕機了,會致使接下來其餘實例就沒法從那個實例拉取,若是你開啓了消息持久化,讓 RabbitMQ 落地存儲消息的話,消息不必定會丟,得等這個實例恢復了,而後才能夠繼續從這個 queue 拉取數據。3d

因此這個事兒就比較尷尬了,這就沒有什麼所謂的高可用性,這方案主要是提升吞吐量的,就是說讓集羣中多個節點來服務某個 queue 的讀寫操做。blog

鏡像集羣模式(高可用性)

這種模式,纔是所謂的 RabbitMQ 的高可用模式。跟普通集羣模式不同的是,在鏡像集羣模式下,你建立的 queue,不管元數據仍是 queue 裏的消息都會存在於多個實例上,就是說,每一個 RabbitMQ 節點都有這個 queue 的一個完整鏡像,包含 queue 的所有數據的意思。而後每次你寫消息到 queue 的時候,都會自動把消息同步到多個實例的 queue 上。同步

那麼如何開啓這個鏡像集羣模式呢?其實很簡單,RabbitMQ 有很好的管理控制檯,就是在後臺新增一個策略,這個策略是鏡像集羣模式的策略,指定的時候是能夠要求數據同步到全部節點的,也能夠要求同步到指定數量的節點,再次建立 queue 的時候,應用這個策略,就會自動將數據同步到其餘的節點上去了。it

這樣的話,好處在於,你任何一個機器宕機了,沒事兒,其它機器(節點)還包含了這個 queue 的完整數據,別的 consumer 均可以到其它節點上去消費數據。壞處在於,第一,這個性能開銷也太大了吧,消息須要同步到全部機器上,致使網絡帶寬壓力和消耗很重!第二,這麼玩兒,不是分佈式的,就沒有擴展性可言了,若是某個 queue 負載很重,你加機器,新增的機器也包含了這個 queue 的全部數據,並無辦法線性擴展你的 queue。你想,若是這個 queue 的數據量很大,大到這個機器上的容量沒法容納了,此時該怎麼辦呢?集羣

如感受文章對你有所幫助,能夠關注微信公衆號【五彩的顏色】鼓勵一下

相關文章
相關標籤/搜索