溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么進(jìn)行RabbitMQ鏡像隊(duì)列分析

發(fā)布時(shí)間:2021-12-09 15:22:13 來(lái)源:億速云 閱讀:148 作者:柒染 欄目:大數(shù)據(jù)

怎么進(jìn)行RabbitMQ鏡像隊(duì)列分析,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

鏡像隊(duì)列的主要作用是用來(lái)解決隊(duì)列的單點(diǎn)故障。

鏡像隊(duì)列主要有兩種類型:master和slave。master和slave節(jié)點(diǎn)位于同一個(gè)集群中。master只要一個(gè)節(jié)點(diǎn),slave可以有多個(gè)節(jié)點(diǎn)。

生產(chǎn)者發(fā)送到主節(jié)點(diǎn)消息會(huì)同時(shí)被發(fā)往各個(gè)slave節(jié)點(diǎn),除了發(fā)送消息,其他動(dòng)作只會(huì)發(fā)給master,然后通過master廣播給其他slave。

master掛掉以后,根據(jù)slave加入的時(shí)間順序排列,時(shí)間長(zhǎng)的提升為master。

鏡像隊(duì)列的backing_queue不再使用rabbit_variable_queue。master節(jié)點(diǎn)的queue使用rabbit_mirror_queue_master,它內(nèi)部包裹了普通backing_queue進(jìn)行本地消息消息持久化處理,在此基礎(chǔ)上增加了將消息和ack復(fù)制到所有鏡像的功能,slave節(jié)點(diǎn)的queue使用rabbit_mirror_queue_slave。

怎么進(jìn)行RabbitMQ鏡像隊(duì)列分析

rabbit_mirror_queue_master的操作都會(huì)通過組播GM的方式同步到各個(gè)slave中。GM負(fù)責(zé)消息的廣播,rabbitmirrorqueueslave負(fù)責(zé)回調(diào)處理,而master上的回調(diào)處理是由coordinator負(fù)責(zé)完成的。如前所述,除了Basic.Publish,所有的操作都是通過master來(lái)完成的,master對(duì)消息進(jìn)行處理的同時(shí)將消息的處理通過GM廣播給所有的slave,slave的GM收到消息后,通過回調(diào)交由rabbit_mirror_queue_slave進(jìn)行實(shí)際的處理。

GM模塊實(shí)現(xiàn)的是一種可靠的組播通信協(xié)議,該協(xié)議能夠保證組播消息的原子性,即保證組中活著的節(jié)點(diǎn)要么都收到消息要么都收不到,它的實(shí)現(xiàn)大致為:將所有的節(jié)點(diǎn)形成一個(gè)循環(huán)鏈表,每個(gè)節(jié)點(diǎn)都會(huì)監(jiān)控位于自己左右兩邊的節(jié)點(diǎn),當(dāng)有節(jié)點(diǎn)新增時(shí),相鄰的節(jié)點(diǎn)保證當(dāng)前廣播的消息會(huì)復(fù)制到新的節(jié)點(diǎn)上;當(dāng)有節(jié)點(diǎn)失效時(shí),相鄰的節(jié)點(diǎn)會(huì)接管以保證本次廣播的消息會(huì)復(fù)制到所有的節(jié)點(diǎn)。

在master和slave上的這些GM形成一個(gè)組(gm_group),這個(gè)組的信息會(huì)記錄在Mnesia中。不同的鏡像隊(duì)列形成不同的組。操作命令從master對(duì)應(yīng)的GM發(fā)出后,順著鏈表傳送到所有的節(jié)點(diǎn)。由于所有節(jié)點(diǎn)組成了一個(gè)循環(huán)鏈表, master對(duì)應(yīng)的GM最終會(huì)收到自己發(fā)送的操作命令,這個(gè)時(shí)候master就知道該操作命令都同步到了所有的slave上。

