docker部署RabbitMQ集群


一、RabbitMQ集群概念

RabbitMQ 有三種模式:單機模式,普通集群模式,鏡像集群模式。單機模式即單獨運行一個 rabbitmq 實例,而集群模式需要創建多個 rabbitmq實例。

1、普通集群模式

概念:
默認的集群模式。需要創建多個 RabbitMQ 節點。但對於 Queue 和消息來說,只存在於其中一個節點,其他節點僅同步元數據,即隊列的結構信息。
當消息進入Queue后,如果 Consumer 從創建Queue的這個節點消費消息時,可以直接取出來;但如果 consumer 連接的是其他節點,那 rabbitmq 會把 queue 中的消息從創建它的節點中取出並經過連接節點轉發后再發送給consumer。
所以 consumer 應盡量連接每一個節點。並針對同一個邏輯隊列,要在多個節點建立物理 Queue。否則無論 consumer 連接哪個節點,都會從創建 queue 的節點獲取消息,會產生瓶頸。

特點:
(1)Exchange 的元數據信息在所有節點上是一致的,而 Queue(存放消息的隊列)的完整數據則只會存在於創建它的那個節點上。其他節點只知道這個 queue 的 metadata 信息和一個指向 queue 的 owner node 的指針;

(2)RabbitMQ 集群會始終同步四種類型的內部元數據(類似索引):
  a.隊列元數據:隊列名稱和它的屬性;
  b.交換器元數據:交換器名稱、類型和屬性;
  c.綁定元數據:一張簡單的表格展示了如何將消息路由到隊列;
  d.vhost元數據:為 vhost 內的隊列、交換器和綁定提供命名空間和安全屬性;
  因此,當用戶訪問其中任何一個 RabbitMQ 節點時,通過 rabbitmqctl 查詢到的元數據信息都是相同的。

(3)無法實現高可用性,當創建 queue 的節點故障后,其他節點是無法取到消息實體的。如果做了消息持久化,那么得等創建 queue 的節點恢復后,才可以被消費。如果沒有持久化的話,就會產生消息丟失的現象。

2、鏡像集群模式

概念:
把隊列做成鏡像隊列,讓各隊列存在於多個節點中,屬於 RabbitMQ 的高可用性方案。鏡像模式和普通模式的不同在於,queue和 message 會在集群各節點之間同步,而不是在 consumer 獲取數據時臨時拉取。

特點:
(1)實現了高可用性。部分節點掛掉后,不會影響 rabbitmq 的使用。
(2)降低了系統性能。鏡像隊列數量過多,大量的消息同步也會加大網絡帶寬開銷。
(3)適合對可用性要求較高的業務場景。

二、RabbitMQ普通集群部署

1、拉鏡像

#docker pull rabbitmq:management

2、運行容器

#docker run -d --hostname rabbit_host1 --name rabbitmq1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' rabbitmq:management
#docker run -d --hostname rabbit_host2 --name rabbitmq2 -p 5673:5672 --link rabbitmq1:rabbit_host1 -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' rabbitmq:management
#docker run -d --hostname rabbit_host3 --name rabbitmq3 -p 5674:5672 --link rabbitmq1:rabbit_host1 --link rabbitmq2:rabbit_host2 -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' rabbitmq:management

主要參數:
-p 15672:15672 management 界面管理訪問端口
-p 5672:5672 amqp 訪問端口
--link 容器之間連接
Erlang Cookie 值必須相同,也就是一個集群內 RABBITMQ_ERLANG_COOKIE 參數的值必須相同。因為 RabbitMQ 是用Erlang實現的,Erlang Cookie 相當於不同節點之間通訊的密鑰,Erlang節點通過交換 Erlang Cookie 獲得認證。

3、加入節點到集群

設置節點1:

#docker exec -it myrabbit1 bash
#rabbitmqctl stop_app
#rabbitmqctl reset
#rabbitmqctl start_app
#exit

設置節點2,加入到集群:

#docker exec -it myrabbit2 bash
#rabbitmqctl stop_app
#rabbitmqctl reset
#rabbitmqctl join_cluster --ram rabbit@rabbitmq_host1
#rabbitmqctl start_app
#exit

設置節點3,加入到集群:

#docker exec -it myrabbit3 bash
#rabbitmqctl stop_app
#rabbitmqctl reset
#rabbitmqctl join_cluster --ram rabbit@rabbitmq_host1
#rabbitmqctl start_app
#exit

主要參數:
--ram 表示設置為內存節點,忽略次參數默認為磁盤節點。該配置啟動了3個節點,1個磁盤節點和2個內存節點。

設置好之后,使用 http://ip:15672 進行訪問,默認賬號密碼:guest/guest

 

 可以看到,已經有多個節點了。

三、RabbitMQ鏡像集群部署

1、策略policy概念

使用RabbitMQ鏡像功能,需要基於RabbitMQ策略來實現,策略policy是用來控制和修改群集范圍的某個vhost隊列行為和Exchange行為。策略policy就是要設置哪些Exchange或者queue的數據需要復制、同步,以及如何復制同步。

為了使隊列成為鏡像隊列,需要創建一個策略來匹配隊列,設置策略有兩個鍵“ha-mode和 ha-params(可選)”。ha-params根據ha-mode設置不同的值,下表說明這些key的選項。

2、添加策略

登錄rabbitmq管理頁面 ——> Admin ——> Policies ——> Add / update a policy

 

name:隨便取,策略名稱
Pattern:^ 匹配符,只有一個^代表匹配所有
Definition:ha-mode=all 為匹配類型,分為3種模式:all(表示所有的queue)

或者使用命令:
#rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

3、查看效果

此策略會同步所在同一VHost中的交換器和隊列數據。設置好policy之后,使用 http://ip:15672 再次進行訪問,可以看到隊列鏡像同步。

四、Springboot配置RabbitMQ集群

1、配置RabbitMQ單機

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: username
    password: password

或者使用addresses

spring:
  rabbitmq:
    addresses:ip1:port1
    username: username
    password: password

2、配置RabbitMQ集群

addresses節點用逗號分隔

spring:
  rabbitmq:
    addresses:ip1:port1,ip2:port2,ip3:port3
    username: username
    password: password

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM