RabbitMQ 集羣

1、集羣簡介html

      一個RabbitMQ broker是一個或者幾個Erlang節點的一個邏輯分組,每一個節點運行着RabbitMQ應用和共享用戶、虛擬主機、隊列、交換機等等。有時候咱們把這些節點集合做爲集羣。node

      爲了作到可靠、可擴展和ACID屬性,全部數據或者狀態都須要RabbitMQ broker複製到全部節點。對此,一個例外是消息隊列,默認駐留在建立它們的節點上,雖然它們對於全部節點都是可訪問和可見的。經過節點在集羣內複製隊列,能夠參見這裏(須要注意的是首先必須是集羣)。服務器

      RabbitMQ不能很好的處理分區容忍,因此它不能用於WAN。shovel或者federation插件很能很好的解決這個問題。cookie

    集羣的配置可以被動態地改變。全部RabbitMQ broker在一個單獨的節點上開始運行,這些節點可以被加入到集羣中,隨後又能轉換成單獨的broker。網絡

      RabbitMQ broker容忍個別節點的失敗。節點可以被隨意的啓動和中止。數據結構

一個節點能夠是磁盤節點或者內存節點(注意:diskdisc在使用上是可交換的,配置語法或者狀態消息一般使用disc)。 內存節點保持它們的狀態僅僅在內存中(隊列內容除外,若是隊列持久化或者太大不能放在內存中則駐留在磁盤上)。磁盤節點保持狀態在內存中和磁盤上。內存節 點不會像磁盤節點同樣寫入到磁盤,所以性能更佳。然而,須要注意的是隊列數據一直存儲在磁盤上,性能的提高僅僅影響到資源管理(例如:添加/刪除隊列、交 換機、或者虛擬機),而不是發佈和消費速度。由於狀態複製到集羣內全部節點,因此集羣內能夠只有一個磁盤節點(可是不推薦)用於存儲集羣狀態。app

 

2、集羣副本負載均衡

接下來是一個設置和操做RabbitMQ集羣的副本,其經過三臺機器構成一個集羣,分別是rabbit一、rabbit二、rabbit3,其中兩臺機器複製數據到內存和磁盤,另一臺僅僅複製數據到內存中。tcp

咱們假設用戶登陸到全部的三臺機器上,RabbitMQ已經安裝到機器上了,rabbitmq-server和rabbitmqctl腳本已經在用戶PATH裏了。分佈式

一、初始化設置

Erlang節點使用cookie來檢測它們之間是否容許通訊,若是兩個節點可以通訊,那麼它們必須擁有相同的cookie。

Cookie僅僅是一個含有文字與數字的字符串,若是你喜歡其能夠是long或者short。

RabbitMQ服務器啓動的時候,Erlang將自動建立隨機cookie文件。這個文件通常位於/var/lib/rabbitmq/.erlang.cookie。最簡單的方式是容許其中一個節點建立cookie文件,而後將其拷貝到集羣內全部其它節點。

做爲一種選擇,你能夠在調用rabbitmq-server和rabbitmqctl腳本時插入選項「-setcookie cookie」。

二、啓動獨立節點

      用正常的方式在全部節點上啓動RabbitMQ,具體以下:

rabbit1$ rabbitmq-server -detached

rabbit2$ rabbitmq-server -detached

rabbit3$ rabbitmq-server -detached

      如此,則建立了三個獨立的RabbitMQ broker,每一個節點上一個,能夠經過以下命令查看集羣狀態:

rabbit1$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit1 ...
[{nodes,[{disc,[rabbit@rabbit1]}]},{running_nodes,[rabbit@rabbit1]}]
...done.
rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit2]}]},{running_nodes,[rabbit@rabbit2]}]
...done.
rabbit3$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit3 ...
[{nodes,[{disc,[rabbit@rabbit3]}]},{running_nodes,[rabbit@rabbit3]}]
...done.

