docker部署RabbitMQ集群

2022-08-12 08:33:15 字數 4354 閱讀 1057

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)適合對可用性要求較高的業務場景。

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 reset

#exit

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

#docker exec -it myrabbit2 bash

#rabbitmqctl reset

#rabbitmqctl join_cluster --ram rabbit@rabbitmq_host1

#exit

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

#docker exec -it myrabbit3 bash

#rabbitmqctl reset

#rabbitmqctl join_cluster --ram rabbit@rabbitmq_host1

#exit

主要引數:

--ram 表示設定為記憶體節點,忽略次引數預設為磁碟節點。該配置啟動了3個節點,1個磁碟節點和2個記憶體節點。

設定好之後,使用 http://ip:15672 進行訪問,預設賬號密碼:guest/guest

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

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 "^" ''

3、檢視效果

此策略會同步所在同一vhost中的交換器和佇列資料。設定好policy之後,使用 http://ip:15672 再次進行訪問,可以看到佇列映象同步。

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

mac 使用docker 安裝 rabbitmq

專案要用到rabbitmq 官網說brew install 但是brew update就半天都不成功,突然想起了docker,以前用過一點點,就試著來了一下 docker search rabbitmq management docker pull rabbitmq management docke...

docker部署 docker環境部署mysql

蘇軾 這裡我拉取了tag為5.7的映象 docker pull mysql 5.7因為需要自定義mysql的配置,所以需要乙個配置目錄 因為需要將mysql生成的資料掛載到本地,所以需要乙個資料目錄 建立mysql 資料目錄mkdir p root mysql data 建立配置檔案 touch r...

docker部署部署心得

一 涉及檔案 centos centos7.tar.gz docker中centos映象壓縮包 docker.tar.gz docker 安裝包 jre 8u131 linux x64.rpm 生成cloudlicense映象時要用到 由於找不到openjdk,安裝映象,用這個替代 dockerfi...