之前文章介紹了RabbitMQ的metadata, 元數據可以持久化在RAM或Disc.從這個角度可以把RabbitMQ集群中的節點分成兩種:RAM Node 和 Disk Node. RAM Node只會將元數據存放在RAM,Disc node 會將元數據持久化到磁盤.
單節點系統就沒有什么選擇了,只允許disk node,否則由於沒有數據冗余一旦重啟就會丟掉所有的配置信息.但在節點環境中可以選擇哪些節點是RAM node.

Check First
RabbitMQ Cluster的部署非常方便,有一些需要注意的細節,只要做過Erlang節點互連的,這些也都是耳熟能詳的了:
[1] 統一 Erlang Cookie; 雖然官方網站上提到了修改.erlang.cookie的方式,不過我從來沒有這樣做過,都是啟動erlang node的時候使用 -setcookie 顯示指定cookie;這樣做的影響就是rabbitmqctl由於沒有指定cookie不能正常使用了,可以同樣修改一下添加-setcookie.這里為了方便我拷貝rabbitmqctl新建了一個工具rabbitmq-util指定了cookie.如下:
exec erl \ -pa "${RABBITMQ_HOME}/ebin" \ -noinput \ -hidden \ ${RABBITMQ_CTL_ERL_ARGS} \ -setcookie zen_rabbitmq \ -name rabbitmqctl@zen.com \ -s rabbit_control \ -nodename $RABBITMQ_NODENAME \ -extra "$@"
需要統一erlang cookie的腳本有:rabbitmqctl rabbitmq-server
[2] 如果使用sname創建Erlang節點不包含節點所在機器的域名,如果使用name就需要指定域名,比如: 127.0.0.1 zen.com
Windows 下c:\Windows\System32\drivers\etc\hosts
Centos 路徑 /etc/hosts
[3] 如果在一台機器上啟動多個節點,就需要用端口號和節點名稱區分開,即使在多個機器上部署一般我們也會避免使用RabbitMQ的默認端口.這里也有很多方式,最快捷的方式就是添加變量啟動節點,在生產環境肯定需要使用配置文件來實現.下面是我測試使用的一組節點啟動命令:
RABBITMQ_NODE_PORT=9991 RABBITMQ_NODENAME=z_91@zen.com ./rabbitmq-server -detached RABBITMQ_NODE_PORT=9992 RABBITMQ_NODENAME=z_92@zen.com ./rabbitmq-server -detached RABBITMQ_NODE_PORT=9993 RABBITMQ_NODENAME=z_93@zen.com ./rabbitmq-server -detached RABBITMQ_NODE_PORT=9994 RABBITMQ_NODENAME=z_94@zen.com ./rabbitmq-server -detached
[4] 如果是在多台物理機進行測試,那么注意打開4369端口,保證EPMD正常工作.這個也可以通過修改環境變量ERL_EPMD_PORT使用別的端口.
[5] 執行命令細心一點,特別是關閉應用程序是stop_app,如果你執行的是stop,整個節點都會關閉,后續操作就錯了;
有一些操作過程不需要執行reset,這里也要注意,想清楚自己要做什么再動手.
下面我們走一個step by step的過程,完成一些RabbitMQ集群組建的常見的操作