當(dāng)master掛掉之后,會(huì)有以下連鎖反應(yīng):

  1. 與master連接的客戶端連接全部斷開。

  2. 選舉最老的slave作為新的master,因?yàn)樽罾系膕lave與舊的master之間的同步狀態(tài)應(yīng)該是最好的。如果此時(shí)所有slave處于未同步狀態(tài),則未同步的消息會(huì)丟失。

  3. 新的master重新入隊(duì)所有unack的消息,因?yàn)樾碌膕lave無(wú)法區(qū)分這些unack的消息是否己經(jīng)到達(dá)客戶端,或者是ack信息丟失在老的master鏈路上,再或者是丟失在老的master 組播ack消息到所有slave的鏈路上,所以出于消息可靠性的考慮,重新入隊(duì)所有unack的消息,不過此時(shí)客戶端可能會(huì)有重復(fù)消息。

  4. 如果客戶端連接著slave,并且Basic.Consume消費(fèi)時(shí)指定了x-cancel-on-ha-failover參數(shù),那么斷開之時(shí)客戶端會(huì)收到一個(gè)Consumer Cancellation Notification的通知,消費(fèi)者客戶端中會(huì)回調(diào)Consumer接口的handleCancel方法。如果未指定x-cancel-on-ha-failover參數(shù),那么消費(fèi)者將無(wú)法感知master宕機(jī)。

  rabbitmqctl set_policy [-p vhost] [--priority priority] [--apply-to apply-to] {name} {pattern} {definition}

definition中需要包含3個(gè)部分:

  • ha-mode:指明鏡像隊(duì)列的模式,有效值為all、exactly、nodes,默認(rèn)為all。all表示在集群中所有的節(jié)點(diǎn)上進(jìn)行鏡像;exactly表示在指定個(gè)數(shù)的節(jié)點(diǎn)上進(jìn)行鏡像,節(jié)點(diǎn)個(gè)數(shù)由ha-params指定;nodes表示在指定節(jié)點(diǎn)上進(jìn)行鏡像,節(jié)點(diǎn)名稱過ha-params指定,節(jié)點(diǎn)的名稱通常類似于rabbit@hostname。

  • ha-params:不同的ha-mode配置中需要用到的參數(shù)。

  • ha-sync-mode:隊(duì)列中消息的同步方式,有效值為automatic和manual。

  • ha-promote-on-shutdown:加后面的講述

將新節(jié)點(diǎn)加入己存在的鏡像隊(duì)列時(shí),默認(rèn)情況下ha-sync-mode取值為manual。鏡像隊(duì)列中的消息不會(huì)主動(dòng)同步到新的slave中,除非顯式調(diào)用同步命令。當(dāng)調(diào)用同步命令后,隊(duì)列開始阻塞,無(wú)法對(duì)其進(jìn)行其他操作,直到同步完成。當(dāng)ha-sync-mode設(shè)置為automatic時(shí), 新加入的slave會(huì)默認(rèn)同步己知的鏡像隊(duì)列

當(dāng)所有slave都出現(xiàn)未同步狀態(tài),并且ha-promote-on-shutdown設(shè)置為when-synced(默認(rèn))時(shí),如果master因?yàn)橹鲃?dòng)原因停掉,比如通過rabbitmqctl stop命令或者優(yōu)雅關(guān)閉操作系統(tǒng),那么slave不會(huì)接管master,也就是此時(shí)鏡像隊(duì)列不可用;但是如果master因?yàn)楸粍?dòng)原因停掉,比如Erlang虛擬機(jī)或者操作系統(tǒng)崩潰,那么slave會(huì)接管master。這個(gè)配置項(xiàng)隱含的價(jià)值取向是保證消息可靠不丟失,同時(shí)放棄了可用性。如果ha-promote-on-shutdown設(shè)置為always,那么不論master因?yàn)楹畏N原因停止,slave都會(huì)接管master,優(yōu)先保證可用性,不過消息可能會(huì)丟失。

 # 命令可以查看哪些slaves已經(jīng)完成同步rabbitmqctl list_queues name slave_pids synchronised_slave_pids
 # 手動(dòng)同步隊(duì)列rabbitmqctl sync_queue {name}
 # 取消隊(duì)列的同步操作rabbitmqctl cancel_sync_queue {name}

看完上述內(nèi)容,你們掌握怎么進(jìn)行RabbitMQ鏡像隊(duì)列分析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI