日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

rabbitmq使用_RabbitMQ的使用(二) RabbitMQ服务在单机中做集群

發(fā)布時(shí)間:2023/12/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 rabbitmq使用_RabbitMQ的使用(二) RabbitMQ服务在单机中做集群 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作者:markjiang7m2
博客園地址:https://www.cnblogs.com/markjiang7m2/p/12837151.html
官網(wǎng)地址:http://letyouknow.net

在上一篇RabbitMQ的使用(一)- RabbitMQ服務(wù)安裝?中總結(jié)的是在Windows服務(wù)器上安裝服務(wù),對(duì)于一個(gè)高可用部署方案,必須要做集群。我自己在用的就是一臺(tái)Windows系統(tǒng)機(jī)器,如果做集群的話,運(yùn)行幾個(gè)虛擬機(jī)或者跑幾個(gè)Docker就可以很簡(jiǎn)單地實(shí)現(xiàn)了,但是我看了下官文關(guān)于集群的配置,是支持直接在當(dāng)前系統(tǒng)中開多個(gè)服務(wù)配置集群的,所以就有了這一篇折騰文章了。

官文配置集群鏈接https://www.rabbitmq.com/clustering.html

Windows系統(tǒng)單機(jī)做RabbitMQ集群

單機(jī)啟動(dòng)多個(gè)RabbitMQ服務(wù)

其實(shí)在單機(jī)做集群的適用場(chǎng)景可能是在于開發(fā)環(huán)境和測(cè)試環(huán)境,而使用單機(jī)跟多機(jī)做集群之間的差別是在于如何在單機(jī)上啟動(dòng)多個(gè)RabbitMQ服務(wù),只要把服務(wù)安裝好了,后面的步驟跟多機(jī)就是一樣的。
官網(wǎng)關(guān)于單機(jī)做集群的指引在這里https://www.rabbitmq.com/clustering.html#single-machine,但是以Linux系統(tǒng)為例的,Windows系統(tǒng)還不能直接使用例子上面的命令。

如例子中創(chuàng)建RabbitMQ服務(wù)的指令:

RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit rabbitmq-server -detached

在Windows系統(tǒng)的DOS命令就需要分為多個(gè)指令:

set RABBITMQ_NODE_PORT=5672

set RABBITMQ_NODENAME=rabbit

rabbitmq-server -detached

我還啟用了RabbitMQ管理界面,所以我的完整指令:

set RABBITMQ_NODE_PORT=5673

set RABBITMQ_NODENAME=rabbit1

set RABBITMQ_CONFIG_FILE=D:\Mark\Tempfiles\rabbitmq.conf

set RABBITMQ_SERVER_START_ARGS=-rabbitmq_management listener [{port,15673}]

rabbitmq-server -detached

啟動(dòng)效果如下:

然后以相同的方式再啟動(dòng)多一個(gè)節(jié)點(diǎn)rabbit2。

單機(jī)添加多個(gè)節(jié)點(diǎn)到同一個(gè)集群中

在上一篇文章中安裝RabbitMQ服務(wù)時(shí),就已經(jīng)默認(rèn)了端口為5672的RabbitMQ服務(wù)。這一次,我就以這個(gè)服務(wù)為主節(jié)點(diǎn),將節(jié)點(diǎn)rabbit1,rabbit2添加到這個(gè)集群中。

在添加到集群之前,我們來看一下原有的集群配置,配置文件在?C:\Users\%UserName%\AppData\Roaming\RabbitMQ\db\%nodename%-mnesia目錄下,文件名為?cluster_nodes.config。可以看到現(xiàn)在三個(gè)節(jié)點(diǎn)的配置都是類似的,?{[%nodename%],[%nodename%]}.,意為每個(gè)節(jié)點(diǎn)都在自己獨(dú)立的集群中。

根據(jù)官文的指引,要添加到同一個(gè)集群,執(zhí)行下面的指令即可:

rabbitmqctl -n rabbit1 stop_app

rabbitmqctl -n rabbit1 join_cluster rabbit@%hostname%

rabbitmqctl -n rabbit1 start_app

效果如下:

此時(shí)可以發(fā)現(xiàn)?http://localhost:15672/#/和?http://localhost:15673/#/顯示是一樣的了,包括集群名稱。

以相同的方式將rabbit2加入到該集群中。

這個(gè)時(shí)候我們?cè)倏醇号渲梦募?cluster_nodes.config,已經(jīng)包含了三個(gè)節(jié)點(diǎn),格式如下:

{[%node1name%,%node2name%,%nodename%],[%node1name%,%node2name%,%nodename%]]}.

從集群中移除節(jié)點(diǎn)

簡(jiǎn)單的集群就已經(jīng)做完了。那如果想要將其中一個(gè)節(jié)點(diǎn)從集群中移除,需要什么指令呢?