三、建立集羣

      爲了將三個節點連入集羣中,咱們將其中兩個節點加入到第三個節點的集羣中,好比:將rabbit@rabbit2和rabbit@rabbit3加入到rabbit@rabbit1。

      咱們首先將rabbit@rabbit2做爲內存節點加入到rabbit@rabbit1的集羣中,以下操做便可達到目的:

rabbit2$ rabbitmqctl stop_app
Stopping node rabbit@rabbit2 ...done.
rabbit2$ rabbitmqctl join_cluster --ram rabbit@rabbit1
Clustering node rabbit@rabbit2 with [rabbit@rabbit1] ...done.
rabbit2$ rabbitmqctl start_app
Starting node rabbit@rabbit2 ...done.

      須要注意的是加入一個集羣會隱式重啓該節點,所以節點上以前存在的資源和數據都會被刪除。

      在任意節點上運行rabbitmqctl cluster_status都會看到這兩個節點已經一個集羣中了,具體以下:

rabbit1$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit1 ...
[{nodes,[{disc,[rabbit@rabbit1]},{ram,[rabbit@rabbit2]}]},
{running_nodes,[rabbit@rabbit2,rabbit@rabbit1]}]
...done.
rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit1]},{ram,[rabbit@rabbit2]}]},
{running_nodes,[rabbit@rabbit1,rabbit@rabbit2]}]
...done.

      如今咱們能夠將rabbit@rabbit3以磁盤節點模式加入相同的集羣。加入步驟跟上面相似,但不一樣的是要刪除—ram標誌,由於默認就是磁盤節點模 式。實際上,在將節點加入集羣時,能夠選擇集羣內任何在線節點,而不必定是rabbit@rabbit1,這裏選擇的就是rabbit@rabbit2, 具體請看以下:

rabbit3$ rabbitmqctl stop_app
Stopping node rabbit@rabbit3 ...done.
rabbit3$ rabbitmqctl join_cluster rabbit@rabbit2
Clustering node rabbit@rabbit3 with rabbit@rabbit2 ...done.
rabbit3$ rabbitmqctl start_app
Starting node rabbit@rabbit3 ...done.

      一樣,在任意節點上運行rabbitmqctl cluster_status都會看到這三個節點已經一個集羣中了,具體以下:

rabbit1$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit1 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit3]},{ram,[rabbit@rabbit2]}]},
{running_nodes,[rabbit@rabbit3,rabbit@rabbit2,rabbit@rabbit1]}]
...done.
rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit3]},{ram,[rabbit@rabbit2]}]},
{running_nodes,[rabbit@rabbit3,rabbit@rabbit1,rabbit@rabbit2]}]
...done.
rabbit3$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit3 ...
[{nodes,[{disc,[rabbit@rabbit3,rabbit@rabbit1]},{ram,[rabbit@rabbit2]}]},
{running_nodes,[rabbit@rabbit2,rabbit@rabbit1,rabbit@rabbit3]}]
...done.

      按上述步驟,只要集羣處於運行狀態,咱們能夠隨時加入一個新的節點到集羣中。

四、改變節點類型

      咱們能改變將節點類型從內存改成磁盤,反之亦然。咱們可使用rabbitmqctl change_cluster_node_type命令來改變節點類型,但節點必須先rabbitmqctl stop_app。接下來的實例演示如何將上面集羣中的rabbit@rabbit2改成磁盤節點,rabbit@rabbit3改成內存節點:

rabbit2$ rabbitmqctl stop_app
Stopping node rabbit@rabbit2 ...done.
rabbit2$ rabbitmqctl change_cluster_node_type disc
Turning rabbit@rabbit2 into a disc node ...
...done.
Starting node rabbit@rabbit2 ...done.
rabbit3$ rabbitmqctl stop_app
Stopping node rabbit@rabbit3 ...done.
rabbit3$ rabbitmqctl change_cluster_node_type ram
Turning rabbit@rabbit3 into a ram node ...
rabbit3$ rabbitmqctl start_app
Starting node rabbit@rabbit3 ...done.

