docker中怎么搭建RabbitMQ集群

本篇文章為大家展示了docker中怎么搭建RabbitMQ集群,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

10余年建站經(jīng)驗, 成都網(wǎng)站建設、做網(wǎng)站客戶的見證與正確選擇。創(chuàng)新互聯(lián)提供完善的營銷型網(wǎng)頁建站明細報價表。后期開發(fā)更加便捷高效,我們致力于追求更美、更快、更規(guī)范。

使用docker 搭建RabbitMQ集群

RabbitMQ集群中節(jié)點包含內(nèi)存節(jié)點(RAM)、磁盤節(jié)點(Disk,消息持久化)、集群中至少有一個Disk節(jié)點。集群分為兩種集群模式普通模式鏡像模式。

  • 普通模式(默認)

    對于普通模式,集群中各節(jié)點有相同的隊列結(jié)構(gòu),但消息只會存在于集群中的一個節(jié)點,對于消費者來說,若消息進入A節(jié)點的Queue中,當從B節(jié)點拉取時,RabbitMQ會將消息從A中取出,并經(jīng)過B發(fā)送給消費者。

    **應用場景:**該模式更適合于消息無需持久化的場景,如日志隊列。當隊列非持久化,且創(chuàng)建該隊列的節(jié)點宕機,客戶端才可以重連集群其他節(jié)點,并重新創(chuàng)建隊列。若為持久化,只能等故障節(jié)點恢復。缺點:無法解決單點故障問題。

  • 鏡像模式

    與普通模式不同之處時消息實體會主動在鏡像節(jié)點見同步,而不是在取數(shù)據(jù)時臨時拉取,高可用;該模式下 鏡像隊列(mirror queue)有一套選舉算法,即1個master、n個slaver。 生產(chǎn)者、消費者的請求都會轉(zhuǎn)至master。

    **應用場景:**可靠性要求較高場合,如下單、庫存隊列。缺點:若鏡像隊列過多,且消息體量大,集群內(nèi)部網(wǎng)絡帶寬將會被此種同步通訊所消耗。

環(huán)境搭建

創(chuàng)建三個RabbitMQ節(jié)點

#創(chuàng)建RabbitMQ目錄
mkdir ~/mydata/rabbitmq
cd ~/mydata/rabbitmq
#創(chuàng)建三個rabbitmq 目錄,存儲三個節(jié)點配置信息
mkdir rabbitmq01 rabbitmq02 rabbitmq03

#創(chuàng)建rabbitmq01節(jié)點容器
docker run -d --hostname rabbitmq01 --name rabbitmq01 \
-v ~/mydata/rabbitmq/rabbitmq01:/var/lib/rabbitmq \
-p 15672:15672 -p 5672:5672 \
-e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management

#創(chuàng)建rabbitmq02節(jié)點容器
docker run -d --hostname rabbitmq02 --name rabbitmq02 \
-v ~/mydata/rabbitmq/rabbitmq02:/var/lib/rabbitmq \
-p 15673:15672 -p 5673:5672 \
--link rabbitmq01:rabbitmq01 \
-e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management


#創(chuàng)建rabbitmq03節(jié)點容器
docker run -d --hostname rabbitmq03 --name rabbitmq03 \
-v ~/mydata/rabbitmq/rabbitmq03:/var/lib/rabbitmq \
-p 15674:15672 -p 5674:5672 \
--link rabbitmq01:rabbitmq01 --link rabbitmq02:rabbitmq02 \
-e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management

##注意:--hostname 設置容器主機名,RABBITMQ_ERLANG_COOKIE 節(jié)點認證作用,集群部署需要同步該值,且值必須相同。
##多個容器之間使用“--link”連接,此屬性不能少;

安裝好后訪問測試,使用http://192.168.0.100:15672 進行訪問了,默認賬號密碼是guest/guest,其中192.168.0.100 是我的宿主機IP。顯示還未加入任何集群信息,只能看到我訪問的該一個節(jié)點信息。