下面是我從集群中移除節(jié)點(diǎn)rabbit2

rabbitmqctl -n rabbit2 stop_app

rabbitmqctl -n rabbit1 forget_cluster_node rabbit2@%hostname%

rabbitmqctl -n rabbit2 reset

rabbitmqctl -n rabbit2 start_app

rabbitmqctl-n rabbit2 reset這一步是不可少的,如果移除節(jié)點(diǎn)后,直接啟動(dòng)節(jié)點(diǎn)會(huì)報(bào)錯(cuò)。

此時(shí)再看管理界面,也會(huì)發(fā)現(xiàn)rabbit2被移除了,列表中只有兩個(gè)節(jié)點(diǎn)。

還有一點(diǎn)需要注意的是Erlang cookie。每個(gè)節(jié)點(diǎn)都必須保持一致,可以將主節(jié)點(diǎn)的home dir目錄下的cookie值復(fù)制到其它節(jié)點(diǎn)中。

home dir目錄可以在RabbitMQ日志中找到,一般默認(rèn)值為:C:\Windows\System32\config\systemprofile。cookie文件名為:?.erlang.cookie。

其它節(jié)點(diǎn)的Erlang cookie需要被覆蓋的有兩個(gè)地方,home dir目錄和user目錄下的?.erlang.cookie文件,user目錄為?C:\Users\%username%。這個(gè)覆蓋操作一般都是針對(duì)多機(jī)集群的,因?yàn)槲疫@里用的是單機(jī)做集群,所有節(jié)點(diǎn)的home dir和user目錄都是一樣的,所以我這里不需要覆蓋。

RabbitMQ HA高可用鏡像隊(duì)列

官文地址:https://www.rabbitmq.com/ha.html

上面就建立起了有三個(gè)節(jié)點(diǎn)的RabbitMQ集群。默認(rèn)情況下,RabbitMQ集群中隊(duì)列的內(nèi)容位于單個(gè)節(jié)點(diǎn)(聲明該隊(duì)列的節(jié)點(diǎn))上。這與交換機(jī)和綁定相反,交換機(jī)和綁定始終可以被視為在所有節(jié)點(diǎn)上,這就會(huì)導(dǎo)致了當(dāng)隊(duì)列的內(nèi)容存在于A節(jié)點(diǎn),當(dāng)A節(jié)點(diǎn)宕機(jī)了,B節(jié)點(diǎn)仍然存在A節(jié)點(diǎn)中的隊(duì)列,但無法獲取A節(jié)點(diǎn)隊(duì)列的內(nèi)容。此時(shí),我們可以選擇使隊(duì)列跨多個(gè)節(jié)點(diǎn)進(jìn)行鏡像。

我們可以通過策略配置鏡像參數(shù)。一個(gè)策略按名稱匹配一個(gè)或多個(gè)隊(duì)列(使用正則表達(dá)式模式),并且包含一個(gè)定義(可選參數(shù)的映射),該定義被添加到匹配隊(duì)列的全部屬性中。

我這里使用的虛擬主機(jī)為?markhost,然后在Admin-> Policies-> Add/update a policy 創(chuàng)建一個(gè)策略,如下:

這里有兩個(gè)地方比較注意的地方。

Pattern:^mark1?此處意為當(dāng)命名以?mark1開頭的隊(duì)列進(jìn)行鏡像。ha-mode:all?此處意為對(duì)所有節(jié)點(diǎn)都進(jìn)行鏡像,這里的參數(shù)設(shè)置參考官文說明https://www.rabbitmq.com/ha.html#mirroring-arguments

創(chuàng)建兩個(gè)隊(duì)列,分別命名為?mark_queue和?mark1_queue

mark1_queue隊(duì)列中,Node為?rabbit@xxx表示該隊(duì)列是屬于?rabbit節(jié)點(diǎn)的,?+2的標(biāo)志表示有兩個(gè)鏡像節(jié)點(diǎn),Features含有?mark_Pli1,表示該隊(duì)列符合?mark_Pli1策略。

mark_queue隊(duì)列因?yàn)椴环喜呗?#xff0c;所以并沒有鏡像節(jié)點(diǎn)。

現(xiàn)在我嘗試將?rabbit節(jié)點(diǎn)停止了,運(yùn)行指令?rabbitmqctl-n rabbit stop_app,再看隊(duì)列情況。

會(huì)發(fā)現(xiàn)?mark1_queue隊(duì)列已經(jīng)自動(dòng)轉(zhuǎn)移到?rabbit2節(jié)點(diǎn)中,而且依然正常運(yùn)行,而?mark_queue隊(duì)列的狀態(tài)則被標(biāo)記為?down,這是因?yàn)樽隽绥R像的隊(duì)列內(nèi)容存在于所有節(jié)點(diǎn)中,當(dāng)所屬節(jié)點(diǎn)宕機(jī)了,會(huì)繼續(xù)通過其它節(jié)點(diǎn)正常發(fā)布和消費(fèi),而沒有做鏡像的隊(duì)列只有當(dāng)所屬節(jié)點(diǎn)恢復(fù)正常后才能正常被發(fā)布和消費(fèi)。

至于需要用多少節(jié)點(diǎn)做鏡像,像我例子中的做法將所有節(jié)點(diǎn)都做鏡像,這個(gè)是最保守的做法,最大程度保證數(shù)據(jù)不丟失,但在實(shí)際情況下需要考慮額外的壓力,如網(wǎng)絡(luò)I/O,磁盤I/O等,因?yàn)樽鲧R像節(jié)點(diǎn)越多,所占用的帶寬就越多,磁盤I/O同理。根據(jù)官文建議,如果集群有3個(gè)節(jié)點(diǎn),可以選擇2個(gè)節(jié)點(diǎn)做鏡像,5個(gè)節(jié)點(diǎn)可以選擇3個(gè)節(jié)點(diǎn)鏡像,當(dāng)然也不是所有數(shù)據(jù)都需要做鏡像,特別對(duì)于那些只是瞬態(tài)或者對(duì)時(shí)間敏感的數(shù)據(jù),是不需要鏡像的,所以需要設(shè)置合理的策略。

集群服務(wù)延伸

其實(shí)也許有朋友會(huì)發(fā)現(xiàn)使用?rabbitmq-server指令創(chuàng)建的服務(wù),并非在Windows服務(wù)中創(chuàng)建的,而是當(dāng)前Windows用戶使用?erl.exe創(chuàng)建的一個(gè)進(jìn)程,因此一旦當(dāng)前用戶退出了系統(tǒng),RabbitMQ節(jié)點(diǎn)也就退出了服務(wù),所以上面創(chuàng)建服務(wù)的指令可以使用?rabbitmq-service。

set RABBITMQ_NODE_PORT=5673

set RABBITMQ_NODENAME=rabbit1

set RABBITMQ_SERVICENAME=rabbit1

set RABBITMQ_CONFIG_FILE=D:\Mark\Tempfiles\rabbitmq.conf

set RABBITMQ_SERVER_START_ARGS=-rabbitmq_management listener [{port,15673}]

rabbitmq-service install

rabbitmq-service start

這樣就可以創(chuàng)建一個(gè)名為?rabbit1的Windows后臺(tái)服務(wù),該服務(wù)歸屬于SYSTEM,因此即使當(dāng)前用戶注銷了,服務(wù)仍然可用。

再延伸一下

如果系統(tǒng)重啟了,這樣創(chuàng)建的服務(wù)會(huì)無法正常啟動(dòng),這是因?yàn)槲覀兩厦娴闹噶?set是臨時(shí)更改環(huán)境變量的,當(dāng)服務(wù)重新啟動(dòng)的時(shí)候,這些環(huán)境變量會(huì)恢復(fù)到原有值。

就這個(gè)情況,我們可以創(chuàng)建一個(gè)批處理文件,包含指令:

set RABBITMQ_NODE_PORT=5673

set RABBITMQ_NODENAME=rabbit1

set RABBITMQ_SERVICENAME=rabbit1

set RABBITMQ_CONFIG_FILE=D:\Mark\Tempfiles\rabbitmq.conf

set RABBITMQ_SERVER_START_ARGS=-rabbitmq_management listener [{port,15673}]

rabbitmq-service start

然后將這個(gè)批處理文件添加到任務(wù)計(jì)劃程序中,選擇觸發(fā)器為?計(jì)算機(jī)啟動(dòng)時(shí)。這樣即使系統(tǒng)重啟了,也會(huì)正常啟動(dòng)RabbitMQ的所有節(jié)點(diǎn),保證集群正常運(yùn)行。

總結(jié)

本文就記錄了我在windows系統(tǒng)中使用單機(jī)做RabbitMQ集群,也簡(jiǎn)單地做了一個(gè)高可用集群方案,單機(jī)集群方案更多地只是會(huì)出現(xiàn)在開發(fā)測(cè)試環(huán)境,實(shí)際生產(chǎn)環(huán)境還是會(huì)每臺(tái)機(jī)器部署一個(gè)服務(wù)的,但因?yàn)閷?duì)于多機(jī)集群,配置步驟也相差不大,所以對(duì)于實(shí)際生產(chǎn)環(huán)境的部署,本文也是有一定參考價(jià)值的,希望可以能對(duì)各位有一定的幫助。

喜歡就來個(gè)三連,讓更多人因你而受益

總結(jié)

以上是生活随笔為你收集整理的rabbitmq使用_RabbitMQ的使用(二) RabbitMQ服务在单机中做集群的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。