五、重啓集羣節點

      集羣中的節點能夠隨時被停在,固然崩潰也沒問題。在這兩種狀況下,集羣中的其他節點將繼續工做而不受影響,當已中止或崩潰的節點再次啓動時,其他節點會自動「catch up」。

      咱們關閉節點rabbit@rabbit1和rabbit@rabbit3,而後檢查集羣狀態,具體以下:

rabbit1$ rabbitmqctl stop
Stopping and halting node rabbit@rabbit1 ...done.
rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]},{ram,[rabbit@rabbit3]}]},
{running_nodes,[rabbit@rabbit3,rabbit@rabbit2]}]
...done.
rabbit3$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit3 ...
[{nodes,[{disc,[rabbit@rabbit2,rabbit@rabbit1]},{ram,[rabbit@rabbit3]}]},
{running_nodes,[rabbit@rabbit2,rabbit@rabbit3]}]
...done.
rabbit3$ rabbitmqctl stop
Stopping and halting node rabbit@rabbit3 ...done.
rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]},{ram,[rabbit@rabbit3]}]},
{running_nodes,[rabbit@rabbit2]}]
...done.

      如今咱們再次啓動這兩個節點,而後檢查集羣狀態,具體以下:

rabbit1$ rabbitmq-server -detached
rabbit1$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit1 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]},{ram,[rabbit@rabbit3]}]},
{running_nodes,[rabbit@rabbit2,rabbit@rabbit1]}]
...done.
rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]},{ram,[rabbit@rabbit3]}]},
{running_nodes,[rabbit@rabbit1,rabbit@rabbit2]}]
...done.
rabbit3$ rabbitmq-server -detached
rabbit1$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit1 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]},{ram,[rabbit@rabbit3]}]},
{running_nodes,[rabbit@rabbit2,rabbit@rabbit1,rabbit@rabbit3]}]
...done.
rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]},{ram,[rabbit@rabbit3]}]},
{running_nodes,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]
...done.
rabbit3$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit3 ...
[{nodes,[{disc,[rabbit@rabbit2,rabbit@rabbit1]},{ram,[rabbit@rabbit3]}]},
{running_nodes,[rabbit@rabbit2,rabbit@rabbit1,rabbit@rabbit3]}]
...done.

      有一些重要的注意事項須要提出來,具體以下:

      (1)不管什麼時候,集羣中至少要有一個磁盤節點處在運行中,以防止數據丟失。在不少狀況下,RabbitMQ將會阻止建立一個僅僅有內存節點的集羣,可是它不會阻止你中止或者重置全部磁盤節點,這將致使一個僅僅有內存節點的集羣出現。這樣作是不可取的,這會很容易丟失數據。

      (2)當整個集羣brought down時,最後一個go down的節點必須第一個brought online。若是這種狀況不會發生,則全部節點將等待30秒用於等待最後一個磁盤節點上線,若是最後一個節點離線不能起來,則不能使用rabbitmqctl forget_cluster_node命令將其從集羣中移除,具體查看rabbitmqctl幫助頁面已得到更多信息。

六、解散集羣

      當節點想要脫離集羣時,須要顯示地從集羣中將其移除。咱們首先移除rabbit@rabbit3,須要經過以下操做才能將其從集羣中移除:

rabbit3$ rabbitmqctl stop_app
Stopping node rabbit@rabbit3 ...done.
rabbit3$ rabbitmqctl reset
Resetting node rabbit@rabbit3 ...done.
rabbit3$ rabbitmqctl start_app
Starting node rabbit@rabbit3 ...done.

      能夠經過在該節點上運行rabbitmqctl cluster_status命令來證明其再也不是集羣成員:

