Docker---RabbitMQ叢集部署方案

2020-08-07 16:50:45

一、叢集方案簡潔

1、普通模式

普通模式: 預設模式,以兩個節點(rabbit01、rabbit02)爲例來進行說明。對於Queue來說,訊息實體只存在於其中一個節點rabbit01(或者rabbit02),rabbit01和rabbit02兩個節點僅有相同的元數據,即佇列的結構。當訊息進入rabbit01節點的Queue後,consumer從rabbit02節點消費時,RabbitMQ會臨時在rabbit01、rabbit02間進行訊息傳輸,把A中的訊息實體取出並經過B發送給consumer。所以consumer應儘量連線每一個節點,從中取訊息。即對於同一個邏輯佇列,要在多個節點建立物理Queue。否則無論consumer連rabbit01或rabbit02,出口總在rabbit01,會產生瓶頸。當rabbit01節點故障後,rabbit02節點無法取到rabbit01節點中還未消費的訊息實體。如果做了訊息持久化,那麼得等rabbit01節點恢復,然後纔可被消費;如果沒有持久化的話,就會產生訊息丟失的現象。

2、映象模式

映象模式: 把需要的佇列做成映象佇列,存在與多個節點屬於RabbitMQ的HA方案。該模式解決了普通模式中的問題,其實質和普通模式不同之處在於,訊息實體會主動在映象節點間同步,而不是在用戶端取數據時臨時拉取。該模式帶來的副作用也很明顯,除了降低系統效能外,如果映象佇列數量過多,加之大量的訊息進入,叢集內部的網路頻寬將會被這種同步通訊大大消耗掉。所以在對可靠性要求較高的場合中適用。

三、映象模式

1、部署方案介紹在这里插入图片描述

2、部署流程

(1)準備工作

  • 準備三臺機器,一主兩從
序號 IP 說明
1 172.17.88.22 master
2 172.17.88.19 salve
3 172.17.88.18 salve
  • 修改hosts檔案

    vi /etc/hosts
    # 新增IP
    172.17.88.22 rabbit-node1
    172.17.88.19 rabbit-node2
    172.17.88.18 rabbit-node3
    
  • 確保三臺機器25672、5672、4369開通埠,15672介面埠任意伺服器開通一臺

(2)部署流程

  • master執行

    sudo docker run -d --hostname rabbit-node1 --network host --restart=always --name rabbit-node -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-management
    # 進入容器執行
    docker exec -it rabbit-node bash
    rabbitmqctl stop_app
    rabbitmqctl reset
    rabbitmqctl start_app
    exit
    
  • salve執行

    docker exec -it rabbit-node bash
    rabbitmqctl stop_app
    rabbitmqctl reset
    rabbitmqctl join_cluster --ram rabbit@rabbit-node1
    rabbitmqctl start_app
    exit
    
  • 任意節點設定映象複製

    rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
    

三、springboot連線rabbitmq

spring.rabbitmq.addresses=172.17.88.22:5672,172.17.88.19:5672,172.17.88.18:5672