rabbitmq使用_RabbitMQ的使用(二) RabbitMQ服务在单机中做集群
作者: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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iPhone顶级机型5年涨价40%!库克
- 下一篇: 测量仪图片_南昌高度仪价格,大行程非标影