rabbit1$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit1 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]},
{running_nodes,[rabbit@rabbit2,rabbit@rabbit1]}]
...done.
rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]},
{running_nodes,[rabbit@rabbit1,rabbit@rabbit2]}]
...done.
rabbit3$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit3 ...
[{nodes,[{disc,[rabbit@rabbit3]}]},{running_nodes,[rabbit@rabbit3]}]
...done.

      咱們也能夠遠程移除節點,例如:當不得不處理一個無應答的節點時,這很是有用。下面演示從rabbit@rabbit2移除rabbit@rabbit1:

rabbit1$ rabbitmqctl stop_app
Stopping node rabbit@rabbit1 ...done.
rabbit2$ rabbitmqctl forget_cluster_node rabbit@rabbit1
Removing node rabbit@rabbit1 from cluster ...
...done.

      須要注意的是此時rabbit@rabbit1任然認爲其還在rabbit@rabbit2的集羣中,可是當嘗試着啓動它時會返回錯誤。咱們須要重置它已讓其能夠再次被啓動:

rabbit1$ rabbitmqctl start_app
Starting node rabbit@rabbit1 ...
Error: inconsistent_cluster: Node rabbit@rabbit1 thinks it's clustered with node rabbit@rabbit2, but rabbit@rabbit2 disagrees
rabbit1$ rabbitmqctl reset
Resetting node rabbit@rabbit1 ...done.
rabbit1$ rabbitmqctl start_app
Starting node rabbit@mcnulty ...
...done.

   再次運行分別在三個節點上運行rabbitmqctl cluster_status命令,會發現它們都各自獨立運行着RabbitMQ broker:

rabbit1$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit1 ...
[{nodes,[{disc,[rabbit@rabbit1]}]},{running_nodes,[rabbit@rabbit1]}]
...done.
rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit2]}]},{running_nodes,[rabbit@rabbit2]}]
...done.
rabbit3$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit3 ...
[{nodes,[{disc,[rabbit@rabbit3]}]},{running_nodes,[rabbit@rabbit3]}]
...done.

      須要注意的是rabbit@rabbit2此時仍保持着集羣的殘餘狀態,然而rabbit@rabbit1和rabbit@rabbit3的 RabbitMQ broker則是清新的初始狀態。若是咱們想讓rabbit@rabbit2也這樣須要其執行相同的步驟:

rabbit2$ rabbitmqctl stop_app
Stopping node rabbit@rabbit2 ...done.
rabbit2$ rabbitmqctl reset
Resetting node rabbit@rabbit2 ...done.
rabbit2$ rabbitmqctl start_app
Starting node rabbit@rabbit2 ...done.

七、自動配置集羣

      除了經過命令能夠實現集羣外,還能夠經過配置文件來實現集羣,配置文件能夠參看這裏,也能夠參看這裏。在該文件中設置cluster_nodes域,該域是一個tuple包含一個節點列表,一個atom指示是磁盤仍是內存節點。

      若是cluster_nodes被指定,RabbitMQ將嘗試着集羣節點列表中全部擁有相同Erlang和RabbitMQ版本的在線節點。

      須要注意的是集羣配置僅僅應用於新節點。新節點是指剛被重置或者第一次啓動的節點。所以,自動集羣不會在重啓節點後當即生效。這意味着經過rabbitmqctl對集羣發生的任何改變都優先於自動集羣配置。

      下面咱們將演示如何把三個獨立的節點加入集羣,其中rabbit@rabbit1和rabbit@rabbit2爲磁盤節點,爲了確保全部節點的乾淨,首先咱們須要重置和中止全部節點,具體以下:

rabbit1$ rabbitmqctl stop_app
Stopping node rabbit@rabbit1 ...done.
rabbit1$ rabbitmqctl reset
Resetting node rabbit@rabbit1 ...done.
rabbit1$ rabbitmqctl stop
Stopping and halting node rabbit@rabbit1 ...done.
rabbit2$ rabbitmqctl stop_app
Stopping node rabbit@rabbit2 ...done.
rabbit2$ rabbitmqctl reset
Resetting node rabbit@rabbit2 ...done.
rabbit2$ rabbitmqctl stop
Stopping and halting node rabbit@rabbit2 ...done.
rabbit3$ rabbitmqctl stop_app
Stopping node rabbit@rabbit3 ...done.
rabbit3$ rabbitmqctl reset
Resetting node rabbit@rabbit3 ...done.
rabbit3$ rabbitmqctl stop
Stopping and halting node rabbit@rabbit3 ...done.

      如今咱們設置配置文件中重要的域,具體以下:

