天天看點

RabbitMQ高可用--鏡像隊列的配置方法

簡介

        本文介紹RabbitMQ鏡像隊列的配置方法。

         假設現在mq裡有兩個隊列:mirror_queue和normal_queue,想為mirror_queue建立鏡像隊列,mornal_queue不建立鏡像隊列。

第1步:啟動3台叢集節點

第2步:配置鏡像政策

法1:管理頁面配置

按此步驟建立鏡像政策,該政策為所有mirror_開頭的隊列建立 3個 副本鏡像。

RabbitMQ高可用--鏡像隊列的配置方法
RabbitMQ高可用--鏡像隊列的配置方法

法2:指令行

rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]      

示例:對隊列名稱以“mirror_”開頭的所有隊列進行鏡像,并在叢集的兩個節點上完成進行:

rabbitmqctl set_policy --priority 0 --apply-to queues mirror_queue "^mirror_" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'      

法3:HTTP API

見:​​Classic Queue Mirroring — RabbitMQ​​

PUT /api/policies/%2f/ha-two
{
  "pattern":"^mirror_",
  "definition": {
    "ha-mode":"exactly",
    "ha-params":3,
    "ha-sync-mode":"automatic"
  }
}      

第3步:檢視結果

        配置完 Policy 後,建立新的隊列或者原有的的隊列,如果隊列名稱符合 Policy 的比對規則,則該隊列自動成為鏡像隊列,會自動為它生成副本隊列。

下圖中 mirror_queue 比對第2步建立的鏡像政策,為鏡像隊列。normal_queue 為普通隊列

RabbitMQ高可用--鏡像隊列的配置方法

        鏡像隊列顯示的藍色 +2 表示同步副本數為 2 個。

        mirror-policy 為該隊列應用的鏡像政策。

        點選隊列名稱可以進入檢視隊列詳細資訊,從中可以看出隊列的主節點、從節點和鏡像政策:

RabbitMQ高可用--鏡像隊列的配置方法

指令行配置參數詳解

rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]      

參數 

-p Vhost: 可選參數,針對指定vhost下的queue進行設定
Name: policy的名稱
Pattern: queue的比對模式(正規表達式)
Definition:鏡像定義,包括三個部分ha-mode, ha-params, ha-sync-mode
  ha-mode:指明鏡像隊列的模式,有效值為 all/exactly/nodes
    all:表示在叢集中所有的節點上進行鏡像
    exactly:表示在指定個數的節點上進行鏡像,節點的個數由ha-params指定
    nodes:表示在指定的節點上進行鏡像,節點名稱通過ha-params指定
  ha-params:ha-mode模式需要用到的參數
  ha-sync-mode:進行隊列中消息的同步方式,有效值為automatic和manual
priority:可選參數,policy的優先級      

鏡像政策

ha-mode ha-params 結果
exactly count 叢集中隊列副本的數量(主隊列加上鏡像)。count值為1表示一個副本:隻有主節點。如果主節點不可用,則其行為取決于隊列是否持久化。count值為2表示兩個副本:一個隊列主隊列和一個隊列鏡像。換句話說:“鏡像數=節點數-1”。如果運作隊列主伺服器的節點變得不可用,隊列鏡像将根據配置的鏡像提升政策自動提升到主伺服器。如果叢集中的可用節點數少于count,則将隊列鏡像到所有節點。如果叢集中有多個計數節點,并且一個包含鏡像的節點當機,那麼将在另一個節點上建立一個新鏡像。使用’ exactly ‘模式和’ ha-promot-on-shutdown ': ’ always '可能是危險的,因為隊列可以跨叢集遷移,并在停機時變得不同步。
all 不設定 表示在叢集中所有的節點上進行鏡像。這個設定非常保守。建議設定的副本值為大多數節點N / 2 + 1。鏡像到所有節點會給所有叢集節點帶來額外的負擔,包括網絡I/O、磁盤I/O和磁盤空間的使用。
nodes 節點名稱 隊列被鏡像到節點名中列出的節點。節點名是在rabbitmqctl cluster_status中出現的Erlang節點名;它們的形式通常是“rabbit@hostname”。如果這些節點名中有任何一個不是叢集的一部分,則不構成錯誤。如果在聲明隊列時清單中的節點都不線上,則将在聲明客戶機連接配接的節點上建立隊列。

新鏡像同步政策

ha-sync-mode 說明
manual 這是預設模式。新隊列鏡像将不接收現有消息,它隻接收新消息。一旦使用者耗盡了僅存在于主伺服器上的消息,新的隊列鏡像将随着時間的推移成為主伺服器的精确副本。如果主隊列在所有未同步的消息耗盡之前失敗,則這些消息将丢失。您可以手動完全同步隊列,詳情請參閱未同步的鏡像部分。
automatic 當新鏡像加入時,隊列将自動同步。值得重申的是,隊列同步是一個阻塞操作。如果隊列很小,或者您在RabbitMQ節點和ha-sync-batch-size之間有一個快速的網絡,那麼這是一個很好的選擇。

從節點晉升政策

        鏡像隊列主節點出現故障時,最老的從節點會被提升為新的主節點。如果新提升為主節點的這個副本與原有的主節點并未完成資料的同步,那麼就會出現資料的丢失,而實際應用中,出現資料丢失可能會導緻出現嚴重後果。

        rabbitmq 提供了 ha-promote-on-shutdown,ha-promote-on-failure 兩個參數讓使用者決策是保證隊列的可用性,還是保證隊列的一緻性;兩個參數分别控制正常關閉、異常故障情況下從節點是否提升為主節點,其可設定的值為 when-synced 和 always。

ha-promote-on-shutdown

/ha-promote-on-failure

說明
when-synced 從節點與主節點完成資料同步,才會被提升為主節點
always 無論什麼情況下從節點都将被提升為主節點

主隊列選擇政策

        RabbitMQ中的每個隊列都有一個主隊列。該節點稱為隊列主伺服器。所有隊列操作首先經過主隊列,然後複制到鏡像。這對于保證消息的FIFO排序是必要的。

        通過在政策中設定 queue-master-locator 鍵的方法可以定義主隊列選擇政策,這是常用的方法。

RabbitMQ高可用--鏡像隊列的配置方法

        此外,也可以用隊列參數 x-queue-master-locator 或配置檔案中定義 queue_master_locator 的方式指定,此處不再贅述。

下面是該政策的可選參數清單

queue-master-locator 說明
min-masters 選擇承載最小綁定主機數量的節點
client-local