docker中怎么搭建RabbitMQ集群

將RabbitMQ節(jié)點加入到集群

#進入rabbitmq01容器,重新初始化一下,如果是新安裝則reset可以忽略重置。
docker exec -it rabbitmq01 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit

#進入rabbitmq02容器,重新初始化一下,將02節(jié)點加入到集群中
docker exec -it rabbitmq02 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01 #參數(shù)“--ram”表示設置為內(nèi)存節(jié)點,忽略該參數(shù)默認為磁盤節(jié)點。
rabbitmqctl start_app
exit

#進入rabbitmq03容器,重新初始化一下,將03節(jié)點加入到集群中
docker exec -it rabbitmq03 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit

集群測試訪問

設置好之后,使用http://192.168.0.100:15672 進行訪問了,默認賬號密碼是guest/guest,其中192.168.0.100 是我的宿主機IP。啟動了3個節(jié)點,到此為止,我們已經(jīng)完成了RabbitMQ普通模式集群的建立,啟動了3個節(jié)點,1個磁盤節(jié)點和2個內(nèi)存節(jié)點。但是如果磁盤節(jié)點掛掉后,數(shù)據(jù)就丟失了。所以我們這個集群方案需要進一步改造為鏡像模式集群。

docker中怎么搭建RabbitMQ集群

鏡像模式集群改造

鏡像隊列是Rabbit2.6.0版本帶來的一個新功能,允許內(nèi)建雙活冗余選項,與普通隊列不同,鏡像節(jié)點在集群中的其他節(jié)點擁有從隊列拷貝,一旦主節(jié)點不可用,最老的從隊列將被選舉為新的主隊列。

**鏡像隊列的工作原理:**在某種程度上你可以將鏡像隊列視為,擁有一個隱藏的fanout交換器,它指示者信道將消息分發(fā)到從隊列上。

設置鏡像隊列

設置鏡像隊列命令:“rabbitmqctl set_policy 名稱 匹配模式(正則) 鏡像定義”, 例如,設置名稱為ha的鏡像隊列,匹配所有名稱是amp開頭的隊列都存儲在2個節(jié)點上的命令如下:

#隨便進入一個容器
docker exec -it rabbitmq01 bash
#設置策略匹配所有名稱是amp開頭的隊列都存儲在2個節(jié)點上的命令如下
rabbitmqctl set_policy -p / ha "^amp*" '{"ha-mode":"exactly","ha-params":2}'
#或者
#設置策略匹配所有名稱的隊列都進行高可用配置
rabbitmqctl set_policy -p / ha "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

#查詢策略
rabbitmqctl list_policies -p / #查看vhost下的所有的策略(policies )

可以看出設置鏡像隊列,一共有四個參數(shù),每個參數(shù)用空格分割

  1. 參數(shù)一:策略名稱,可以隨便填,此外我們命名為ha(高可用);

  2. 參考二:-p / 設置哪個虛擬主機,可以使用rabbitmqctl list_policies -p / 查看vhost 下所有的策略(policies )。

  3. 參數(shù)三:隊列名稱的匹配規(guī)則,使用正則表達式表示;

  4. 參數(shù)四:為鏡像隊列的主體規(guī)則,是json字符串,分為三個屬性:ha-mode | ha-params | ha-sync-mode,分別的解釋如下:

  • ha-mode:鏡像模式,分類:all/exactly/nodes,all存儲在所有節(jié)點;exactly存儲x個節(jié)點,節(jié)點的個數(shù)由ha-params指定;nodes指定存儲的節(jié)點上名稱,通過ha-params指定;

  • ha-params:作為參數(shù),為ha-mode的補充;

  • ha-sync-mode:鏡像消息同步方式:automatic(自動),manually(手動);

至此rabbitmq集群算是搭建完畢,訪問創(chuàng)建一個隊列測試一下!如圖所示!

docker中怎么搭建RabbitMQ集群

查看鏡像隊列