[
  ...
  {rabbit, [
        ...
        {cluster_nodes, {['rabbit@rabbit1', 'rabbit@rabbit2', 'rabbit@rabbit3'], disc}},
        ...
  ]},
  ...
].

      例如:若是這是咱們須要設置的域,那麼咱們將簡單地建立RabbitMQ配置文件,並設置上面的所示的域便可。

      若是想讓rabbit@rabbit3成爲內存節點,咱們須要修改rabbit@rabbit3的配置文件以下:

[
  ...
  {rabbit, [
        ...
        {cluster_nodes, {['rabbit@rabbit1', 'rabbit@rabbit2', 'rabbit@rabbit3'], ram}},
        ...
  ]},
  ...
].

      這是標準的Erlang配置文件,更多詳細信息能夠參看RabbitMQ配置嚮導和Erlang配置幫助

      若是修改了配置文件,能夠簡單地啓動節點:

rabbit1$ rabbitmq-server -detached
rabbit2$ rabbitmq-server -detached
rabbit3$ rabbitmq-server -detached

      分別在這三個節點上運行rabbitmqctl cluster_status,能夠看到這三個節點都已加入集羣:

rabbit1$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit1 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]},{ram,[rabbit@rabbit3]}]},
{running_nodes,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]
...done.
rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]},{ram,[rabbit@rabbit3]}]},
{running_nodes,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]
...done.
rabbit3$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit3 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]},{ram,[rabbit@rabbit3]}]},
{running_nodes,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]
...done.

      須要注意的是:爲了從自動集羣配置中移除一個節點,首先須要從集羣中別的節點的配置文件中將其移除。

 

3、升級集羣

      當RabbitMQ升級major或者minor版本時(好比:從3.0.x到3.1.x或者從2.x.x到3.x.x),或者升級Erlang時,整個 集羣必須停掉。可是當升級RabbitMQ補丁(例如:從3.0.x到3.0.y)時就不須要這樣。這些版本都能被固化到集羣中(可是除了3.0.0及後 來的3.0.x系列)。

      當RabbitMQ升級major或者minor版本時,若是必要RabbitMQ將自動更新其持久化的數據結構。在集羣中,這項任務由第一個啓動的磁盤 節點來執行。所以,當升級RabbitMQ集羣時,不該該嘗試啓動任何內存節點,任何內存節點啓動時都會發出一個錯誤消息而後失敗。

      提早中止即將升級的磁盤節點,並在升級完後首先啓動它,這是個好主意,但這不是絕對必須的。不然,在升級節點中止和最後節點中止之間,集羣配置的改變將會丟失。

      只有RabbitMQ 2.1.1及其之後版本能夠自動升級,若是有更早版本的集羣,你須要重建集羣來完成升級。

 

4、單機器集羣

      在某些環境下,在單機器上運行集羣的全部節點是頗有用的。很是典型的應用是:在桌面或便攜式機器上經過啓動幾個虛擬機來實驗集羣。在單機器上運行多個節點 有兩個主要的要求:(1)每一個節點有惟一的名稱;(2)針對每種協議,每一個節點綁定到惟一的IP和端口號對。

      能夠經過手動重複調用rabbitmq-server來在同一主機上啓動多個節點。必須確保每次調用時設置的環境變量RABBITMQ_NODENAME和RABBITMQ_NODE_PORT都有合適的值。例如:

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

      上面將創建兩個節點的集羣。

 

