Itt*_*tai 4 erlang distributed connectivity rabbitmq
我正在研究RabbitMQ分布式POC,我坚持集群节点的基础知识.
我正在尝试按照兔子的群集教程进行操作,这是我的参考.
在安装了erlang(R14B04)和rabbit(2.8.2-1)后,我将.erlang.cookie文件内容从一个节点复制到另外两个节点.
我不知道如何让erlang注意到这个改变我必须重新启动机器本身(相当蛮力,但我根本不知道erlang).
另外,我在iptables 4369和另外5个端口进行通信,并放置在
/usr/lib64/erlang/bin/sys.config以下配置下:
{kernel,[{inet_dist_listen_min, XX00},{inet_dist_listen_max,XX05}]}]
Run Code Online (Sandbox Code Playgroud)
然后另一次重启(我知道愚蠢)以验证erlang考虑到这些,但仍然在我运行时:
rabbitmqctl cluster rabbit@HostName1
Run Code Online (Sandbox Code Playgroud)
我明白了:
Clustering node rabbit@HostName2 with [rabbit@HostName1] ...
Error: {no_running_cluster_nodes,[rabbit@HostName1],
[rabbit@HostName1]}
Run Code Online (Sandbox Code Playgroud)
我有可能摆弄erlang.cookie或端口没有成功,但我不知道如何检查它们.我尝试输入erlcmd然后erl_epmd:names()或其他命令来获取更多信息,但我可能在erlang土地上离开了.
真的很感激任何帮助
更新:
我尝试手动ping两个erlang节点并pang返回.
我做了以下操作:
连接到两个节点,停止rabbitmq(不确定是否需要,但确定),启动erlang就像这样(erl -sname dilbert和erl -sname dilbert2)当erlang命令行启动时我node().在每个节点上运行dilbert@HostName1并dilbert2@HostName2分别获得.然后我尝试使用单引号运行net_adm:ping('dilbert').并且net_adm:ping('dilbert@HostName1').没有它们来自两个节点(当然更改了名称)并且完成了所有8个案例pang.
当我nodes().在其中一台机器上运行时,我得到了一个空数组.
我还尝试允许防火墙中的所有流量(脚本),然后尝试运行上面的命令(不要担心它们现在又回来了)并且仍然回来了pang.
Update2:
由于某些原因,我需要解决cookie不匹配问题(感谢@ kjw0188的建议[我erlang:get_cookie().在erlang命令行中运行]).
这没有帮助,我需要完全停止iptables(不知道为什么,但我很快就会-name dilbert@my-ip想到)并加载erlang节点,因为我的rackspace服务器没有dns-name.这最终使我得到了一个乒乓球并看到节点相互看到(nodes().在ping之后返回一个非空数组).
我现在面临的问题是如何在启动erlang时指示RabbitMQ使用-name而不是-sname.
所以我在连接两个RabbitMQ
节点时遇到了多个问题 - 我将添加我的节点托管在rackspace上,因此没有默认的可公开主机名,并且需要iptables,因为没有DMZ或内置安全组概念亚马逊.
问题:
1.Cookie-不确定如何或为什么,但我有多个实例.erlang.cookie(在/root我的主目录中/var/lib/rabbitmq/),我只保留了rabbitmq中的一个并验证所有节点都有相同的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
Run Code Online (Sandbox Code Playgroud)
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}
Run Code Online (Sandbox Code Playgroud)
而在实际ERL命令我改
-sname ${RABBITMQ_NODENAME} \到
-name ${RABBITMQ_NODENAME}@${RABBITMQ_NODE_IP_ADDRESS}\.
这使得rabbitmq只监听指定的ip地址(在最后的配置文件中指定)并使用该ip而不是usuall主机名加载.
编辑/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"
Run Code Online (Sandbox Code Playgroud)
一些资源帮助了我:
RabbitMQ群集指南
为高可用性群集RabbitMQ服务器
rabbitmq-env.conf(5)手册页
通过公共IP地址erlang邮件列表进行节点通信(中间帖子)
在云上配置RabbitMQ群集
希望这会有助于其他任何人.
编辑:
不知道我是怎么弄错的,但似乎我的erlang-rabbit端口说明没有被考虑或者还不够.结束了必须允许两个节点之间的所有通信......