1. 程式人生 > >RabbitMQ3.6.5叢集搭建和遇到的問題

RabbitMQ3.6.5叢集搭建和遇到的問題

RabbitMQ3.6.5叢集搭建

搭建環境:

非單機叢集,使用VMware Workstation建立三臺獨立的虛擬機器(橋接模式)。ip地址分別為:192.168.0.113 、192.168.0.116、 192.168.0.119

搭建步驟

  • 修改hosts
    在三臺機器上配置響應的hosts如下:
    • 192.168.0.113 rabbit1
    • 192.168.0.116 rabbit2
    • 192.168.0.119 rabbit3
  • 複製.erlang.cookie
    首先啟動三臺機器的rabbitmq,此時會在HOME目錄(預設情況下)生成cookie檔案,用於erlang在分散式節點之間進行通訊,此cookie檔案的內容必須相同,否則無法通訊。
    1.
啟動指令: RABBITMQ_NODENAME=[email protected] ./rabbitmq-server -detached RABBITMQ_NODENAME=[email protected] ./rabbitmq-server -detached RABBITMQ_NODENAME=[email protected] ./rabbitmq-server -detached 2. 複製cookie 改變了節點cookie之後不能對節點通訊,此時用kill指令關掉rabbitmq程序重啟即可,當然也可以優雅的先關閉,在修改cookie: .
/rabbitmqctl -n [email protected] stop關閉,然後修改cookie 注意:如果修改了節點名,接後續操作必須-n指明,否則erlang無法找到節點

遇到的問題:

開始的時候啟動rabbitmq服務,沒有使用RABBITMQ_NODENAME指定節點在erlang中的sname。導致第二個節點加入的時候,總是提示錯誤:

   connected to epmd (port 4369) on mqmaster
   epmd reports node 'rabbit' running on port 25672
   TCP connection succeeded but Erlang distribution failed
   suggestion: hostname mismatch?
   suggestion: is the cookie set correctly?
   suggestion: is the Erlang distribution using TLS?

這個問題特別愁人,我谷歌了一天,中文和英文網站都看了也沒找出問題。。。

下面是我排錯的過程:

首先手動建立erlang節點,確保兩臺機器能ping通過.

    $ erl -sname test -setcookie 123

看下節點名稱: node().
顯示:

    $ erl -sname test1 -setcookie 123

net_adm:ping能ping通,說明節點可以通訊,而且rabbitmq節點之間的cookie是相同的,排除此問題。仔細看下錯誤提示:

epmd reports node 'rabbit' running on port 25672

說明第二個節點找到了第一個節點的伺服器且知道第一個節點在執行.
再看建議:
suggestion: hostname mismatch?
因為看到過RABBITMQ_NODENAME這個配置(不設定的時候,節點為[email protected] ,這裡ubuntu是你的機器名),對比在第二個節點上執行的命令:

    join_cluster [email protected]     

猜測hosts裡雖然配置了rabbit1的ip地址,但僅僅這樣還是不夠的,這裡有個hostname的概念,應該不是簡單的配置host就可以的,文件上也有說明:

Unix*: [email protected]$HOSTNAME
Windows: [email protected]%COMPUTERNAME%```

所以嘗試指定sname,設定hostname,叢集加入成功。