5、防火牆節點

      防火牆集羣節點的經典案例是:節點在數據中心或者可信網絡中,可是被防火牆分離。一樣,不推薦在WAN或者不可信網絡上架設集羣。

      若是集羣中不一樣節點在同一數據中心,可是在防火牆後面,這樣就必須修改配置以確保是內部節點通訊。Erlang使用empd(Erlang Port Mapper Daemon)來解析集羣內節點名稱。

      缺省epmd端口號是4369,可是能夠經過環境變量ERL_EPMD_PORT改變其值。全部節點必須使用一樣的端口號。防火牆必須容許集羣內節點在這個端口上傳輸數據。更詳細的信息請參看Erlang epmd幫助

     一旦分佈式Erlang節點地址經過epmd已經被解析了,其它節點將經過Erlang分佈式節點協議嘗試使用該地址直接通訊。通訊端口號範圍能夠經過Erlang內核APP的兩個參數來配置:

      inet_dist_listen_min

      inet_dist_listen_max

      防火牆必須容許集羣內節點經過這個範圍內的端口號傳遞數據(假設全部節點使用一樣的端口號範圍)。缺省端口號範圍不受限制。更詳細的信息能夠參看Erlang內核APP幫助

 

6、客戶端鏈接集羣

    客戶端能夠鏈接集羣內任何節點。若是被鏈接節點崩潰可是集羣內其它節點還健在,則客戶端通知鏈接關閉,而後重連集羣內其它節點。一般,將節點主機 名或者IP地址寫死在客戶端APP中是不合適的,這會致使當集羣配置改變或者集羣節點數改變時,客戶端須要從新編輯、編譯、部署。相反,建議更抽象的方 式:能夠是動態DNS服務,其有簡短的TTL配置,或者TCP負載均衡,或者移動IP排序或者類似技術。通常,管理集羣內節點的鏈接已經非 RabbitMQ自己能力所及,建議使用其它技術來解決此類問題。

 

7、注意事項
一、host問題
        集羣節點之間可以互相訪問,所以,每一個集羣節點的host文件中都須要配置集羣內全部節點的信息,以保證能互相解析,具體以下:
        #vi /etc/hosts
        172.28.14.223 ZS-QA-01
        172.28.14.224 ZS-QA-02
        172.28.14.225 ZS-QA-03
        好比:3個節點的集羣,172.28.14.223/224/225三臺機器的hostname分別是ZS-QA-01/02/03。
        若是不知道本機hostname能夠經過如下命令查看:
        #cat /proc/sys/kernel/hostname

二、cookie問題
        RabbitMQ的集羣徹底依賴於Erlang集羣,而Erlang集羣經過cookie來進行通訊認證,所以,集羣內全部節點的cookie必須相同,通常採用第一個節點的cookie便可。
        默認狀況下,Erlang的cookie文件在$HOME目錄下,且是隱藏文件名爲.erlang.cookie,能夠拷貝第一個節點的cookie文件到集羣內其它節點。
        cookie文件僅僅能被own訪問,所以,須要將此文件權限改成-r--------,不然啓動RabbitMQ時,會出現以下錯誤:
        [dev@ZS-QA-02 sbin]$ (./rabbitmq-server &)
        [dev@ZS-QA-02 sbin]$ {error_logger,{{2013,5,3},{16,9,29}},"Cookie file /home/dev/.erlang.cookie must be accessible by owner only",[]}

        文件權限能夠經過以下命令來修改:
        #chmod -w .erlang.cookie
        #chmod g-r .erlang.cookie
        #chmod o-r .erlang.cookie
三、端口問題
        RabbitMQ默認監聽5672端口,若是須要更改端口號,只須要在etc/rabbitmq目錄下新建rabbitmq.config文件,並在該文件輸入以下內容便可:
        [
            {rabbit, [{tcp_listeners, [22221]}]}
        ].
        具體關於配置的詳細信息請參看這裏

相關文章
相關標籤/搜索