RabbitMQ (十三) 叢集+單機搭建(window)
拜讀了網上很多前輩的文章,對RabbitMQ的叢集有了一點點認識.
好多文章都說到,RabbitMQ的叢集分為普通叢集和映象叢集,有的還加了兩種:單機叢集和主從叢集.
我看來看去,看了半天,怎麼感覺,其實RabbitMQ的叢集實際就一種:普通叢集.
至於單機叢集,無非是在一臺機器上模擬普通叢集,
映象叢集,不過是RabbitMQ的HA方案而已,因為這種叢集方式在部署的時候,其實是通過配置引數,讓佇列可以"真正的"在多個節點上儲存.(而普通叢集,佇列實際只會儲存在一個節點).
主從叢集,則是在映象叢集的基礎上,加一層負載均衡而已.
個人愚見,也許不對.
一.原理
RabbitMQ的叢集的設計目的是在增加更多節點時,能線性的增加效能(CPU,記憶體)和容量(記憶體,磁碟).同時,一個節點宕機了,其他節點依然可以提供 RabbitMQ 的服務.
所以, 佇列的完整資料 只會儲存在建立它的那個節點上,其他節點只會儲存該佇列的元資料和一個指向這個佇列的指標而已.
一個佇列的完整資料包括佇列的元資料和佇列的內容:
RabbitMQ一共有4種類型的元資料,並且,RabbitMQ叢集會始終同步這4種元資料.
- 佇列元資料:佇列的名稱和宣告佇列時設定的屬性(是否持久化、是否自動刪除、佇列所屬的節點)
- 交換機元資料:交換機的名稱、型別、屬性(是否持久化等)
- 繫結元資料:一張簡單的表格展示瞭如何將訊息路由到佇列.包含的列有 交換機名稱、交換機型別、路由鍵、佇列名稱等
- vhost元資料:為vhost內佇列、交換機和繫結提供名稱空間和安全屬性
因此,當用戶訪問其中任何一個RabbitMQ節點時,通過rabbitmqctl查詢到的queue,user,exchange,vhost等資訊都是相同的.
下圖是一個有3個節點的叢集,可以看到,訊息儲存在節點1.
當消費者從節點2獲取訊息時,RabbitMQ 會把節點1的訊息取出來,傳遞到節點2,再發送給消費者.這種方式的最大問題在於,如果節點1宕機了,那麼節點2和節點3就無法獲取到節點1中還未消費的訊息了.
如果做了佇列持久化及訊息持久化,那麼必須等到節點1恢復後,才能被消費,並且在節點1恢復之前,其它節點不能再建立節點1已經建立過的佇列;
如果佇列沒有持久化,訊息就會失丟.
因此,這種預設的叢集模式更適合非持久化佇列,只有該佇列是非持久話的,客戶端才能重新連線到叢集裡的其他節點,並重新建立該佇列.假如該佇列是持久化的,那麼只能將故障節點恢復起來.否則,永遠無法建立同名的佇列.
為了證明上面說的話,我們通過搭建一個單機叢集,來模擬這個場景 .
二.搭建單機叢集
1.配置Hosts節點
127.0.0.1 node1
127.0.0.1 node2
2.複製兩份 RabbitMQ ,分別取名"-1","-2"
這裡我們約定 "-1" 是 node1 的 RabbitMQ,"-2"是 node2 的 RabbitMQ.
3.修改 node1 的 rabbitmq-env.bat 檔案
檔案路徑 : rabbitmq_server-3.7.10-1\sbin\rabbitmq-env.bat
在 16 行加如下配置:
set RABBITMQ_CONFIG_FILE=!RABBITMQ_HOME!\etc\rabbitmq-node1 set RABBITMQ_BASE=!RABBITMQ_BASE!\rabbitmq-cluster set RABBITMQ_NODENAME=rabbit1@node1 set RABBITMQ_NODE_PORT=5672
再上個圖,清楚些.
注意第19行, 是 rabbit1@node1 ,不是 rabbit@node1 ,單機叢集,@前面一定要不一樣,否則會"痛不欲生"...
4.修改 node1 的 rabbitmq-node1.config 檔案
首先進入 rabbitmq_server-3.7.10-1\etc 資料夾,安裝的時候會有一個官方示例檔案 : rabbitmq.config.example
複製一份,改個名 : rabbitmq-node1.config
在 542 行加如下配置:
{listener,[{port,15672}, {ip,"127.0.0.1"}, {ssl,false}]}
注意,我的 RabbitMQ 版本是 3.7.10 ,版本不一樣,行數不一樣,截個圖,就是在這幾行註釋下面 :
5.啟動 node1
1)關閉啟動的 RabbitMQ
由於電腦上已經以window服務的方式啟動了RabbitMQ,為了方便演示單機叢集的搭建,所以我們需要將它關閉掉.
rabbitmq-service stop
,
2)啟動 node 1 的 RabbitMQ
進入 node1 的 sbin 資料夾,也就是 rabbitmq_server-3.7.10-1\sbin 資料夾,然後我們以後臺應用的方式啟動.
rabbitmq-server -detached
驗證一下:
在瀏覽器位址列輸入 http://localhost:15672/#/
如果沒有啟動管理後臺外掛,需要先啟動它 : rabbitmq-plugins enable rabbitmq_management (由於之前已經啟動過了,所以我這裡就不需要再啟動了)
預設的賬號密碼都是 guest
在管理後臺可以看到,node1 已經成功啟動了.
6.修改 node2 的配置檔案
按照第3,4步的方式修改,只是把管理後臺的埠由 15672 改成 15673,當然,檔名要改成 rabbitmq-node2.config
{listener,[{port,15673}, {ip,"127.0.0.1"}, {ssl,false}]}
rabbitmq-env.bat 檔案修改如下,紅色標註,特別注意 rabbit2@node2
set RABBITMQ_CONFIG_FILE=!RABBITMQ_HOME!\etc\rabbitmq-node2 set RABBITMQ_BASE=!RABBITMQ_BASE!\rabbitmq-cluster set RABBITMQ_NODENAME=rabbit2@node2 set RABBITMQ_NODE_PORT=5673
7.啟動 node2
參考第5步的第2小步啟動.
驗證一下:
在瀏覽器位址列輸入 http://localhost:15673/#/
沒毛病!
8.將 node2 加入叢集
1)關閉 node2
rabbitmqctl stop
2)將 node2 加入到 node1
rabbitmqctl join_cluster rabbit1@node1
3)啟動 node2
rabbitmq-server -detached
4)開啟 15672 和 15673 管理後臺驗證:
參考:
https://blog.csdn.net/vbirdbest/article/details/78723467
https://blog.csdn.net/fgf00/article/details/79558498