1.RabbitMQ集群模式介紹
-
普通集群
- 默認(rèn)的集群模式,比如有節(jié)點(diǎn)node1、node2和node3,三個(gè)節(jié)點(diǎn)是普通集群,但是他們僅有相同的元數(shù)據(jù),即交換機(jī)、隊(duì)列的結(jié)構(gòu)
- 消息只存在其中的一個(gè)節(jié)點(diǎn)里面,假如消息A存儲(chǔ)在node1節(jié)點(diǎn),消費(fèi)者連接node1節(jié)點(diǎn)消費(fèi)消息時(shí),可以直接取出來;但如果消費(fèi)者是連接的其他節(jié)點(diǎn),那RabbitMQ會(huì)把queue中的消息從存儲(chǔ)它的節(jié)點(diǎn)中取出,并經(jīng)過連接節(jié)點(diǎn)轉(zhuǎn)發(fā)后再發(fā)送給消費(fèi)者
- 假如node1故障,那node2無法獲取node1存儲(chǔ)未被消費(fèi)的消息;如果node1持久化后故障,那需要等node1恢復(fù)后才可以正常消費(fèi);如果node1沒做持久化后故障,那消息將會(huì)丟失
- 這個(gè)情況無法實(shí)現(xiàn)高可用性,且節(jié)點(diǎn)間會(huì)增加通訊獲取消息,性能存在瓶頸;該模式更適合于消息無需持久化的場(chǎng)景,如日志傳輸?shù)年?duì)列
- 注意:集群需要保證各個(gè)節(jié)點(diǎn)有相同的token令牌。erlang.cookie是erlang的分布式token文件,集群內(nèi)各個(gè)節(jié)點(diǎn)的erlang.cookie需要相同,才可以互相通信
-
鏡像集群(大廠基本使用這個(gè)方式)
- 隊(duì)列做成鏡像隊(duì)列,讓各隊(duì)列存在于多個(gè)節(jié)點(diǎn)中
- 和普通集群比較大的區(qū)別就是【隊(duì)列queue的消息message】會(huì)在集群各節(jié)點(diǎn)之間同步,且并不是consumer獲取數(shù)據(jù)時(shí)臨時(shí)拉取,而普通集群則是臨時(shí)從存儲(chǔ)的節(jié)點(diǎn)里面拉取對(duì)應(yīng)的數(shù)據(jù)
- 實(shí)現(xiàn)了高可用性,部分節(jié)點(diǎn)掛掉后,不影響正常的消費(fèi),可以保證100%消息不丟失,推薦奇數(shù)個(gè)節(jié)點(diǎn),結(jié)合LVS+Keepalive進(jìn)行IP漂移,防止單點(diǎn)故障
- 缺點(diǎn):由于鏡像隊(duì)列模式下,消息數(shù)量過多,大量的消息同步也會(huì)加大網(wǎng)絡(luò)帶寬開銷,適合高可用要求比較高的項(xiàng)目,過多節(jié)點(diǎn)的話,性能則更加受影響
- 注意:集群需要保證各個(gè)節(jié)點(diǎn)有相同的token令牌。erlang.cookie是erlang的分布式token文件,集群內(nèi)各個(gè)節(jié)點(diǎn)的erlang.cookie需要相同,才可以互相通信
-
還有其他通過插件形成的集群,比如Federation集群
2.普通集群docker搭建
-
Linux啟動(dòng)3個(gè)rabbitmq節(jié)點(diǎn)
# 節(jié)點(diǎn)一 docker run -d --hostname rabbit_host1 \ --name gen-rabbitmq1 \ -p 15672:15672 -p 5672:5672 \ -e RABBITMQ_NODENAME=rabbit \ -e RABBITMQ_DEFAULT_USER=admin \ -e RABBITMQ_DEFAULT_PASS=Gen123 \ -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' \ --privileged=true \ -v /usr/local/rabbitmq/1/lib:/var/lib/rabbitmq \ -v /usr/local/rabbitmq/1/log:/var/log/rabbitmq \ rabbitmq:management # 節(jié)點(diǎn)二 docker run -d --hostname rabbit_host2 \ --name gen-rabbitmq2 \ -p 15673:15672 -p 5673:5672 \ -e RABBITMQ_NODENAME=rabbit \ -e RABBITMQ_DEFAULT_USER=admin \ -e RABBITMQ_DEFAULT_PASS=Gen123 \ -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' \ --privileged=true \ -v /usr/local/rabbitmq/2/lib:/var/lib/rabbitmq \ -v /usr/local/rabbitmq/2/log:/var/log/rabbitmq \ --link gen-rabbitmq1:rabbit_host1 \ rabbitmq:management # 節(jié)點(diǎn)三 docker run -d --hostname rabbit_host3 \ --name gen-rabbitmq3 \ -p 15674:15672 -p 5674:5672 \ -e RABBITMQ_NODENAME=rabbit \ -e RABBITMQ_DEFAULT_USER=admin \ -e RABBITMQ_DEFAULT_PASS=Gen123 \ -e RABBITMQ_ERLANG_COOKIE='rabbitmq_cookie' \ --privileged=true \ -v /usr/local/rabbitmq/3/lib:/var/lib/rabbitmq \ -v /usr/local/rabbitmq/3/log:/var/log/rabbitmq \ --link gen-rabbitmq1:rabbit_host1 \ --link gen-rabbitmq2:rabbit_host2 \ rabbitmq:management
-
參數(shù)說明
--hostname:自定義docker容器的主機(jī)名 --link:容器之間連接,link不可或缺,使得三個(gè)容器能互相通信 --privileged=true:使用該參數(shù),容器內(nèi)的root擁有真正的root權(quán)限,否則容器出現(xiàn)permission denied -v:宿主機(jī)和容器路徑映射 -e RABBITMQ_NODENAME:缺省Unix*:rabbit@HOSTNAME -e RABBITMQ_DEFAULT_USER=admin:登錄用戶名 -e RABBITMQ_DEFAULT_PASS=Gen123:登錄密碼 -e RABBITMQ_ERLANG_COOKIE:值必須相同,也就是一個(gè)集群內(nèi),相當(dāng)于不同節(jié)點(diǎn)之間通訊的密鑰;erlang.cookie是erlang的分布式token文件,集群內(nèi)各個(gè)節(jié)點(diǎn)的erlang.cookie需要相同,才可以互相通信
-
配置集群
# 節(jié)點(diǎn)一配置集群 docker exec -it gen-rabbitmq1 bash rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl start_app exit # 節(jié)點(diǎn)二加入集群,--ram是以內(nèi)存方式加入,忽略該參數(shù)默認(rèn)為磁盤節(jié)點(diǎn) docker exec -it gen-rabbitmq2 bash rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster --ram rabbit@rabbit_host1 rabbitmqctl start_app exit # 節(jié)點(diǎn)三加入集群,--ram是以內(nèi)存方式加入,忽略該參數(shù)默認(rèn)為磁盤節(jié)點(diǎn) docker exec -it gen-rabbitmq3 bash rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster --ram rabbit@rabbit_host1 rabbitmqctl start_app exit # 查看集群節(jié)點(diǎn)狀態(tài),配置啟動(dòng)了3個(gè)節(jié)點(diǎn),1個(gè)磁盤節(jié)點(diǎn)和2個(gè)內(nèi)存節(jié)點(diǎn) rabbitmqctl cluster_status
-
測(cè)試
- node1主節(jié)點(diǎn)創(chuàng)建隊(duì)列,發(fā)送消息(可以選擇消息是否持久化),node2和node3通過節(jié)點(diǎn)自身的web管控臺(tái)可以看到隊(duì)列和消息
- 如果把node1節(jié)點(diǎn)停止,node2和node3會(huì)收不到消息
- 如果是在非主節(jié)點(diǎn)(非磁盤節(jié)點(diǎn))創(chuàng)建隊(duì)列和發(fā)送消息,則其他隊(duì)列可以顯示
-
springboot項(xiàng)目配置集群
spring: rabbitmq: virtual-host: / password: Gen123 username: admin addresses: 192.168.101.128:5672,192.168.101.128:5673,192.168.101.128:5674
3.mirror鏡像集群配置
-
背景
- 前面搭建了普通集群,如果磁盤節(jié)點(diǎn)掛掉后,如果沒開啟持久化數(shù)據(jù)就丟失了,其他節(jié)點(diǎn)也無法獲取消息,所以我們這個(gè)集群方案需要進(jìn)一步改造為鏡像模式集群
-
策略policy介紹
-
RabbitMQ的策略policy是用來控制和修改集群的vhost隊(duì)列和Exchange復(fù)制行為,就是要設(shè)置哪些Exchange或者Queue的數(shù)據(jù)需要復(fù)制、同步,以及如何復(fù)制同步
-
策略會(huì)同步同一個(gè)VirtualHost中的交換機(jī)和隊(duì)列數(shù)據(jù)
- Name:自定義策略名稱
- Pattern:匹配符,^代表匹配所有
- Definition:ha-mode=all;ha-sync-mode=automatic
ha-mode:指明鏡像隊(duì)列的模式,可選下面的其中一個(gè) all:表示在集群中所有的節(jié)點(diǎn)上進(jìn)行鏡像同步(一般使用這個(gè)參數(shù)) exactly:表示在指定個(gè)數(shù)的節(jié)點(diǎn)上進(jìn)行鏡像同步,節(jié)點(diǎn)的個(gè)數(shù)由ha-params指定 nodes:表示在指定的節(jié)點(diǎn)上進(jìn)行鏡像同步,節(jié)點(diǎn)名稱通過ha-params指定 ha-sync-mode:鏡像消息同步方式 manua:手動(dòng) automatic:自動(dòng)
文章來源:http://www.zghlxwxcb.cn/news/detail-835726.html
-
-
集群重啟順序文章來源地址http://www.zghlxwxcb.cn/news/detail-835726.html
- 啟動(dòng)順序:磁盤節(jié)點(diǎn)–>內(nèi)存節(jié)點(diǎn)
- 關(guān)閉順序:內(nèi)存節(jié)點(diǎn)–>磁盤節(jié)點(diǎn)
- 最后關(guān)閉必須是磁盤節(jié)點(diǎn),否則容易造成集群?jiǎn)?dòng)失敗、數(shù)據(jù)丟失等異常情況
到了這里,關(guān)于RabbitMQ集群架構(gòu)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!