Just do it
從零開始創建集群
- 啟動z_91@zen.com節點
- 啟動z_92@zen.com節點
- 關閉z_91節點的應用程序 ./rabbitmq-util -n z_91@zen.com stop_app
- 重置節點配置和元數據(可以理解為恢復出廠設置) ./rabbitmq-util -n z_91@zen.com reset
- 91與92節點組成集群 ./rabbitmq-util -n z_91@zen.com cluster z_92@zen.com
- 啟動91節點 ./rabbitmq-util -n z_91@zen.com start_app
- 查看集群的狀態 ./rabbitmq-util -n z_91@zen.com cluster_status
[root@localhost scripts]# [root@localhost scripts]# RABBITMQ_NODE_PORT=9991 RABBITMQ_NODENAME=z_91@zen.com ./rabbitmq-server -detached Activating RabbitMQ plugins ... 0 plugins activated: [root@localhost scripts]# RABBITMQ_NODE_PORT=9992 RABBITMQ_NODENAME=z_92@zen.com ./rabbitmq-server -detached Activating RabbitMQ plugins ... 0 plugins activated: [root@localhost scripts]# ./rabbitmq-util -n z_91@zen.com stop_app Stopping node 'z_91@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_91@zen.com reset Resetting node 'z_91@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_91@zen.com cluster z_92@zen.com Clustering node 'z_91@zen.com' with ['z_92@zen.com'] ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_91@zen.com start_app Starting node 'z_91@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_91@zen.com cluster_status Cluster status of node 'z_91@zen.com' ... [{nodes,[{disc,['z_92@zen.com']},{ram,['z_91@zen.com']}]}, {running_nodes,['z_92@zen.com','z_91@zen.com']}] ...done.
細心的你一定發現了,這里的結果有點奇怪,91節點將92節點拉入組成集群,但是disc節點是92,91節點是ram節點!這是怎么回事?我們暫且按下不表,后面細說,先來把實驗做完.
退出集群
記得911的一部紀錄片提到劫機的匪徒在學習開飛機的課程只學習了起飛,沒有學習降落,這,,,,,這就是找死去的啊.
我們能夠將Erlang 節點加入集群,也要學會退出集群. 看一下詳細的步驟:
- 關閉91節點的應用程序 ./rabbitmq-util -n z_91@zen.com stop_app
- 重置節點配置和元數據 ./rabbitmq-util -n z_91@zen.com reset
- 啟動91應用程序 ./rabbitmq-util -n z_91@zen.com start_app
- 查看集群狀態 ./rabbitmq-util -n z_92@zen.com cluster_status
[root@localhost scripts]# ./rabbitmq-util -n z_91@zen.com stop_app Stopping node 'z_91@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_91@zen.com reset Resetting node 'z_91@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_91@zen.com start_app Starting node 'z_91@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_92@zen.com cluster_status Cluster status of node 'z_92@zen.com' ... [{nodes,[{disc,['z_92@zen.com']}]},{running_nodes,['z_92@zen.com']}] ...done.
可以看到集群中已經沒有91節點了.
換一種方式組建集群
下面換一種方式組建集群,目的是觀察rabbitmq在構建集群是如何選擇Disc node的.和第一種組建方式的差異在於這行命令: ./rabbitmq-util -n z_91@zen.com cluster z_92@zen.com z_91@zen.com 這樣完成組建之后,查看一下集群狀態,注意disk node的已經變成了: [{nodes,[{disc,['z_91@zen.com','z_92@zen.com']}]},{running_nodes,['z_92@zen.com','z_91@zen.com']}]
[root@localhost scripts]# ./rabbitmq-util -n z_91@zen.com stop_app Stopping node 'z_91@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_91@zen.com reset Resetting node 'z_91@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_91@zen.com cluster z_92@zen.com z_91@zen.com Clustering node 'z_91@zen.com' with ['z_92@zen.com','z_91@zen.com'] ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_91@zen.com start_app Starting node 'z_91@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_91@zen.com cluster_status Cluster status of node 'z_91@zen.com' ... [{nodes,[{disc,['z_91@zen.com','z_92@zen.com']}]}, {running_nodes,['z_92@zen.com','z_91@zen.com']}] ...done. [root@localhost scripts]# ./rabbitmq-util -n z_92@zen.com cluster_status Cluster status of node 'z_92@zen.com' ... [{nodes,[{disc,['z_91@zen.com','z_92@zen.com']}]}, {running_nodes,['z_91@zen.com','z_92@zen.com']}] ...done. [root@localhost scripts]#
節點類型轉換--將92從disk node轉為ram node
上面組建的rabbitmq集群里面有兩個節點91 92,這兩個節點都是disk節點,我們希望可以動態調整節點的類型,比如把92節點從disk node 轉成ram node.看一下操作步驟
- 停止92的應用程序 ./rabbitmq-util -n z_92@zen.com stop_app
- 重新進行cluster ./rabbitmq-util -n z_92@zen.com cluster z_91@zen.com
- 啟動92應用程序 ./rabbitmq-util -n z_92@zen.com start_app
- 查看集群狀態 ./rabbitmq-util -n z_92@zen.com cluster_status
通過查看集群狀態,可以看到92已經變成了Ram節點.注意:在停止了92的應用程序之后並沒有執行reset操作.
[root@localhost scripts]# ./rabbitmq-util -n z_92@zen.com stop_app Stopping node 'z_92@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_92@zen.com cluster z_91@zen.com Clustering node 'z_92@zen.com' with ['z_91@zen.com'] ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_92@zen.com start_app Starting node 'z_92@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_92@zen.com cluster_status Cluster status of node 'z_92@zen.com' ... [{nodes,[{disc,['z_91@zen.com']},{ram,['z_92@zen.com']}]}, {running_nodes,['z_91@zen.com','z_92@zen.com']}] ...done. [root@localhost scripts]#
節點類型轉換--將92修改為disk節點
上面的過程將92從disk node轉換成為ram node ,下面我們執行逆過程,將92再轉成disk node,看下過程:
- 關閉92應用程序 ./rabbitmq-util -n z_92@zen.com stop_app
- 重新執行Cluster ./rabbitmq-util -n z_92@zen.com cluster z_91@zen.com z_92@zen.com
- 啟動92應用程序 ./rabbitmq-util -n z_92@zen.com start_app
- 檢查集群狀態 ./rabbitmq-util -n z_91@zen.com cluster_status
[root@localhost scripts]# ./rabbitmq-util -n z_91@zen.com cluster_status Cluster status of node 'z_91@zen.com' ... [{nodes,[{disc,['z_91@zen.com']},{ram,['z_92@zen.com']}]}, {running_nodes,['z_92@zen.com','z_91@zen.com']}] ...done. [root@localhost scripts]# ./rabbitmq-util -n z_92@zen.com stop_app Stopping node 'z_92@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_92@zen.com cluster z_91@zen.com z_92@zen.com Clustering node 'z_92@zen.com' with ['z_91@zen.com','z_92@zen.com'] ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_92@zen.com start_app Starting node 'z_92@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_91@zen.com cluster_status Cluster status of node 'z_91@zen.com' ... [{nodes,[{disc,['z_92@zen.com','z_91@zen.com']}]}, {running_nodes,['z_92@zen.com','z_91@zen.com']}] ...done. [root@localhost scripts]#
增加node 93
在上面的基礎上我們新增一個節點93:
[root@localhost scripts]# ./rabbitmq-util -n z_93@zen.com cluster_status Cluster status of node 'z_93@zen.com' ... [{nodes,[{disc,['z_93@zen.com']}]},{running_nodes,['z_93@zen.com']}] ...done. [root@localhost scripts]# ./rabbitmq-util -n z_93@zen.com stop_app Stopping node 'z_93@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_93@zen.com reset Resetting node 'z_93@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_93@zen.com cluster z_91@zen.com z_92@zen.com Clustering node 'z_93@zen.com' with ['z_91@zen.com','z_92@zen.com'] ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_93@zen.com start_app Starting node 'z_93@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_93@zen.com cluster_status Cluster status of node 'z_93@zen.com' ... [{nodes,[{disc,['z_92@zen.com','z_91@zen.com']},{ram,['z_93@zen.com']}]}, {running_nodes,['z_92@zen.com','z_91@zen.com','z_93@zen.com']}] ...done.
重新啟動節點,我們首先啟動節點RAM節點93
[root@localhost scripts]# ./rabbitmq-util -n z_91@zen.com stop Stopping and halting node 'z_91@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_92@zen.com stop Stopping and halting node 'z_92@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_93@zen.com stop Stopping and halting node 'z_93@zen.com' ... ...done. [root@localhost scripts]# RABBITMQ_NODE_PORT=9993 RABBITMQ_NODENAME=z_93@zen.com ./rabbitmq-server -detached Activating RabbitMQ plugins ... 0 plugins activated: [root@localhost scripts]# ./rabbitmq-util -n z_93@zen.com cluster_status Cluster status of node 'z_93@zen.com' ... Error: unable to connect to node 'z_93@zen.com': nodedown
啟動93失敗了,這是因為93節點是RAM節點並沒有持久化集群的元數據,啟動時需要連接到disk node獲取集群元數據,而這時其它的節點都沒有啟動,所以啟動就失敗了.下面我們嘗試先啟動92節點:
[root@localhost scripts]# RABBITMQ_NODE_PORT=9992 RABBITMQ_NODENAME=z_92@zen.com ./rabbitmq-server -detached Activating RabbitMQ plugins ... 0 plugins activated: [root@localhost scripts]# ./rabbitmq-util -n z_92@zen.com cluster_status Cluster status of node 'z_92@zen.com' ... [{nodes,[{disc,['z_92@zen.com','z_91@zen.com']},{ram,['z_93@zen.com']}]}, {running_nodes,['z_92@zen.com']}] ...done.
是正常的,下面我們啟動93節點
[root@localhost scripts]# RABBITMQ_NODE_PORT=9993 RABBITMQ_NODENAME=z_93@zen.com ./rabbitmq-server -detached Activating RabbitMQ plugins ... 0 plugins activated: [root@localhost scripts]# ./rabbitmq-util -n z_93@zen.com cluster_status Cluster status of node 'z_93@zen.com' ... [{nodes,[{disc,['z_92@zen.com','z_91@zen.com']},{ram,['z_93@zen.com']}]}, {running_nodes,['z_92@zen.com','z_93@zen.com']}] ...done.
乘勝追擊,繼續啟動91節點,注意cluster_status里面running nodes的變化:
[root@localhost scripts]# RABBITMQ_NODE_PORT=9991 RABBITMQ_NODENAME=z_91@zen.com ./rabbitmq-server -detached Activating RabbitMQ plugins ... 0 plugins activated: [root@localhost scripts]# ./rabbitmq-util -n z_93@zen.com cluster_status Cluster status of node 'z_93@zen.com' ... [{nodes,[{disc,['z_92@zen.com','z_91@zen.com']},{ram,['z_93@zen.com']}]}, {running_nodes,['z_91@zen.com','z_92@zen.com','z_93@zen.com']}] ...done. [root@localhost scripts]#
發布消息到集群
我們用C#寫一段代碼連接到92節點 創建隊列,並發布兩條消息;可以看到消息雖然連接到92節點,集群中的其它節點也都有了隊列信息.
[root@localhost scripts]# ./rabbitmq-util -n z_93@zen.com list_queues Listing queues ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_93@zen.com list_queues Listing queues ... zen_qp_pic_queue 1 qp_pic_queue2 1 ...done. [root@localhost scripts]# ./rabbitmq-util -n z_92@zen.com list_queues Listing queues ... zen_qp_pic_queue 1 qp_pic_queue2 1 ...done. [root@localhost scripts]# ./rabbitmq-util -n z_91@zen.com list_queues Listing queues ... zen_qp_pic_queue 1 qp_pic_queue2 1 ...done. [root@localhost scripts]#
在沒有disk node的情況下,添加節點,移除節點
為了方便下面的實驗,我們添加94節點到集群中,過程省略,我們檢查一下集群狀態:
[root@localhost scripts]# ./rabbitmq-util -n z_94@zen.com cluster_status Cluster status of node 'z_94@zen.com' ... [{nodes,[{disc,['z_92@zen.com','z_91@zen.com']}, {ram,['z_94@zen.com','z_93@zen.com']}]}, {running_nodes,['z_92@zen.com','z_93@zen.com','z_91@zen.com', 'z_94@zen.com']}] ...done.
現在集群中兩個disk node: 91 92 兩個RAM Node:93 94
[root@localhost scripts]# ./rabbitmq-util -n z_91@zen.com stop Stopping and halting node 'z_91@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_92@zen.com stop Stopping and halting node 'z_92@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_93@zen.com cluster_status Cluster status of node 'z_93@zen.com' ... [{nodes,[{disc,['z_92@zen.com','z_91@zen.com']}, {ram,['z_94@zen.com','z_93@zen.com']}]}, {running_nodes,['z_94@zen.com','z_93@zen.com']}] ...done. [root@localhost scripts]#
下面我們新增一個節點到集群中(過程略),看下結果
[root@localhost scripts]# ./rabbitmq-util -n z_95@zen.com cluster_status Cluster status of node 'z_95@zen.com' ... [{nodes,[{disc,['z_92@zen.com','z_91@zen.com']}, {ram,['z_95@zen.com','z_94@zen.com','z_93@zen.com']}]}, {running_nodes,['z_94@zen.com','z_93@zen.com','z_95@zen.com']}] ...done.
現在我們把集群中的所有節點都關閉,然后再啟動,看下會是什么情況:
[root@localhost scripts]# ./rabbitmq-util -n z_95@zen.com stop Stopping and halting node 'z_95@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_94@zen.com stop Stopping and halting node 'z_94@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_93@zen.com stop Stopping and halting node 'z_93@zen.com' ... ...done.
啟動集群中所有的節點
[root@localhost scripts]# RABBITMQ_NODE_PORT=9991 RABBITMQ_NODENAME=z_91@zen.com ./rabbitmq-server -detached Activating RabbitMQ plugins ... 0 plugins activated: [root@localhost scripts]# ./rabbitmq-util -n z_91@zen.com cluster_status Cluster status of node 'z_91@zen.com' ... [{nodes,[{disc,['z_92@zen.com','z_91@zen.com']}, {ram,['z_94@zen.com','z_93@zen.com']}]}, {running_nodes,['z_91@zen.com']}] ...done.
[root@localhost scripts]# RABBITMQ_NODE_PORT=9992 RABBITMQ_NODENAME=z_92@zen.com ./rabbitmq-server -detached Activating RabbitMQ plugins ... 0 plugins activated: [root@localhost scripts]# RABBITMQ_NODE_PORT=9993 RABBITMQ_NODENAME=z_93@zen.com ./rabbitmq-server -detached Activating RabbitMQ plugins ... 0 plugins activated: [root@localhost scripts]# RABBITMQ_NODE_PORT=9994 RABBITMQ_NODENAME=z_94@zen.com ./rabbitmq-server -detached Activating RabbitMQ plugins ... 0 plugins activated: [root@localhost scripts]# ./rabbitmq-util -n z_93@zen.com cluster_status Cluster status of node 'z_93@zen.com' ... [{nodes,[{disc,['z_92@zen.com','z_91@zen.com']}, {ram,['z_94@zen.com','z_93@zen.com']}]}, {running_nodes,['z_94@zen.com','z_92@zen.com','z_93@zen.com']}] ...done.
這時都是正常的,但是如果我們把95節點也啟動,就會出現異常,91 92 節點可能會當掉.后面再啟動就變成非常混亂的局面了.同樣,如果在沒有disk node的情況下移除了節點,也會導致這種混亂,甚至會導致disk node無法正常啟動,必須把節點重新加入之后,disk node才可以正常啟動.
在disk node全部關閉的情況下,我們可以繼續使用集群,就像什么都沒有發生一樣,但是使用過程中聲明的新的exchange queues等都會隨着節點的重啟煙消雲散.