rabbitmqctl list_policies

刪除鏡像隊列

rabbitmqctl clear_policy

總結(jié)

各位可以自己在docker容器搭建試試。最后大家在生產(chǎn)環(huán)境下使用也不用自己搭建,目前市面上阿里云、騰訊云 也提高比較優(yōu)秀成熟的開箱即用 消息中間件供大家選擇使用,如RocketMQ、Kafka、RabbitMQ;

  • 阿里云 · 消息隊列 MQ 消息隊列(Message Queue,簡稱 MQ)是構(gòu)建分布式互聯(lián)網(wǎng)應用的基礎設施,通過 MQ 實現(xiàn)的松耦合架構(gòu)設計可以提高系統(tǒng)可用性以及可擴展性,是適用于現(xiàn)代應用的最佳設計方案。如有消息隊列 RocketMQ 版 阿里巴巴官方指定消息產(chǎn)品,成熟、穩(wěn)定、先進的技術體系打造金融級消息服務,感受雙十一產(chǎn)品的完美體驗。

  • 騰訊云消息隊列 TDMQ(Tencent Distributed Message Queue,下文中簡稱TDMQ)是一款基于 Apache 頂級開源項目 Pulsar 自研的金融級分布式消息中間件。其計算與存儲分離的架構(gòu)設計,使得它具備極好的云原生和 Serverless 特性,用戶按量使用,無需關心底層資源。它擁有原生 Java 、 C++、Python、GO 等多種 API,同時支持 kafka 協(xié)議以及 HTTP 協(xié)議方式接入,可為分布式應用系統(tǒng)提供異步解耦和削峰填谷的能力,具備互聯(lián)網(wǎng)應用所需的海量消息堆積、高吞吐、可靠重試等特性。TDMQ 目前已應用在騰訊計費絕大部分場景,包括支付主路徑、實時對賬、實時監(jiān)控、大數(shù)據(jù)實時分析等方面。

其他問題

如出現(xiàn)改過期警告:RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.

配置相同Erlang Cookie

有些特殊的情況,比如已經(jīng)運行了一段時間的幾個單個物理機,我們在之前沒有設置過相同的Erlang Cookie值,現(xiàn)在我們要把單個的物理機部署成集群,實現(xiàn)我們需要同步Erlang的Cookie值。

1.為什么要配置相同的erlang cookie?

因為RabbitMQ是用Erlang實現(xiàn)的,Erlang Cookie相當于不同節(jié)點之間相互通訊的秘鑰,Erlang節(jié)點通過交換Erlang Cookie獲得認證。

2.Erlang Cookie的位置

要想知道Erlang Cookie位置,首先要取得RabbitMQ啟動日志里面的home dir路徑,作為根路徑。使用:“docker logs 容器名稱”查看,如下圖:

docker中怎么搭建RabbitMQ集群

所以Erlang Cookie的全部路徑就是“/var/lib/rabbitmq/.erlang.cookie”。

注意:每個人的erlang cookie位置可能不同,一定要查看自己的home dir路徑。

3.復制Erlang Cookie到其他RabbitMQ節(jié)點

獲取到第一個RabbitMQ的Erlang Cookie之后,只需要把這個文件復制到其他RabbitMQ節(jié)點即可。

物理機和容器之間復制命令如下:

  • 容器復制文件到物理機:docker cp 容器名稱:容器目錄 物理機目錄

  • 物理機復制文件到容器:docker cp 物理機目錄 容器名稱:容器目錄

設置Erlang Cookie文件權(quán)限:“chmod 600 /var/lib/rabbitmq/.erlang.cookie”。

上述內(nèi)容就是docker中怎么搭建RabbitMQ集群,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章標題:docker中怎么搭建RabbitMQ集群
當前地址:http://bm7419.com/article0/goeiio.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作外貿(mào)網(wǎng)站建設、動態(tài)網(wǎng)站定制開發(fā)、標簽優(yōu)化、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設