1. 程式人生 > 實用技巧 >RabbitMQ (十三) 叢集+單機搭建(window)

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-pluginsenablerabbitmq_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_app

2)將 node2 加入到 node1

rabbitmqctl join_cluster rabbit1@node1

3)啟動 node2

先停止 rabbitmqctl stop

在啟動 rabbitmq-server -detached

4)開啟 15672 和 15673 管理後臺驗證:

三.節點操作

增加

1. rabbitmq-server -detached --- .erlang.cooike的許可權,400 屬主rabbitmq 2.rabbitmqctl stop_app 3. rabbitmqctl join_cluster --ram rabbit@rabbitmq1 4. rabbitmqctl start_app 5. rabbitmqctl cluster_status

刪除

1. rabbitmq-server -detached 正常執行的節點省略此步. 2.rabbitmqctl stop_app 3. rabbitmqctl reset

硬刪除

直接刪掉叢集中的某個節點 rabbitmqctl forget_cluster_node node_name

參考:

https://www.cnblogs.com/nulige/p/8874893.html

https://blog.csdn.net/vbirdbest/article/details/78723467

https://blog.csdn.net/fgf00/article/details/79558498