您好,登錄后才能下訂單哦!
本篇文章為大家展示了docker中怎么搭建RabbitMQ集群,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
RabbitMQ集群中節點包含內存節點(RAM)、磁盤節點(Disk,消息持久化)、集群中至少有一個Disk節點。集群分為兩種集群模式普通模式
和 鏡像模式
。
普通模式(默認)
對于普通模式,集群中各節點有相同的隊列結構,但消息只會存在于集群中的一個節點,對于消費者來說,若消息進入A節點的Queue中,當從B節點拉取時,RabbitMQ會將消息從A中取出,并經過B發送給消費者。
**應用場景:**該模式更適合于消息無需持久化的場景,如日志隊列。當隊列非持久化,且創建該隊列的節點宕機,客戶端才可以重連集群其他節點,并重新創建隊列。若為持久化,只能等故障節點恢復。缺點:無法解決單點故障問題。
鏡像模式
與普通模式不同之處時消息實體會主動在鏡像節點見同步,而不是在取數據時臨時拉取,高可用;該模式下 鏡像隊列(mirror queue)有一套選舉算法,即1個master、n個slaver。 生產者、消費者的請求都會轉至master。
**應用場景:**可靠性要求較高場合,如下單、庫存隊列。缺點:若鏡像隊列過多,且消息體量大,集群內部網絡帶寬將會被此種同步通訊所消耗。
#創建RabbitMQ目錄 mkdir ~/mydata/rabbitmq cd ~/mydata/rabbitmq #創建三個rabbitmq 目錄,存儲三個節點配置信息 mkdir rabbitmq01 rabbitmq02 rabbitmq03 #創建rabbitmq01節點容器 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 #創建rabbitmq02節點容器 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 #創建rabbitmq03節點容器 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 節點認證作用,集群部署需要同步該值,且值必須相同。 ##多個容器之間使用“--link”連接,此屬性不能少;
安裝好后訪問測試,使用http://192.168.0.100:15672 進行訪問了,默認賬號密碼是guest/guest,其中192.168.0.100 是我的宿主機IP。顯示還未加入任何集群信息,只能看到我訪問的該一個節點信息。
#進入rabbitmq01容器,重新初始化一下,如果是新安裝則reset可以忽略重置。 docker exec -it rabbitmq01 bash rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl start_app exit #進入rabbitmq02容器,重新初始化一下,將02節點加入到集群中 docker exec -it rabbitmq02 bash rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster --ram rabbit@rabbitmq01 #參數“--ram”表示設置為內存節點,忽略該參數默認為磁盤節點。 rabbitmqctl start_app exit #進入rabbitmq03容器,重新初始化一下,將03節點加入到集群中 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個節點,到此為止,我們已經完成了RabbitMQ普通模式集群的建立,啟動了3個節點,1個磁盤節點和2個內存節點。但是如果磁盤節點掛掉后,數據就丟失了。所以我們這個集群方案需要進一步改造為鏡像模式集群。
鏡像隊列是Rabbit2.6.0版本帶來的一個新功能,允許內建雙活冗余選項,與普通隊列不同,鏡像節點在集群中的其他節點擁有從隊列拷貝,一旦主節點不可用,最老的從隊列將被選舉為新的主隊列。
**鏡像隊列的工作原理:**在某種程度上你可以將鏡像隊列視為,擁有一個隱藏的fanout交換器,它指示者信道將消息分發到從隊列上。
設置鏡像隊列命令:“rabbitmqctl set_policy 名稱 匹配模式(正則) 鏡像定義”, 例如,設置名稱為ha的鏡像隊列,匹配所有名稱是amp開頭的隊列都存儲在2個節點上的命令如下:
#隨便進入一個容器 docker exec -it rabbitmq01 bash #設置策略匹配所有名稱是amp開頭的隊列都存儲在2個節點上的命令如下 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 )
可以看出設置鏡像隊列,一共有四個參數,每個參數用空格分割。
參數一:策略名稱,可以隨便填,此外我們命名為ha(高可用);
參考二:-p / 設置哪個虛擬主機,可以使用rabbitmqctl list_policies -p / 查看vhost 下所有的策略(policies )。
參數三:隊列名稱的匹配規則,使用正則表達式表示;
參數四:為鏡像隊列的主體規則,是json字符串,分為三個屬性:ha-mode | ha-params | ha-sync-mode,分別的解釋如下:
ha-mode:鏡像模式,分類:all/exactly/nodes,all存儲在所有節點;exactly存儲x個節點,節點的個數由ha-params指定;nodes指定存儲的節點上名稱,通過ha-params指定;
ha-params:作為參數,為ha-mode的補充;
ha-sync-mode:鏡像消息同步方式:automatic(自動),manually(手動);
至此rabbitmq集群算是搭建完畢,訪問創建一個隊列測試一下!如圖所示!
rabbitmqctl list_policies
rabbitmqctl clear_policy
各位可以自己在docker容器搭建試試。最后大家在生產環境下使用也不用自己搭建,目前市面上阿里云、騰訊云 也提高比較優秀成熟的開箱即用 消息中間件 供大家選擇使用,如RocketMQ、Kafka、RabbitMQ;
阿里云 · 消息隊列 MQ 消息隊列(Message Queue,簡稱 MQ)是構建分布式互聯網應用的基礎設施,通過 MQ 實現的松耦合架構設計可以提高系統可用性以及可擴展性,是適用于現代應用的最佳設計方案。如有消息隊列 RocketMQ 版 阿里巴巴官方指定消息產品,成熟、穩定、先進的技術體系打造金融級消息服務,感受雙十一產品的完美體驗。
騰訊云消息隊列 TDMQ(Tencent Distributed Message Queue,下文中簡稱TDMQ)是一款基于 Apache 頂級開源項目 Pulsar 自研的金融級分布式消息中間件。其計算與存儲分離的架構設計,使得它具備極好的云原生和 Serverless 特性,用戶按量使用,無需關心底層資源。它擁有原生 Java 、 C++、Python、GO 等多種 API,同時支持 kafka 協議以及 HTTP 協議方式接入,可為分布式應用系統提供異步解耦和削峰填谷的能力,具備互聯網應用所需的海量消息堆積、高吞吐、可靠重試等特性。TDMQ 目前已應用在騰訊計費絕大部分場景,包括支付主路徑、實時對賬、實時監控、大數據實時分析等方面。
如出現改過期警告: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值,現在我們要把單個的物理機部署成集群,實現我們需要同步Erlang的Cookie值。
1.為什么要配置相同的erlang cookie?
因為RabbitMQ是用Erlang實現的,Erlang Cookie相當于不同節點之間相互通訊的秘鑰,Erlang節點通過交換Erlang Cookie獲得認證。
2.Erlang Cookie的位置
要想知道Erlang Cookie位置,首先要取得RabbitMQ啟動日志里面的home dir路徑,作為根路徑。使用:“docker logs 容器名稱”查看,如下圖:
所以Erlang Cookie的全部路徑就是“/var/lib/rabbitmq/.erlang.cookie”。
注意:每個人的erlang cookie位置可能不同,一定要查看自己的home dir路徑。
3.復制Erlang Cookie到其他RabbitMQ節點
獲取到第一個RabbitMQ的Erlang Cookie之后,只需要把這個文件復制到其他RabbitMQ節點即可。
物理機和容器之間復制命令如下:
容器復制文件到物理機:docker cp 容器名稱:容器目錄 物理機目錄
物理機復制文件到容器:docker cp 物理機目錄 容器名稱:容器目錄
設置Erlang Cookie文件權限:“chmod 600 /var/lib/rabbitmq/.erlang.cookie”。
上述內容就是docker中怎么搭建RabbitMQ集群,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。