有可能遇到的問題
問題1 怎樣從頭再來?
如果你測試過程中把節點關系搞得亂七八糟,各種重啟都會失敗,想從頭再來,但是崩潰的是reset命令執行也是失敗;沒有關系,要Hold住,轉到/var/lib/rabbitmq/mnesia 目錄把出問題節點對應的文件刪掉,重啟即可.
問題2 "Incompatible schema cookies. Please, restart from old backup"
在組建RabbitMQ集群的過程中,你可能會遇到"Incompatible schema cookies. Please, restart from old backup"的問題,這往往是下面的原因造成的:cluster多個節點,而這些節點並沒有構成集群.復現一下這個錯誤:我們啟動95 96 97 三個獨立的節點,然后 ./rabbitmq-util -n z_97@zen.com cluster z_95@zen.com z_96@zen.com 注意這時95 96並沒有組成集群,發生了上面的"Incompatible schema cookies. Please, restart from old backup"異常.
往往着急看到效果的時候,會犯這樣的錯,在不熟練的時候循序漸進的練習一下是很有必要的,可以避開一些坑.
[root@localhost scripts]# ./rabbitmq-util -n z_95@zen.com cluster_status Cluster status of node 'z_95@zen.com' ... [{nodes,[{disc,['z_95@zen.com']}]},{running_nodes,['z_95@zen.com']}] ...done. [root@localhost scripts]# ./rabbitmq-util -n z_96@zen.com cluster_status Cluster status of node 'z_96@zen.com' ... [{nodes,[{disc,['z_96@zen.com']}]},{running_nodes,['z_96@zen.com']}] ...done. [root@localhost scripts]# ./rabbitmq-util -n z_97@zen.com cluster_status Cluster status of node 'z_97@zen.com' ... [{nodes,[{disc,['z_97@zen.com']}]},{running_nodes,['z_97@zen.com']}] ...done. [root@localhost scripts]# ./rabbitmq-util -n z_97@zen.com stop_app Stopping node 'z_97@zen.com' ... ...done. [root@localhost scripts]# ./rabbitmq-util -n z_97@zen.com cluster z_95@zen.com z_96@zen.com Clustering node 'z_97@zen.com' with ['z_95@zen.com','z_96@zen.com'] ... Error: {unable_to_join_cluster, ['z_95@zen.com','z_96@zen.com'], {merge_schema_failed, "Incompatible schema cookies. Please, restart from old backup.'z_95@zen.com' = [{name,schema},{type,set},{ram_copies,[]},{disc_copies,['z_95@zen.com']},{disc_only_copies,[]},{load_order,0},{access_mode,read_write},{majority,false},{index,[]},{snmp,[]},{local_content,false},{record_name,schema},{attributes,[table,cstruct]},{user_properties,[]},{frag_properties,[]},{storage_properties,[]},{cookie,{{1352,726635,757709},'z_95@zen.com'}},{version,{{3,0},{'z_95@zen.com',{1352,727291,753066}}}}], 'z_97@zen.com' = [{name,schema},{type,set},{ram_copies,['z_97@zen.com']},{disc_copies,['z_96@zen.com']},{disc_only_copies,[]},{load_order,0},{access_mode,read_write},{majority,false},{index,[]},{snmp,[]},{local_content,false},{record_name,schema},{attributes,[table,cstruct]},{user_properties,[]},{frag_properties,[]},{storage_properties,[]},{cookie,{{1352,727184,282322},'z_96@zen.com'}},{version,{{3,0},{'z_97@zen.com',{1352,727291,780429}}}}]\n"}} [root@localhost scripts]#
注: Rabbitmq 上有人遇到相同的問題 [鏈接]
通過上面的動手實驗,我們已經可以創建和管理RabbitMQ Cluster,但是創建RAM節點還是Disc節點呢?如何做這個選擇呢?咱們下回再說
附RabbitMQ Cluster 文檔: http://www.rabbitmq.com/clustering.html#auto-config
另外,在測試過程中往往在單機創建多個實例,下面的命令常用:
A cluster on a single machine
Under some circumstances it can be useful to run a cluster of RabbitMQ nodes on a single machine. This would typically be useful for experimenting with clustering on a desktop or laptop without the overhead of starting several virtual machines for the cluster. The two main requirements for running more than one node on a single machine are that each node should have a unique name and bind to a unique port / IP address combination for each protocol in use.
You can start multiple nodes on the same host manually by repeated invocation of rabbitmq-server (rabbitmq-server.bat on Windows). You must ensure that for each invocation you set the environment variables RABBITMQ_NODENAME and RABBITMQ_NODE_PORT to suitable values.
For example:
$ RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit rabbitmq-server -detached $ RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=hare rabbitmq-server -detached $ rabbitmqctl -n hare stop_app $ rabbitmqctl -n hare join_cluster rabbit@`hostname -s` $ rabbitmqctl -n hare start_appwill set up a two node cluster with one disc node and one ram node. Note that if you have RabbitMQ opening any ports other than AMQP, you'll need to configure those not to clash as well - for example:
$ RABBITMQ_NODE_PORT=5672 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15672}]" RABBITMQ_NODENAME=rabbit rabbitmq-server -detached $ RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=hare rabbitmq-server -detachedwill start two nodes (which can then be clustered) when the management plugin is installed.
最后,小圖一張 Maggie Q 簡稱MQ 我們倆都姓李 Nikita!

