4

私は RabbitMQ 分散 POC に取り組んでおり、ノードのクラスタリングの基本に行き詰まっています。クラスタリングに関するうさぎのチュートリアル
に従おうとしているので、これが参考になります。 erlang (R14B04) と rabbit (2.8.2-1) をインストールした後、ファイルの内容を 1 つのノードから他の 2 つのノードにコピーしました。 どうすれば erlang にこの変更を認識させることができるか確信が持てず、マシン自体を再起動する必要がありました (かなり強引ですが、erlang はまったく知りません)。 さらに、通信用に iptables 4369 と 5 つの追加ポートを開き、次の構成の 下に配置しました。
.erlang.cookie

/usr/lib64/erlang/bin/sys.config

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

次に、erlang がこれらを考慮に入れていることを確認するための別の再起動 (私が知っているばかげた) を実行します。

rabbitmqctl cluster rabbit@HostName1

私は得る:

Clustering node rabbit@HostName2 with [rabbit@HostName1] ...
Error: {no_running_cluster_nodes,[rabbit@HostName1],
                                 [rabbit@HostName1]}

erlang.cookie やポートのいじりがうまくいかなかった可能性がありますが、それらを確認する方法がわかりません。erlcmd を入力してから、またはその他のコマンドを入力して詳細情報を取得しようとしましたerl_epmd:names()が、おそらく erlang の土地から離れています。

本当に助けていただければ幸いです

更新:
2 つの erlang ノードを手動で ping してみましたが、pang戻ってきました。
私は次のことを行いました:
2つのノードに接続し、rabbitmqを停止し(必要かどうかはわかりませんでしたが、念のために)、erlangコマンドラインが開始されたときに(erl -sname dilbertおよび)のようにerlangを開始しました。それぞれで実行し、それぞれ取得しました。次に、両方のノードから一重引用符を付けて実行しようとし(もちろん名前を変更しました)、8つのケースすべてに乗りました。マシンの 1 つで 実行すると、空の配列が返されました。 また、ファイアウォール内のすべてのトラフィックを許可しようとしました (スクリプトerl -sname dilbert2node().dilbert@HostName1dilbert2@HostName2net_adm:ping('dilbert').net_adm:ping('dilbert@HostName1').pang
nodes().
)、上記のコマンドを実行してみてください(現在は元に戻っているので心配しないでください)、それでも戻ってきましたpang.
Update2:
何らかの理由で、解決する必要がある Cookie の不一致がありました (@kjw0188 の提案に感謝します [ erlang:get_cookie().erlang コマンド ラインで実行しました])。
これは役に立たず、iptables を完全に停止する必要があり (理由はわかりませんが、すぐにわかります) -name dilbert@my-ip、ラックスペース サーバーに dns-name がないため、erlang ノードをロードする必要がありました。これにより、最終的にポンを取得し、ノードがお互いを認識できるようになりました(nodes().pingの後に空でない配列を返します)。
私が今直面している問題は、erlang を開始するときに -sname の代わりに -name を使用するように RabbitMQ に指示する方法です。

4

5 に答える 5

8

そのため、2つのRabbitMQノードの接続で複数の問題が発生し
ました-ノードはラックスペースでホストされているため、デフォルトの公開可能なホスト名がなく、DMZがないか、次のようなセキュリティグループの概念が組み込まれているため、iptablesが必要です。アマゾン。

問題:
1。Cookie-方法や理由はわかりませんが、.erlang.cookie/rootホームディレクトリとに/var/lib/rabbitmq/)複数のインスタンスがありました。rabbitmqに1つだけ保持し、すべてのノードが同じCookieを持っていることを確認しました。
2. IPTables-ノードが通信するepmdために、実際の通信のためにポートとポートの範囲を開く必要がありましたinet_dist_listen_min inet_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は通常の4369ポートであり、他の範囲には任意の範囲を使用します。
${otherNode}他のノードのIPです。
また、これらのポートを使用するように、rabbitmqを介してerlangを構成する必要がありました(最後の構成ファイルを参照)
。全体の名前。後者は短い名前を表すため、@記号とホスト名が追加されます)。 これは編集によって達成されました:プロパティ の定義を最初に追加しました-name-sname

/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でロードします。

編集/usr/lib/rabbitmq/bin/rabbitmq-server
実際のerlコマンド-sname ${RABBITMQ_NODENAME} \-name ${RABBITMQ_NODENAME}@${RABBITMQ_NODE_IP_ADDRESS}\に変更しました

ウサギのconf(/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 rabbit@Hostname 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クラスタリングガイド
高可用性のためのRabbitMQサーバーのクラスタリング
rabbitmq-env.conf(5)マニュアルページ
パブリックIPアドレスによるノード通信erlangメーリングリスト(中央の投稿)
クラウドでのRabbitMQクラスターの構成

これが他の誰かに役立つことを願っています。

編集:
私がどのように間違っていたかはわかりませんが、私のerlang-rabbitポートの指示が考慮されていないか、十分ではなかったようです。2つのノード間のすべての通信を許可する必要がありました...

于 2012-06-18T13:24:24.583 に答える
3

本当に気をつけなければならないことの 1 つは、erlang cookie ファイル内のあらゆる種類の空白、特に cookie のコンテンツの後の改行です。両方が同じであれば問題ありませんが、一方に改行があり、もう一方に改行がない場合、うまくいきません。

于 2012-09-20T03:09:23.560 に答える
1

RabbitMQ の名前/名前の動作を変更するには、スクリプトを編集できます。

  • rabbitmq-マルチ
  • rabbitmq サーバー
  • ウサギmqctl

スクリプト rabbitmqctl には、次のコードがあります。

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

次の場所で変更する必要があります。

exec erl \
    -pa "${RABBITMQ_HOME}/ebin" \
    -noinput \
    -hidden \
    ${RABBITMQ_CTL_ERL_ARGS} \
    -name rabbitmqctl$$ \
    -s rabbit_control \
    -nodename $RABBITMQ_NODENAME \
    -extra "$@"
于 2012-06-18T08:43:07.960 に答える