RabbitMQ集群架構(gòu)模式
主備模式
實(shí)現(xiàn)RabbitMQ的高可用集群,一般在并發(fā)和數(shù)據(jù)量不高的情況下,這種模式非常的好且簡(jiǎn)單丸逸。主備模式也稱為Warren模式
主備模式
:主節(jié)點(diǎn)提供讀寫超陆,從節(jié)點(diǎn)不提供讀寫服務(wù)谢肾,只是負(fù)責(zé)提供備份服務(wù)蟀俊,備份節(jié)點(diǎn)的主要功能是在主節(jié)點(diǎn)宕機(jī)時(shí)钦铺,完成自動(dòng)切換 從-->主,從而繼續(xù)提供服務(wù)
主從模式
:主節(jié)點(diǎn)提供讀寫肢预,從節(jié)點(diǎn)只讀
-
主備模式:所謂rabbitmq另外一種模式就是warren(兔子窩)矛洞,就是一個(gè)主/備方案(主節(jié)點(diǎn)如果掛了,從節(jié)點(diǎn)提供服務(wù)而已误甚,和activemq利用zookeeper做主/備一樣)
主備模式 HaProxy配置:
listen rabbitmq_cluster
bind 0.0.0.0:5672
mode tcp #配置TCP模式
balance roundrobin #簡(jiǎn)單的輪詢
server bhz76 192.168.11.12:5672 check inter 5000 rise 2 fall 3 #主節(jié)點(diǎn)
server bhz77 192.168.11.13:5672 backup check inter 5000 rise 2 fall 3 #備用節(jié)點(diǎn)
備注
:rabbitmq集群節(jié)點(diǎn)配置 #inter 每隔5秒對(duì)mq集群做健康檢查缚甩,2次正確證明服務(wù)器可用,3次失敗證明服務(wù)器不可用窑邦,并且配置主備機(jī)制
遠(yuǎn)程模式
遠(yuǎn)程模式:遠(yuǎn)距離通信和復(fù)制擅威, 遠(yuǎn)程模式可以實(shí)現(xiàn)雙活的一種模式,簡(jiǎn)稱 shovel 模式冈钦,所謂Shovel就是我們可以把消息進(jìn)行不同數(shù)據(jù)中心的復(fù)制工作郊丛,我們可以跨地域的讓兩個(gè)mq集群互聯(lián),遠(yuǎn)距離通信和復(fù)制瞧筛。我們下面看一下Shovel架構(gòu)模型:
如圖所示厉熟,有兩個(gè)異地的 MQ 集群(可以是更多的集群),當(dāng)用戶在地區(qū) 1 這里下單了较幌,系統(tǒng)發(fā)消息到 1 區(qū)的 MQ 服務(wù)器揍瑟,發(fā)現(xiàn) MQ 服務(wù)已超過設(shè)定的閾值,負(fù)載過高乍炉,這條消息就會(huì)被轉(zhuǎn)到 地區(qū) 2 的 MQ 服務(wù)器上绢片,由 2 區(qū)的去執(zhí)行后面的業(yè)務(wù)邏輯,相當(dāng)于分?jǐn)偽覀兊姆?wù)壓力岛琼。
在使用了 shovel 插件后底循,模型變成了近端同步確認(rèn),遠(yuǎn)端異步確認(rèn)的方式槐瑞,大大提高了訂單確認(rèn)速度熙涤,并且還能保證可靠性。
遠(yuǎn)程模式Shovel集群的拓?fù)鋱D:
如上圖所示困檩,當(dāng)我們的消息到達(dá) exchange祠挫,它會(huì)判斷當(dāng)前的負(fù)載情況以及設(shè)定的閾值,如果負(fù)載不高就把消息放到我們正常的 warehouse_goleta 隊(duì)列中悼沿,如果負(fù)載過高了等舔,就會(huì)放到 backup_orders 隊(duì)列中。backup_orders 隊(duì)列通過 shovel 插件與另外的 MQ 集群進(jìn)行同步數(shù)據(jù)显沈,把消息發(fā)到第二個(gè) MQ 集群上。
shovel 集群的配置,首先啟動(dòng) rabbitmq 插件拉讯,命令如下:
rabbitmq-plugins enable amqp_client
rabbitmq-plugins enable rabbitmq_shovel
- 創(chuàng)建rabbitmq.conf文件:touch /etc/rabbitmq/rabbitmq.config
- 添加配置見rabbitmq.config
- 最后我們需要資源服務(wù)器和目的服務(wù)器都使用相同的配置文件(rabbitmq.config)
具體配置 自行百度
鏡像模式(常用)
鏡像模式:集群模式非常經(jīng)典的就是Mirror鏡像模式涤浇,保證100%數(shù)據(jù)不丟失,在實(shí)際工作中用的最多的魔慷。并且實(shí)現(xiàn)集群非常的簡(jiǎn)單只锭,一般互聯(lián)網(wǎng)大廠都會(huì)構(gòu)建這種鏡像集群模式。
-
Mirror鏡像隊(duì)列院尔,目的是為了保證rabbitmq數(shù)據(jù)的高可靠性解決方案蜻展,主要就是實(shí)現(xiàn)數(shù)據(jù)的同步,一般來講是2-3個(gè)實(shí)現(xiàn)數(shù)據(jù)同步(對(duì)于100%數(shù)據(jù)可靠性解決方案一般是3個(gè)節(jié)點(diǎn))集群架構(gòu)如下:
RabbitMQ集群鏡像模式
如上圖所示邀摆,用 KeepAlived 做了 HA-Proxy 的高可用纵顾,然后有 3 個(gè)節(jié)點(diǎn)的 MQ 服務(wù),消息發(fā)送到主節(jié)點(diǎn)上栋盹,主節(jié)點(diǎn)通過 mirror 隊(duì)列把數(shù)據(jù)同步到其他的 MQ 節(jié)點(diǎn)施逾,這樣來實(shí)現(xiàn)其高可靠。
多活模式
多活模式:這種模式也是實(shí)現(xiàn)異地?cái)?shù)據(jù)復(fù)制的主流模式例获,因?yàn)镾hovel模式配置比較復(fù)雜汉额,所以一般來說實(shí)現(xiàn)異地集群都是使用雙活或者多活模式來實(shí)現(xiàn)的。這種模式需要依賴rabbitmq的federation插件榨汤,可以實(shí)現(xiàn)繼續(xù)的可靠AMQP數(shù)據(jù)通信蠕搜,多活模式在實(shí)際配置與應(yīng)用非常的簡(jiǎn)單。
-
RabbitMQ部署架構(gòu)采用雙中心模式(多中心)收壕,那么在兩套(或多套)數(shù)據(jù)中心中各部署一套R(shí)abbitMQ集群妓灌,各中心之間還需要實(shí)現(xiàn)部分隊(duì)列消息共享。多活集群架構(gòu)如下:
RabbitMQ集群多活模式
Federation插件是一個(gè)不需要構(gòu)建Cluster啼器,而在Brokers之間傳輸消息的高性能插件旬渠,F(xiàn)ederation插件可以在Brokers或者Cluster之間傳輸消息,連接雙方可以使用不同的users和vistual hosts端壳,雙方也可以使用版本不同的RabbitMQ和Erlang告丢。Federation插件使用AMQP協(xié)議通信,可以接收不連續(xù)的傳輸损谦。
如上圖所示岖免,F(xiàn)ederation Exchanges,可以看成Downstream從Upstream主動(dòng)拉取消息,但并不是拉取所有消息照捡,必須是在Downstream上已經(jīng)明確定義Bindings關(guān)系的Exchange颅湘,也就是有實(shí)際的物理Queue來接收消息,才會(huì)從Upstream拉取消息到Downstream栗精。使用AMQP協(xié)議實(shí)施代理間通信闯参,Downstream會(huì)將綁定關(guān)系組合在一起瞻鹏,綁定/解綁命令將會(huì)發(fā)送到Upstream交換機(jī)。因此鹿寨,F(xiàn)ederationExchange只接收具有訂閱的消息新博。
構(gòu)建高可靠的RabbitMQ集群
可以根據(jù)這個(gè)架構(gòu)圖,做一些RabbitMQ集群完善脚草,主要是將內(nèi)存節(jié)點(diǎn)作為負(fù)載赫悄,磁盤節(jié)點(diǎn)作為存儲(chǔ)。
RabbitMQ集群環(huán)境節(jié)點(diǎn)說明:
搭建RabbitMQ Server高可用集群:
搭建 RabbitMQ Server 高可用集群
RabbitMQ集群搭建和使用
https://www.cnblogs.com/xiaoxing/p/9258345.html
HAProxy
HAProxy是一款提供高可用性馏慨、負(fù)載均衡以及基于TCP(第四層)和HTTP(第七層)應(yīng)用的代理軟件埂淮,支持虛擬主機(jī),他是免費(fèi)写隶、快速并且可靠的一種解決方案倔撞。HAProxy特別適用于那些負(fù)載特大的web站點(diǎn),這些站點(diǎn)通常又需要會(huì)話保持或七層處理樟澜。HAProxy運(yùn)行在時(shí)下的硬件上误窖,完全可以支撐數(shù)以萬計(jì)的并發(fā)連接。并且它的運(yùn)行模式使得它可以很簡(jiǎn)單安全的整合進(jìn)您當(dāng)前的架構(gòu)中秩贰,同時(shí)可以保護(hù)你的web服務(wù)器不被暴露到網(wǎng)絡(luò)上霹俺。
HAProxy借助于OS上幾種常見的技術(shù)來實(shí)現(xiàn)性能的最大化:
- 1、單進(jìn)程毒费、時(shí)間驅(qū)動(dòng)模型顯著降低上下文切換的開銷及內(nèi)存占用
- 2丙唧、在任何可用的情況下,單緩沖(single buffering)機(jī)制能以不復(fù)制任何數(shù)據(jù)的方式完成讀寫操作觅玻,這會(huì)節(jié)約大量的CPU時(shí)鐘周期及內(nèi)存帶寬
- 3想际、借助于Linux2.6上的splice()系統(tǒng)調(diào)用,HAProxy可以實(shí)現(xiàn)零復(fù)制轉(zhuǎn)發(fā)(Zero-copy- forwarding)溪厘,在linux3.5及以上的OS上還可以實(shí)現(xiàn)零復(fù)制啟動(dòng)(zero-starting)
- 4胡本、內(nèi)存分配器在固定大小的內(nèi)存池中可實(shí)現(xiàn)即時(shí)內(nèi)存分配,這能夠顯著減少創(chuàng)建一個(gè)會(huì)話的時(shí)長(zhǎng)
- 5畸悬、樹型存儲(chǔ):側(cè)重于使用其作者多年前開發(fā)的彈性二叉樹侧甫,實(shí)現(xiàn)了以O(shè)(log(N))的低開銷來保持計(jì)時(shí)器命令、保持運(yùn)行隊(duì)列命令蹋宦、管理輪詢及最少連接隊(duì)列披粟。
Haproxy+keepalived高可用集群實(shí)戰(zhàn)
KeepAlived
KeepAlived軟件主要是通過VRRP協(xié)議實(shí)現(xiàn)高可用功能的。VRRP是Virtual Router RedundancyProtocol(虛擬路由器冗余協(xié)議)的縮寫冷冗,VRRP出現(xiàn)的目的就是為了解決靜態(tài)路由單點(diǎn)故障問題的守屉,它能保證黨個(gè)別節(jié)點(diǎn)宕機(jī)時(shí),整個(gè)網(wǎng)絡(luò)可以不間斷地運(yùn)行蒿辙,所以拇泛,KeepAlived一方面具有配置管理LVS的功能滨巴,同時(shí)還具備對(duì)LVS下面節(jié)點(diǎn)進(jìn)行健康檢查差的功能,另一方面可實(shí)現(xiàn)系統(tǒng)網(wǎng)絡(luò)服務(wù)的高可用功能俺叭。
KeepAlived服務(wù)的三個(gè)重要功能:
- 管理LVS負(fù)載均衡軟件
- 實(shí)現(xiàn)LVS集群節(jié)點(diǎn)的健康檢查
- 作為系統(tǒng)網(wǎng)絡(luò)服務(wù)的高可用性(failover)
KeepAlived高可用原理
KeepAlived高可用服務(wù)對(duì)之間的故障轉(zhuǎn)移兢卵,是通過VRRP(Virtual Router Redundancy Protocol,虛擬路由器冗余協(xié)議)來實(shí)現(xiàn)的。在KeepAlived服務(wù)正常工作是绪颖,主Master節(jié)點(diǎn)會(huì)不斷地向備節(jié)點(diǎn)發(fā)送(多播的方式)心跳消息,用以告訴備Backup節(jié)點(diǎn)自己還活著甜奄,當(dāng)主master節(jié)點(diǎn)發(fā)生故障時(shí)柠横,就無法發(fā)送心跳消息,備節(jié)點(diǎn)也就因此無法繼續(xù)監(jiān)測(cè)到來自主Master節(jié)點(diǎn)的心跳了课兄,于是調(diào)用自身的接管程序牍氛,接管主Master節(jié)點(diǎn) 的IP資源及服務(wù)。當(dāng)主Master節(jié)點(diǎn)恢復(fù)時(shí)烟阐,備Backup節(jié)點(diǎn)又會(huì)釋放主節(jié)點(diǎn)故障時(shí)自身接管的IP資源和服務(wù)搬俊,恢復(fù)到原來的備用角色。
Haproxy+Keepalived高可用環(huán)境部署梳理:
https://www.cnblogs.com/mrlapulga/p/6871936.html
https://www.cnblogs.com/zhangan/p/10930570.html
https://www.cnblogs.com/kevingrace/p/5892169.html
RabbitMQ集群配置文件詳解
- tcp_listeners 設(shè)置rabbitmq的監(jiān)聽端口蜒茄,默認(rèn)為5672
- disk_free_limit 磁盤低水位線唉擂,若磁盤容量低于指定值則停止接收數(shù)據(jù),默認(rèn)值為{mem_relative, 1.0}, 即與內(nèi)存相關(guān)聯(lián)1:1檀葛,也可定制為多少byte.
- vm_memeory_high_watemark玩祟, 設(shè)置內(nèi)存低水位線,若低于該水位線屿聋,則開啟流控機(jī)制空扎,默認(rèn)值為0.4,即內(nèi)存總量的40%
- hipe_compile將部分rabbitmq代碼用High Performance Erlang compiler編譯润讥,可提升性能转锈,該參數(shù)是實(shí)驗(yàn)性,若出現(xiàn)erlang vm segfaults楚殿,應(yīng)關(guān)掉
- force_fine_statistics撮慨,該參數(shù)屬于rabbitmq_mamagement,若為true這進(jìn)行精細(xì)化統(tǒng)計(jì)勒魔,但會(huì)影響性能
- 集群節(jié)點(diǎn)模式:Disk為磁盤模式存儲(chǔ) / Ram為內(nèi)存模式存儲(chǔ)
RabbitMQ集群恢復(fù)與故障轉(zhuǎn)移
RabbitMQ 鏡像隊(duì)列集群的幾種故障場(chǎng)景 以及對(duì)應(yīng)的恢復(fù)方案:
前提: 節(jié)點(diǎn) A 和節(jié)點(diǎn) B 組成一個(gè)鏡像隊(duì)列
- 場(chǎng)景1:A 先停了甫煞,B 后停
解決方案:該場(chǎng)景下 B 是 master,主要先啟動(dòng) B冠绢,再啟動(dòng) A 即可抚吠。或者 先啟動(dòng) A弟胀,在 30 秒內(nèi)啟動(dòng) B 即可恢復(fù)鏡像隊(duì)列
- 場(chǎng)景2:A楷力、B 同時(shí)停機(jī)
解決方案:該場(chǎng)景可能是由于機(jī)房掉電等原因造成的喊式,只需要在 30 秒之內(nèi)連續(xù)啟動(dòng) A 和 B 即可恢復(fù)鏡像隊(duì)列
- 場(chǎng)景 3 : A先停,B 后停萧朝,且 A 無法恢復(fù)
解決方案: 該場(chǎng)景是 場(chǎng)景 1 的加強(qiáng)版岔留,因?yàn)?B 是 master, 所以等 B 起來以后检柬,在 B 節(jié)點(diǎn)上調(diào)用控制臺(tái)命令: rabbitmqctl forget_cluster_node A 解除與 A 的 cluster 關(guān)系献联,再將新的 slave 節(jié)點(diǎn)加入 B 即可重新恢復(fù)鏡像隊(duì)列
- 場(chǎng)景 4: A 先停,B 后停何址,且 B 無法恢復(fù)
方案:該場(chǎng)景是場(chǎng)景 3 的升級(jí)版里逆,比較難處理,原因是 因?yàn)?master 節(jié)點(diǎn)無法恢復(fù)用爪。在 3.1.X 時(shí)代之前沒有什么好的解決方案原押,但是在 3.4.2 以后的版本可以試試 - -offline 這個(gè)參數(shù)。
因?yàn)?B 是 主節(jié)點(diǎn)偎血,所以直接啟動(dòng) A 是不行的诸衔,當(dāng) A 無法啟動(dòng)的時(shí)候,也就沒有辦法在 A 節(jié)點(diǎn)上調(diào)用之前的 rabbitmq forget_cluster_node B 命令了颇玷。新版本中笨农, forget_cluster_node 支持 -offline 參數(shù)。這就意味著允許 rabbitmqctl 在理想節(jié)點(diǎn)上執(zhí)行該命令帖渠,迫使 rabbitMQ 會(huì) mock 一個(gè) 一個(gè)節(jié)點(diǎn)代表 A磁餐,執(zhí)行 forget_cluster_node 命令將 B 剔除 cluster,然后 A 就可以正常啟動(dòng)了阿弃,最后將新的 slave 節(jié)點(diǎn)加入 A 即可重新恢復(fù)鏡像隊(duì)列
- 場(chǎng)景 5 : A 先停诊霹,B 后停,且 A渣淳、B 均無法恢復(fù)脾还,但是能得到 A 或 B 的磁盤文件
方案:只能通過恢復(fù)數(shù)據(jù)的方式進(jìn)行嘗試恢復(fù),將 A 或 B 的數(shù)據(jù)庫(kù)文件 默認(rèn)在 $RABBIT_HOME/var/lib/ 目錄下入愧,把它 拷貝到新節(jié)點(diǎn)的對(duì)應(yīng)目錄下鄙漏,再將新節(jié)點(diǎn)的 hostname 改成 A 或者 B 的 hostname。如果是 A 節(jié)點(diǎn)(slave)的磁盤文件棺蛛,則按照?qǐng)鼍?4 處理即可怔蚌;如果是 B 節(jié)點(diǎn)(master)的磁盤文件,則按照?qǐng)鼍?3 處理旁赊,最后將新的 slave 加入到新節(jié)點(diǎn)后完成恢復(fù)桦踊。
- 場(chǎng)景 6: A 先停、B 后停终畅,且 A 籍胯、B 均無法恢復(fù)竟闪,且得不到 A 或 B 的磁盤文件
方案:可以洗洗睡了~沒有方案,解決不了杖狼!
高級(jí)插件的使用
延遲插件(即延遲隊(duì)列)的作用:
比如消息的延遲推送炼蛤、定時(shí)任務(wù)(消息)的執(zhí)行。包括一些消息重試策略的配合使用蝶涩,以及用于業(yè)務(wù)削峰限流理朋、降級(jí)的異步延遲消息機(jī)制,都是延遲隊(duì)列的實(shí)際應(yīng)用場(chǎng)景绿聘。
延遲插件的安裝:
- 1暗挑、下載插件(兩種方式):
A、下載zip包斜友,下載地址:http://www.rabbitmq.com/community-plugins.html
image.png
/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/plugins
B、在指定目錄下載該插件:/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/plugins 目錄下執(zhí)行wget https://dl.bintray.com/rabbitmq/community-plugins/3.6.x/rabbitmq_delayed_message_exchange/rabbitmq_delayed_message_exchange-20171215-3.6.x.zip
- 2垃它、將插件/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/plugins 目錄下
解壓插件:unzip rabbitmq_delayed_message_exchange-20171215-3.6.x.zip
- 3鲜屏、啟動(dòng)延時(shí)插件:rabbitmq-plugins enable rabbitmq_delayed_message_exchange
-
4、訪問地址: http://{ip}:15672/#/exchanges
image.png
Rabbitmq的延遲消息隊(duì)列實(shí)現(xiàn):
rabbitmq的延遲消息隊(duì)列實(shí)現(xiàn)
RabbitMQ 延遲隊(duì)列插件應(yīng)用 以及 java 代碼使用延遲消息
參考:
http://www.reibang.com/p/588e1c959f03
http://www.reibang.com/p/b7cc32b94d2a
http://www.reibang.com/p/8fe6947efa53