rabbitmq使用_RabbitMQ的使用(二) RabbitMQ服务在单机中做集群
作者:markjiang7m2
博客園地址:https://www.cnblogs.com/markjiang7m2/p/12837151.html
官網地址:http://letyouknow.net
在上一篇RabbitMQ的使用(一)- RabbitMQ服務安裝?中總結的是在Windows服務器上安裝服務,對于一個高可用部署方案,必須要做集群。我自己在用的就是一臺Windows系統機器,如果做集群的話,運行幾個虛擬機或者跑幾個Docker就可以很簡單地實現了,但是我看了下官文關于集群的配置,是支持直接在當前系統中開多個服務配置集群的,所以就有了這一篇折騰文章了。
官文配置集群鏈接https://www.rabbitmq.com/clustering.html
Windows系統單機做RabbitMQ集群
單機啟動多個RabbitMQ服務
其實在單機做集群的適用場景可能是在于開發環境和測試環境,而使用單機跟多機做集群之間的差別是在于如何在單機上啟動多個RabbitMQ服務,只要把服務安裝好了,后面的步驟跟多機就是一樣的。
官網關于單機做集群的指引在這里https://www.rabbitmq.com/clustering.html#single-machine,但是以Linux系統為例的,Windows系統還不能直接使用例子上面的命令。
如例子中創建RabbitMQ服務的指令:
RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit rabbitmq-server -detached
在Windows系統的DOS命令就需要分為多個指令:
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
啟動效果如下:
然后以相同的方式再啟動多一個節點rabbit2。
單機添加多個節點到同一個集群中
在上一篇文章中安裝RabbitMQ服務時,就已經默認了端口為5672的RabbitMQ服務。這一次,我就以這個服務為主節點,將節點rabbit1,rabbit2添加到這個集群中。
在添加到集群之前,我們來看一下原有的集群配置,配置文件在?C:\Users\%UserName%\AppData\Roaming\RabbitMQ\db\%nodename%-mnesia目錄下,文件名為?cluster_nodes.config。可以看到現在三個節點的配置都是類似的,?{[%nodename%],[%nodename%]}.,意為每個節點都在自己獨立的集群中。
根據官文的指引,要添加到同一個集群,執行下面的指令即可:
rabbitmqctl -n rabbit1 stop_app
rabbitmqctl -n rabbit1 join_cluster rabbit@%hostname%
rabbitmqctl -n rabbit1 start_app
效果如下:
此時可以發現?http://localhost:15672/#/和?http://localhost:15673/#/顯示是一樣的了,包括集群名稱。
以相同的方式將rabbit2加入到該集群中。
這個時候我們再看集群配置文件?cluster_nodes.config,已經包含了三個節點,格式如下:
{[%node1name%,%node2name%,%nodename%],[%node1name%,%node2name%,%nodename%]]}.
從集群中移除節點
簡單的集群就已經做完了。那如果想要將其中一個節點從集群中移除,需要什么指令呢?
下面是我從集群中移除節點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這一步是不可少的,如果移除節點后,直接啟動節點會報錯。
此時再看管理界面,也會發現rabbit2被移除了,列表中只有兩個節點。
還有一點需要注意的是Erlang cookie。每個節點都必須保持一致,可以將主節點的home dir目錄下的cookie值復制到其它節點中。
home dir目錄可以在RabbitMQ日志中找到,一般默認值為:C:\Windows\System32\config\systemprofile。cookie文件名為:?.erlang.cookie。
其它節點的Erlang cookie需要被覆蓋的有兩個地方,home dir目錄和user目錄下的?.erlang.cookie文件,user目錄為?C:\Users\%username%。這個覆蓋操作一般都是針對多機集群的,因為我這里用的是單機做集群,所有節點的home dir和user目錄都是一樣的,所以我這里不需要覆蓋。
RabbitMQ HA高可用鏡像隊列
官文地址:https://www.rabbitmq.com/ha.html
上面就建立起了有三個節點的RabbitMQ集群。默認情況下,RabbitMQ集群中隊列的內容位于單個節點(聲明該隊列的節點)上。這與交換機和綁定相反,交換機和綁定始終可以被視為在所有節點上,這就會導致了當隊列的內容存在于A節點,當A節點宕機了,B節點仍然存在A節點中的隊列,但無法獲取A節點隊列的內容。此時,我們可以選擇使隊列跨多個節點進行鏡像。
我們可以通過策略配置鏡像參數。一個策略按名稱匹配一個或多個隊列(使用正則表達式模式),并且包含一個定義(可選參數的映射),該定義被添加到匹配隊列的全部屬性中。
我這里使用的虛擬主機為?markhost,然后在Admin-> Policies-> Add/update a policy 創建一個策略,如下:
這里有兩個地方比較注意的地方。
Pattern:^mark1?此處意為當命名以?mark1開頭的隊列進行鏡像。ha-mode:all?此處意為對所有節點都進行鏡像,這里的參數設置參考官文說明https://www.rabbitmq.com/ha.html#mirroring-arguments
創建兩個隊列,分別命名為?mark_queue和?mark1_queue
mark1_queue隊列中,Node為?rabbit@xxx表示該隊列是屬于?rabbit節點的,?+2的標志表示有兩個鏡像節點,Features含有?mark_Pli1,表示該隊列符合?mark_Pli1策略。
mark_queue隊列因為不符合策略,所以并沒有鏡像節點。
現在我嘗試將?rabbit節點停止了,運行指令?rabbitmqctl-n rabbit stop_app,再看隊列情況。
會發現?mark1_queue隊列已經自動轉移到?rabbit2節點中,而且依然正常運行,而?mark_queue隊列的狀態則被標記為?down,這是因為做了鏡像的隊列內容存在于所有節點中,當所屬節點宕機了,會繼續通過其它節點正常發布和消費,而沒有做鏡像的隊列只有當所屬節點恢復正常后才能正常被發布和消費。
至于需要用多少節點做鏡像,像我例子中的做法將所有節點都做鏡像,這個是最保守的做法,最大程度保證數據不丟失,但在實際情況下需要考慮額外的壓力,如網絡I/O,磁盤I/O等,因為做鏡像節點越多,所占用的帶寬就越多,磁盤I/O同理。根據官文建議,如果集群有3個節點,可以選擇2個節點做鏡像,5個節點可以選擇3個節點鏡像,當然也不是所有數據都需要做鏡像,特別對于那些只是瞬態或者對時間敏感的數據,是不需要鏡像的,所以需要設置合理的策略。
集群服務延伸
其實也許有朋友會發現使用?rabbitmq-server指令創建的服務,并非在Windows服務中創建的,而是當前Windows用戶使用?erl.exe創建的一個進程,因此一旦當前用戶退出了系統,RabbitMQ節點也就退出了服務,所以上面創建服務的指令可以使用?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
這樣就可以創建一個名為?rabbit1的Windows后臺服務,該服務歸屬于SYSTEM,因此即使當前用戶注銷了,服務仍然可用。
再延伸一下
如果系統重啟了,這樣創建的服務會無法正常啟動,這是因為我們上面的指令?set是臨時更改環境變量的,當服務重新啟動的時候,這些環境變量會恢復到原有值。
就這個情況,我們可以創建一個批處理文件,包含指令:
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
然后將這個批處理文件添加到任務計劃程序中,選擇觸發器為?計算機啟動時。這樣即使系統重啟了,也會正常啟動RabbitMQ的所有節點,保證集群正常運行。
總結
本文就記錄了我在windows系統中使用單機做RabbitMQ集群,也簡單地做了一個高可用集群方案,單機集群方案更多地只是會出現在開發測試環境,實際生產環境還是會每臺機器部署一個服務的,但因為對于多機集群,配置步驟也相差不大,所以對于實際生產環境的部署,本文也是有一定參考價值的,希望可以能對各位有一定的幫助。
喜歡就來個三連,讓更多人因你而受益
總結
以上是生活随笔為你收集整理的rabbitmq使用_RabbitMQ的使用(二) RabbitMQ服务在单机中做集群的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iPhone顶级机型5年涨价40%!库克
- 下一篇: 测量仪图片_南昌高度仪价格,大行程非标影