Docker搭建RabbitMq的普通集群和鏡像集群的詳細操作
普通集群:多個節(jié)點組成的普通集群,消息隨機發(fā)送到其中一個節(jié)點的隊列上,其他節(jié)點僅保留元數(shù)據(jù),各個節(jié)點僅有相同的元數(shù)據(jù),即隊列結(jié)構(gòu)、交換器結(jié)構(gòu)、vhost等。消費者消費消息時,會從各個節(jié)點拉取消息,如果保存消息的節(jié)點故障,則無法消費消息,如果做了消息持久化,那么得等該節(jié)點恢復(fù),然后才可被消費;如果沒有持久化的話,就會產(chǎn)生消息丟失的現(xiàn)象。
鏡像集群:它是在普通模式的基礎(chǔ)上,把需要的隊列做成鏡像隊列,存在于多個節(jié)點來實現(xiàn)高可用(HA)。該模式解決了上述問題,Broker會主動地將消息實體在各鏡像節(jié)點間同步,在consumer取數(shù)據(jù)時無需臨時拉取。該模式帶來的副作用也很明顯,除了降低系統(tǒng)性能外,如果鏡像隊列數(shù)量過多,加之大量的消息進入,集群內(nèi)部的網(wǎng)絡(luò)帶寬將會被大量消耗。通常地,對可靠性要求較高的場景建議采用鏡像模式。
一、搭建RabbitMq的運行環(huán)境
我本機是window10,通過docker搭建兩個rabbitmq節(jié)點。
1.通過search查詢rabbitmq鏡像
docker search rabbitmq
2.通過pull拉取rabbitmq的官方最新鏡像
這里最好帶上tag為management的版本,否則拉最新的latest,web管理頁無法顯示全,會提示overview:management only mode
docker pull rabbitmq:3.8.25-management
3.創(chuàng)建容器
docker run -d --name rabbitmq1 -p 5672:5672 -p 15672:15672 --hostname myRabbit1 -e RABBITMQ_DEFAULT_VHOST=my_vhost1 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin a4eb038c2ecb
--name:容器名稱
-p:端點映射
--hostname:rabbitmq的節(jié)點名稱
-e RABBITMQ_DEFAULT_VHOST:虛擬主機名稱
-e RABBITMQ_DEFAULT_USER:登錄賬號
-e RABBITMQ_DEFAULT_PASS:登錄密碼
a4eb038c2ecb是鏡像id,根據(jù)自己情況替換。
4.啟動管理頁面
我們的鏡像默認(rèn)沒有開啟web管理頁面,所以我們通過exec命令進入容器啟動,這個鏡像的環(huán)境是ubuntu的
PS C:\> docker exec -it 639a151c5440 /bin/bash
root@myRabbit:/# rabbitmq-plugins enable rabbitmq_management
瀏覽器中訪問http://localhost:15672/即可打開,另一個rabbitmq如法炮制,區(qū)別之處在于更換端口為5673和15673等,并且創(chuàng)建容器時使用--link連接第一個rabbitmq節(jié)點(也可創(chuàng)建橋接網(wǎng)絡(luò)network連接),如下
docker run -d --name rabbitmq2 -p 5673:5672 -p 15673:15672 --hostname myRabbit2 -e RABBITMQ_DEFAULT_VHOST=my_vhost2 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --link rabbitmq1:myRabbit1 a4eb038c2ecb
5.設(shè)置erlang cookie
erlang cookie原本可以通過run容器時設(shè)置參數(shù)-e RABBITMQ_ERLANG_COOKIE,但是現(xiàn)在過期棄用了。
我們先通過docker logs命令查看容器的運行日志,尋找home dir參數(shù)如下
PS D:\> docker logs rabbitmq1 //.....這里省略 Starting broker...2021-11-17 02:19:55.859245+00:00 [info] <0.222.0> 2021-11-17 02:19:55.859245+00:00 [info] <0.222.0> node : rabbit@myRabbit1 2021-11-17 02:19:55.859245+00:00 [info] <0.222.0> home dir : /var/lib/rabbitmq 2021-11-17 02:19:55.859245+00:00 [info] <0.222.0> config file(s) : /etc/rabbitmq/conf.d/10-default-guest-user.conf 2021-11-17 02:19:55.859245+00:00 [info] <0.222.0> : /etc/rabbitmq/conf.d/management_agent.disable_metrics_collector.conf 2021-11-17 02:19:55.859245+00:00 [info] <0.222.0> cookie hash : Aed9pjd9vYWw3hng7Gjmkg== 2021-11-17 02:19:55.859245+00:00 [info] <0.222.0> log(s) : /var/log/rabbitmq/rabbit@myRabbit1_upgrade.log 2021-11-17 02:19:55.859245+00:00 [info] <0.222.0> : <stdout> 2021-11-17 02:19:55.859245+00:00 [info] <0.222.0> database dir : /var/lib/rabbitmq/mnesia/rabbit@myRabbit1
所以.erlang.cookie文件在此路徑下,我們進入容器可以看到此文件
root@myRabbit1:~# ls -a /var/lib/rabbitmq
. .. .bash_history .erlang.cookie mnesia
我們再設(shè)置erlang cookie的權(quán)限,在容器內(nèi)運行如下代碼,如果權(quán)限不夠后續(xù)操作會報錯
chmod 600 /var/lib/rabbitmq/.erlang.cookie
之后我們通過docker cp命令將rabbitmq1中的.erlang.cookie文件拷到物理機上再拷貝到rabbitmq2的容器中,物理機和容器之間復(fù)制命令如下:
- 容器復(fù)制文件到物理機:docker cp 容器名稱:容器目錄
- 物理機目錄物理機復(fù)制文件到容器:docker cp 物理機目錄 容器名稱:容器目錄
具體代碼如下:
docker cp rabbitmq1:/var/lib/rabbitmq/ d:\workspace\
docker cp d:\workspace\rabbitmq\.erlang.cookie rabbitmq2:/var/lib/rabbitmq/
復(fù)制之后需要重啟rabbitmq2容器,否則執(zhí)行rabbitmqctl命令報如下錯誤:
[error] Cookie file /var/lib/rabbitmq/.erlang.cookie must be accessible by owner only
二、普通模式
重啟后進入容器將rabbitmq2的節(jié)點加入rabbitmq1中創(chuàng)建普通集群,分別執(zhí)行如下代碼即可:
rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster --ram rabbit@myRabbit1 //myRabbitmq1為rabbitmq1容器中rabbitmq的hostname rabbitmqctl start_app
之后我們再web管理頁可以看到兩個節(jié)點了。
在任意一個節(jié)點創(chuàng)建一個隊列,另一個節(jié)點也會生成相同的隊列。而且可以發(fā)現(xiàn)rabbitmq2的vhost從my_vhost2變?yōu)榱薽y_vhost1與rabbitmq相同了。
三、鏡像模式
鏡像模式就是在普通模式的基礎(chǔ)上進入rabbitmq1容器輸入如下命令即可:
rabbitmqctl set_policy -p my_vhost1 ha-all "^" '{"ha-mode":"all"}' --apply-to all
具體的格式為
rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority] -p Vhost: 可選參數(shù),針對指定vhost下的queue進行設(shè)置 Name: policy的名稱 Pattern: queue的匹配模式(正則表達式) Definition:鏡像定義,包括三個部分ha-mode, ha-params, ha-sync-mode ha-mode:指明鏡像隊列的模式,有效值為 all/exactly/nodes all:表示在集群中所有的節(jié)點上進行鏡像 exactly:表示在指定個數(shù)的節(jié)點上進行鏡像,節(jié)點的個數(shù)由ha-params指定 nodes:表示在指定的節(jié)點上進行鏡像,節(jié)點名稱通過ha-params指定 ha-params:作為參數(shù),為ha-mode的補充 ha-sync-mode:進行隊列中消息的同步方式,有效值為automatic和manual priority:可選參數(shù),policy的優(yōu)先級 rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}' --apply-to all
或者登錄rabbitmq管理頁面 ——> Admin ——> Policies ——> Add / update a policy
name:策略名稱
Pattern:^ 匹配符,只有一個^代表匹配所有。^message指同步“message”開頭的隊列名稱
Definition:ha-mode=all 為匹配類型,分為3種模式:all(表示所有的queue)
Priority:優(yōu)先級,首先根據(jù)priority
排序,值越大的優(yōu)先級越高;相同priority
則根據(jù)創(chuàng)建時間排序,越晚創(chuàng)建的優(yōu)先級越高。
簡單說明一下 Operator Policy 和 User Policy 的區(qū)別:
- Operator Policy 是給服務(wù)提供商或公司基礎(chǔ)設(shè)施部門用來設(shè)置某些需要強制執(zhí)行的通用規(guī)則
- User Policy 是給業(yè)務(wù)應(yīng)用用來設(shè)置的規(guī)則
Operator Policy 和 User Policy 會合并后作用于隊列,并且為防止 Operator Policy 對隊列某些關(guān)鍵屬性例如死信隊列交換器Dead Letter Exchange
的覆蓋導(dǎo)致業(yè)務(wù)應(yīng)用產(chǎn)生非預(yù)期的結(jié)果,Operator Policy 只支持expire
、message-ttl
、max-length
、max-length-bytes
4個參數(shù)。
參考學(xué)習(xí):
https://www.cnblogs.com/knowledgesea/p/6535766.html
https://blog.csdn.net/belonghuang157405/article/details/83540148
到此這篇關(guān)于Docker搭建RabbitMq的普通集群和鏡像集群的文章就介紹到這了,更多相關(guān)Docker搭建RabbitMq集群內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解使用?docker?compose?部署?golang?的?Athens?私有代理問題
這篇文章主要介紹了使用?docker-compose?部署?golang?的?Athens?私有代理,幫助大家快速學(xué)習(xí)athens 如何構(gòu)建私有代理,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04Docker容器之間數(shù)據(jù)傳輸?shù)膶崿F(xiàn)
本文主要介紹了Docker容器之間數(shù)據(jù)傳輸?shù)膶崿F(xiàn),文中根據(jù)實例編碼詳細介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03使用docker的python基礎(chǔ)鏡像時要指定patch版本原理
這篇文章主要為大家介紹了使用docker的python基礎(chǔ)鏡像時要指定patch版本原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10