未部署集群的缺點(diǎn)
創(chuàng)新互聯(lián)建站始終堅(jiān)持【策劃先行,效果至上】的經(jīng)營(yíng)理念,通過(guò)多達(dá)十多年累計(jì)超上千家客戶(hù)的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的全網(wǎng)營(yíng)銷(xiāo)解決方案,現(xiàn)已廣泛運(yùn)用于各行各業(yè)的客戶(hù),其中包括:辦公空間設(shè)計(jì)等企業(yè),備受客戶(hù)好評(píng)。
如果RabbitMQ集群只有一個(gè)broker節(jié)點(diǎn),那么該節(jié)點(diǎn)的失效將導(dǎo)致整個(gè)服務(wù)臨時(shí)性的不可用,并且可能會(huì)導(dǎo)致message的丟失(尤其是在非持久化message存儲(chǔ)于非持久化queue中的時(shí)候)。可以將所有message都設(shè)置為持久化,并且使用持久化的queue,但是這樣仍然無(wú)法避免由于緩存導(dǎo)致的問(wèn)題:因?yàn)閙essage在發(fā)送之后和被寫(xiě)入磁盤(pán)并執(zhí)行fsync之間存在一個(gè)雖然短暫但是會(huì)產(chǎn)生問(wèn)題的時(shí)間窗。通過(guò)publisher的confirm機(jī)制能夠確保客戶(hù)端知道哪些message已經(jīng)存入磁盤(pán),盡管如此,一般不希望遇到因單點(diǎn)故障導(dǎo)致服務(wù)不可用。
部署集群后
如果RabbitMQ集群是由多個(gè)broker節(jié)點(diǎn)構(gòu)成的,那么從服務(wù)的整體可用性上來(lái)講,該集群對(duì)于單點(diǎn)失效是有彈性的,但是同時(shí)也需要注意:盡管exchange和binding能夠在單點(diǎn)失效問(wèn)題上幸免于難,但是queue和其上持有的message卻不行,這是因?yàn)閝ueue及其內(nèi)容僅僅存儲(chǔ)于單個(gè)節(jié)點(diǎn)之上,所以一個(gè)節(jié)點(diǎn)的失效表現(xiàn)為其對(duì)應(yīng)的queue不可用。
RabbitMQ本身是基于Erlang編寫(xiě),Erlang語(yǔ)言天生具備分布式特性(通過(guò)同步Erlang集群各節(jié)點(diǎn)的erlang.cookie來(lái)實(shí)現(xiàn))。因此,RabbitMQ天然支持集群。集群是保證可靠性的一種方式,同時(shí)可以通過(guò)水平擴(kuò)展以達(dá)到增加消息吞吐量能力的目的。
為了提高程序的吞吐量,保持消息的可靠性,一臺(tái)機(jī)器掛了后,RabbitMQ能夠正常生產(chǎn),消費(fèi)消息。
rabbitmq有三種模式:?jiǎn)螜C(jī)模式,普通集群模式,鏡像集群模式
Demo級(jí)別的,一般只是本機(jī)測(cè)試玩玩而已,生產(chǎn)環(huán)境下不會(huì)用的。
在多臺(tái)機(jī)器上啟動(dòng)多個(gè)rabbitmq實(shí)例,每個(gè)機(jī)器啟動(dòng)一個(gè)。
但是你創(chuàng)建的queue,只會(huì)放在一個(gè)rabbtimq實(shí)例上,但是每個(gè)實(shí)例都同步queue的元數(shù)據(jù)(存放含queue數(shù)據(jù)的真正實(shí)例位置)。消費(fèi)的時(shí)候,實(shí)際上如果連接到了另外一個(gè)實(shí)例,那么那個(gè)實(shí)例會(huì)從queue所在實(shí)例上拉取數(shù)據(jù)過(guò)來(lái)。
示意圖
這種方式確實(shí)很麻煩,也不怎么好,沒(méi)做到所謂的分布式,就是個(gè)普通集群。
普通集群的方式,確實(shí)達(dá)到了消息的高可用,但沒(méi)辦法保證可靠性,沒(méi)做到分布式,簡(jiǎn)而言之,只是一個(gè)普通的集群。
缺點(diǎn):成都服務(wù)器托管
這種模式,才是所謂的rabbitmq的高可用模式,跟普通集群模式不一樣的是,你創(chuàng)建的queue,無(wú)論元數(shù)據(jù)還是queue里的消息都會(huì)存在于多個(gè)實(shí)例上,然后每次你寫(xiě)消息到queue的時(shí)候,都會(huì)自動(dòng)把消息到多個(gè)實(shí)例的queue里進(jìn)行消息同步。
上圖中每個(gè)節(jié)點(diǎn)有一個(gè)queue,生產(chǎn)者生產(chǎn)完畢數(shù)據(jù)后投遞到指定交換機(jī)的隊(duì)列,交換機(jī)的隊(duì)列進(jìn)行消息同步。
每個(gè)節(jié)點(diǎn)queue都有一個(gè)完整的rabbitmq節(jié)點(diǎn),所以這種方式叫做鏡像集群
鏡像集群模式的好處與壞處
好處:任何一個(gè)節(jié)點(diǎn)宕機(jī)后,其它節(jié)點(diǎn)不受影響,正常使用
壞處:成都服務(wù)器托管
對(duì)于以上方式,我們的鏡像集群可以通過(guò)配置來(lái)解決這種擴(kuò)展性的問(wèn)題,配置同步的方式
確保機(jī)器中安裝了Docker,若未安裝,可看:Docker安裝阿里云服務(wù)器和在虛擬機(jī)安裝遇到的坑(問(wèn)題小結(jié))
使用Docker安裝RabbitMQ鏡像
1 2 | # 拉取鏡像,帶有管理界面的版本 docker pull rabbitmq:management |
查看拉取的鏡像
1 | docker images |
運(yùn)行Docker鏡像
1 2 3 4 5 6 7 8 | # 開(kāi)啟第一個(gè)RabbitMQ服務(wù) docker run -d -- hostname myRabbit1 --name rabbit1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE= 'rabbitcookie' rabbitmq:management # 開(kāi)啟第二個(gè) docker run -d -- hostname myRabbit2 --name rabbit2 -p 15673:15672 -p 5673:5672 --link rabbit1:myRabbit1 -e RABBITMQ_ERLANG_COOKIE= 'rabbitcookie' rabbitmq:management # 開(kāi)啟第三個(gè) docker run -d -- hostname myRabbit3 --name rabbit3 -p 15674:15672 -p 5674:5672 --link rabbit1:myRabbit1 --link rabbit2:myRabbit2 -e RABBITMQ_ERLANG_COOKIE= 'rabbitcookie' rabbitmq:management |
查看正在運(yùn)行的鏡像
1 | docker ps |
成功運(yùn)行
配置RabbitMQ節(jié)點(diǎn)之間的關(guān)系
設(shè)置節(jié)點(diǎn)1
1 2 3 4 5 6 7 8 | [root@wanghuichen /] # docker exec -it rabbit1 bash root@myRabbit1:/ # rabbitmqctl stop_app 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. Stopping rabbit application on node rabbit@myRabbit1 ... root@myRabbit1:/ # rabbitmqctl reset 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. Resetting node rabbit@myRabbit1 ... root@myRabbit1:/ # rabbitmqctl |
設(shè)置節(jié)點(diǎn)2
1 2 3 4 5 6 7 8 9 10 11 | [root@wanghuichen /] # docker exec -it rabbit2 bash root@myRabbit2:/ # rabbitmqctl stop_app 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. Stopping rabbit application on node rabbit@myRabbit2 ... root@myRabbit2:/ # rabbitmqctl reset 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. Resetting node rabbit@myRabbit2 ... root@myRabbit2:/ # rabbitmqctl join_cluster --ram rabbit@myRabbit1 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. Clustering node rabbit@myRabbit2 with rabbit@myRabbit1 root@myRabbit2:/ # rabbitmqctl join_cluster --ram rabbit@myRabbit1 |
配置節(jié)點(diǎn)3
1 2 3 4 5 6 7 8 9 | [root@wanghuichen /] # docker exec -it rabbit3 bash root@myRabbit3:/ # rabbitmqctl stop_app 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. Stopping rabbit application on node rabbit@myRabbit3 ... root@myRabbit3:/ # rabbitmqctl reset 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. Resetting node rabbit@myRabbit3 ... root@myRabbit3:/ # rabbitmqctl join_cluster --ram rabbit@myRabbit1 root@myRabbit3:/ # rabbitmqctl start_app |
進(jìn)入每個(gè)集群依次設(shè)置用戶(hù)密碼
1 2 3 | rabbitmqctl add_user admin admin rabbitmqctl set_user_tags admin administrator rabbitmqctl set_permissions -p / admin ".*" ".*" ".*" |
配置鏡像隊(duì)列
1 2 3 4 5 6 7 | [root@wanghuichen /] # docker exec -it rabbit1 bash root@myRabbit1:/ # rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}' 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. Setting policy "ha-all" for pattern "^" to "{" ha-mode ":" all "}" with priority "0" for vhost "/" ... root@myRabbit1:/ # rabbitmqctl cluster_status 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. Cluster status of node rabbit@myRabbit1 ... |
查看集群狀態(tài)
1 | rabbitmqctl cluster_status |
常用命令
1 2 3 4 5 6 7 8 9 10 | # 查看已經(jīng)運(yùn)行過(guò)但停止了的鏡像 docker ps -a # 停止鏡像 docker stop 鏡像 id /鏡像名稱(chēng) # 開(kāi)啟鏡像,恢復(fù)運(yùn)行狀態(tài) dockers start 鏡像 id /鏡像名稱(chēng) # 刪除鏡像 docker rm 鏡像 id /鏡像名稱(chēng) # 刪除所有鏡像 docker rmi $(docker ps -a) |
瀏覽器輸入 您的ip地址:15673
部署RabbitMQ鏡像集群成功~
如果出現(xiàn)無(wú)法訪問(wèn)的情況,可在阿里云服務(wù)器開(kāi)啟安全組,因?yàn)榘⒗镌颇J(rèn)全部開(kāi)啟了安全組,配置允許訪問(wèn)的端口即可
再次測(cè)試即可成功~
File —> New —> Project —> Maven —> 直接Next 進(jìn)入下一步創(chuàng)建普通的Maven工程即可
創(chuàng)建一個(gè)默認(rèn)的Maven聚合工程,將src文件夾刪除,該工程就是一個(gè)Maven聚合工程
引入依賴(lài)如下:成都服務(wù)器托管
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | <? xml version = "1.0" encoding = "UTF-8" ?> < project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > < modelVersion >4.0.0</ modelVersion > < groupId >com.wanshi</ groupId > < artifactId >springboot-rabbitmq</ artifactId > < packaging >pom</ packaging > < version >1.0-SNAPSHOT</ version > < modules > < module >rabbitmq-order-producer</ module > < module >rabbitmq-order-consumer</ module > </ modules > < parent > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-parent</ artifactId > < version >2.5.5</ version > < relativePath /> <!-- lookup parent from repository --> </ parent > < dependencyManagement > < dependencies > < dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-web</ artifactId > </ dependency > < dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-test</ artifactId > < scope >test</ scope > </ dependency > < dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-amqp</ artifactId > </ dependency > < dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-web</ artifactId > </ dependency > </ dependencies > </ dependencyManagement > </ project > |
在項(xiàng)目?jī)?nèi),新建一個(gè)Moudle,rabbitmq-order-producer 默認(rèn)Maven工程,下一步即可
引入依賴(lài)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <? xml version = "1.0" encoding = "UTF-8" ?> < project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > < parent > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-parent</ artifactId > < version >2.5.5</ version > < relativePath /> <!-- lookup parent from repository --> </ parent > < modelVersion >4.0.0</ modelVersion > < artifactId >rabbitmq-order-producer</ artifactId > < dependencies > < dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-web</ artifactId > </ dependency > < dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-test</ artifactId > < scope >test</ scope > </ dependency > < dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-amqp</ artifactId > </ dependency > < dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-web</ artifactId > </ dependency > < dependency > < groupId >junit</ groupId > < artifactId >junit</ artifactId > < scope >test</ scope > </ dependency > </ dependencies > </ project > |
在項(xiàng)目?jī)?nèi),新建一個(gè)Moudle,rabbitmq-order-cousumer 默認(rèn)Maven工程
文章標(biāo)題:阿里云服務(wù)器部署RabbitMQ集群的詳細(xì)教程
網(wǎng)站地址:http://www.rwnh.cn/article16/sjodg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、外貿(mào)建站、虛擬主機(jī)、網(wǎng)站改版、響應(yīng)式網(wǎng)站、App開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
營(yíng)銷(xiāo)型網(wǎng)站建設(shè)知識(shí)