2012-06-14 55 views
4

我正在研究RabbitMQ分佈式POC,我被困在聚類節點的基礎知識中。
我正在嘗試關注聚類上的兔子tutorial,所以這是我的參考。
安裝erlang(R14B04)和rabbit(2.8.2-1)後,我已將.erlang.cookie文件內容從一個節點複製到另外兩個節點。
我不確定如何讓erlang注意到這個改變,我不得不重啓機器本身(非常暴力,但我根本不知道erlang)。
在addtion我在iptables的4369和通信5個額外的端口打開, /usr/lib64/erlang/bin/sys.config下放置以下配置:分佈式RabbitMQ節點彼此不能識別

{kernel,[{inet_dist_listen_min, XX00},{inet_dist_listen_max,XX05}]}] 

然後又重新啓動(啞,我知道),以驗證二郎需要到這些因素,但仍當我運行:

rabbitmqctl cluster [email protected] 

我得到:

Clustering node [email protected] with [[email protected]] ... 
Error: {no_running_cluster_nodes,[[email protected]], 
           [[email protected]]} 

有機會的話我和擺弄erlang.cookie或端口沒有成功,但我不知道如何檢查它們。我嘗試在cmd中輸入erl,然後在erl_epmd:names()或其他命令中獲得更多信息,但我很可能在erlang的土地上下車。

將真正感謝所有幫助

更新:
我手動檢測兩臺Erlang節點試圖查驗並獲得pang回來。
我做了以下內容:
連接到兩個節點,停止RabbitMQ的(如果需要的話,但可以肯定的是不知道),開始二郎神像這樣(erl -sname dilberterl -sname dilbert2)當二郎命令行開始我每跑node().他們分別得到[email protected][email protected]。然後我嘗試運行net_adm:ping('dilbert').net_adm:ping('[email protected]').單引號,沒有它們從兩個節點(當然更改名稱),並得到所有8個案例pang
當我在其中一臺機器上運行nodes().時,我收回了一個空數組。
我也試過讓所有的流量在防火牆(script),然後嘗試運行上述命令(別擔心他們現在回來),並仍然收回pang
UPDATE2:
出於某種原因,我有餅乾不匹配,我需要解決(您的建議感謝@ kjw0188 [我在二郎命令行運行erlang:get_cookie().])。
這沒有幫助,我需要完全停止iptables(不知道爲什麼,但我馬上就會知道)並加載erlang節點-name [email protected],因爲我的rackspace服務器沒有dns-name。這最終使我得到了一個乒乓球,看到對方看到對方(nodes(). ping後返回一個非空數組)。
我現在面臨的問題是如何指導RabbitMQ在啓動erlang時使用-name而不是-sname。

+0

您是否看到過是否可以在每臺計算機上啓動erl節點,並查看它們是否可以互相ping通? – kjw0188

+0

@ kjw0188還沒試過(erlang noob)。你知道我如何檢查當前節點沒有運行嗎?我認爲RabbitMQ在加載時啓動一個節點,所以我會停止它,但我想在驗證您的建議之前驗證沒有節點正在運行。謝謝 – Ittai

+0

你應該不需要拿下兔子,但如果你想,你可以嘗試停止服務'sudo /etc/init.d/rabbitmq-server stop' – kjw0188

回答

7

所以我不得不多的問題與連接我的兩個RabbitMQ的節點 -
我要補充的是我的節點上Rackspace公司託管,所以不有一個默認的可暴露的主機名,並且需要iptables,因爲沒有DMZ或內置像亞馬遜這樣的安全組概念。

問題:
1. Cookie-不知道如何或爲何但是我有.erlang.cookie多個實例(在/root,在我的主目錄,並在/var/lib/rabbitmq/)我一直只是一個在RabbitMQ的和驗證的所有節點都同一個cookie。
2. IPTables-爲了節點通信,我需要打開epmd端口和實際通信的端口範圍inet_dist_listen_mininet_dist_listen_max

/sbin/iptables -A INPUT -i eth1 -p tcp --dport ${epmd} -s ${otherNode} -j ACCEPT 
/sbin/iptables -A INPUT -i eth1 -p tcp --dport ${inet_dist_listen_min}:${inet_dist_listen_max} -s ${otherNode} -j ACCEPT 

empd是usuall 4369端口和其他範圍使用任何你想要的範圍。
${otherNode}是我的另一個節點的IP地址。
我還需要通過rabbitmq配置erlang來使用這些端口(請參閱配置文件的末尾)
3. HostName-由於我沒有主機名,我需要編輯使用-name的兔子腳本而不是-sname(第一個告訴erlang採用全名,後者代表簡稱,因此附加@符號和主機名)。
這是通過編輯來完成:
/usr/lib/rabbitmq/bin/rabbitmqctl
添加在開始RABBITMQ_NODE_IP_ADDRESS財產

DEFAULT_NODE_IP_ADDRESS=auto 
DEFAULT_NODE_PORT=5672 
[ "x" = "x$RABBITMQ_NODE_IP_ADDRESS" ] && RABBITMQ_NODE_IP_ADDRESS=${NODE_IP_ADDRESS} 
[ "x" = "x$RABBITMQ_NODE_PORT" ] && RABBITMQ_NODE_PORT=${NODE_PORT} 

[ "x" = "x$RABBITMQ_NODE_IP_ADDRESS" ] && [ "x" != "x$RABBITMQ_NODE_PORT" ] && RABBITMQ_NODE_IP_ADDRESS=${DEFAULT_NODE_IP_ADDRESS} 
[ "x" != "x$RABBITMQ_NODE_IP_ADDRESS" ] && [ "x" = "x$RABBITMQ_NODE_PORT" ] && RABBITMQ_NODE_PORT=${DEFAULT_NODE_PORT} 

的定義和實際ERL命令我改變
-sname ${RABBITMQ_NODENAME} \
-name ${RABBITMQ_NODENAME}@${RABBITMQ_NODE_IP_ADDRESS}\
這使rabbitmq只偵聽指定的ip地址(在配置文件末尾指定)並使用該ip而不是usuall主機名加載。

編輯/usr/lib/rabbitmq/bin/rabbitmq-server
-sname ${RABBITMQ_NODENAME} \更改的實際ERL命令-name ${RABBITMQ_NODENAME}@${RABBITMQ_NODE_IP_ADDRESS} \

添加兔配置(/etc/rabbitmq/rabbitmq-env.conf)文件與 -

#the ip address which rabbit should use, this is to limit rabbit to only use internal rackspace communication and not publicly accessible ports 
NODE_IP_ADDRESS=myIpAdress 
#had to change the nodename becaue otherwise rabbitmq used [email protected] and not only rabbit 
NODENAME=myCompany 
#This instructed rabbit to instruct erlang which ports it should use for its communications with other nodes 
export SERVER_ERL_ARGS="$SERVER_ERL_ARGS -kernel inet_dist_listen_min somePort -kernel inet_dist_listen_max someOtherBiggerPort" 

一些資源,幫助我前進的道路:
RabbitMQ Clustering Guide
Clustering RabbitMQ servers for High Availability
rabbitmq-env.conf(5) manual page
Node communication by public IP address erlang mailing list(中間後)
Configuring RabbitMQ Cluster on Cloud

希望這將幫助其他人。

編輯:
不知道我怎麼錯了,但似乎我的二郎兔端口的說明,並沒有考慮到或者是不夠的。結束必須允許兩個節點之間的所有通信...

1

改變的RabbitMQ SNAME /名稱的行爲,你可以編輯腳本:

  • 的RabbitMQ的多
  • 的RabbitMQ服務器
  • rabbitmqctl

在腳本rabbitmqctl有是以下一段代碼:

exec erl \ 
    -pa "${RABBITMQ_HOME}/ebin" \ 
    -noinput \ 
    -hidden \ 
    ${RABBITMQ_CTL_ERL_ARGS} \ 
    -sname rabbitmqctl$$ \ 
    -s rabbit_control \ 
    -nodename $RABBITMQ_NODENAME \ 
    -extra "[email protected]" 

你必須改變它:

exec erl \ 
    -pa "${RABBITMQ_HOME}/ebin" \ 
    -noinput \ 
    -hidden \ 
    ${RABBITMQ_CTL_ERL_ARGS} \ 
    -name rabbitmqctl$$ \ 
    -s rabbit_control \ 
    -nodename $RABBITMQ_NODENAME \ 
    -extra "[email protected]" 
+0

謝謝!我剛剛在幾個小時前就明白了這一點,並且正在編寫我的問題的完整記錄以作爲答案發布(因爲我有幾個與分發的rabbitmq相關的問題)。 – Ittai

3

有一點需要注意的是erlang cookie文件中的任何類型的空白,特別是cookie的內容之後的換行符。只要兩者是相同的,事情就沒有問題,但是當一個人有一個換行符,另一個沒有時,事情就不會起作用。

-2

http://pearlin.info/?p=1672

,所以你需要將餅乾從節點複製你試圖連接

例如: - 兔@節點1 兔@節點2

去兔@ node1和複製來自cat /var/lib/rabbitmq/.erlang.cookie的cookie

轉到rabbit @ node2刪除當前的cookie並粘貼新的cookie。

同一節點上

/usr/sbin目錄/ rabbitmqctl stop_app

/usr/sbin目錄/ rabbitmqctl復位

/usr/sbin目錄/ rabbitmqctl簇兔@節點1

應該這樣做。

相同記錄在這裏。

http://pearlin.info/?p=1672

+0

您發佈的鏈接「http://pearlin.info/?p = 1672」不是英文,也不是編程。 –

1

背景:我面臨同樣的問題而設立的RabbitMQ集羣。我在我的主機上使用了2個docker容器,相當於2個獨立的節點,我無法創建這兩個容器的集羣。

解決方案: 1。確保您的所有羣集節點上都有相同的erlang Cookie,默認位置爲/var/lib/rabbitmq/.erlang.cookie。該文件用於驗證,因此請確保所有節點上的文件都相同。更改.erlang.cookie後重新啓動您的rabbitmq服務。

  • 確保節點從一個其他,使用平或telnet檢查連接訪問。

  • 檢查/ etc/hosts是否有正確的條目,例如如果rabbit2想要加入cluster2,rabbit2的/ etc/hosts應該包含。

    172.68.1.6  rabbit1 
    172.68.1.7  rabbit2 
    
  • 現在停止使用$rabbitmqctl stop_app其次$rabbitmqctl join_cluster [email protected]服務,通過rabbitmqctl start_app啓動服務,並檢查$rabbitmqctl cluster_status看天氣已加入羣集與否。我跟着rabbitmq official documentation來設置羣集。