4

我正在研究 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}]}]

然后再次重新启动(我知道愚蠢)以验证 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 领域还很遥远。

真的很感激任何帮助

更新:
我尝试手动 ping 两个 erlang 节点并pang返回。
我做了以下事情:
连接到两个节点,停止rabbitmq(不确定是否需要,但可以肯定),当erlang命令行启动时像这样(erl -sname dilbert和)启动erlang,我在每个节点上运行并分别得到和。然后,我尝试使用单引号运行并在两个节点中不使用它们(当然更改了名称)并得到了所有 8 个案例。 当我在其中一台机器上运行时,我得到了一个空数组。 我还尝试允许防火墙中的所有流量(脚本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(不知道为什么,但我很快就会弄清楚)并加载 erlang 节点,-name dilbert@my-ip因为我的机架空间服务器没有 dns 名称。这最终使我能够得到一个 pong 并看到节点互相看到(nodes().在 ping 之后返回一个非空数组)。
我现在面临的问题是如何指示 RabbitMQ 在启动 erlang 时使用 -name 而不是 -sname。

4

5 回答 5

8

所以我在连接我的两个 RabbitMQ 节点时遇到了多个问题 -
我将补充一点,我的节点托管在机架空间上,因此没有默认的可公开主机名,并且需要 iptables,因为没有 DMZ 或内置安全组概念,例如亚马逊。

问题:
1. Cookie - 不知道如何或为什么,但我有多个实例.erlang.cookie/root在我的主目录和 in 中/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  

empd是通常的 4369 端口,对于其他范围,请使用您想要的任何范围。
${otherNode}是我另一个节点的ip。
我还需要通过 rabbitmq 配置 erlang 以使用这些端口(请参阅最后的配置文件)
3. HostName- 看到我没有主机名,我需要编辑要使用的 rabbit 脚本-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 而不是通常的主机名加载。

已编辑/usr/lib/rabbitmq/bin/rabbitmq-server
将实际的 erl 命令从更改-sname ${RABBITMQ_NODENAME} \-name ${RABBITMQ_NODENAME}@${RABBITMQ_NODE_IP_ADDRESS}\

添加了一个 rabbit 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 Clustering Guide
Clustering RabbitMQ servers for High Availability
rabbitmq-env.conf(5) 手册页
Node communication by public IP address erlang mailing list (The middle post)
在云上配置 RabbitMQ 集群

希望这对其他人有帮助。

编辑:
不知道我是怎么弄错的,但似乎我的 erlang-rabbit 端口指令没有被考虑或不够。最终不得不允许两个节点之间的所有通信......

于 2012-06-18T13:24:24.583 回答
3

真正要注意的一件事是 erlang cookie 文件中的任何类型的空格,尤其是 cookie 内容之后的换行符。只要两者相同,就可以了,但是当一个有换行符而另一个没有换行时,事情就行不通了。

于 2012-09-20T03:09:23.560 回答
2

背景:我在设置 Rabbitmq 集群时遇到了同样的问题。我正在使用在我的主机上运行的 2 个 docker 容器,这相当于 2 个单独的节点,我无法创建这两个节点的集群。

解决方案: 1. 确保所有集群节点上都有相同的 erlang cookie,默认位置是/var/lib/rabbitmq/.erlang.cookie. 此文件用于身份验证,因此请确保您在所有节点上都拥有相同的文件。更改 .erlang.cookie 后重新启动您的 rabbitmq 服务。

  1. 确保节点可以相互访问,使用 ping 或 telnet 检查连接。

  2. 检查 /etc/hosts 是否有正确的条目,例如如果 rabbit2 想要加入集群 rabbit1,则 rabbit2 的 /etc/hosts 应该包含。

    172.68.1.6      rabbit1
    172.68.1.7      rabbit2
    

现在停止服务,$rabbitmqctl stop_app然后使用$rabbitmqctl join_cluster rabbit@rabbit1,启动你的服务rabbitmqctl start_app并检查$rabbitmqctl cluster_status你是否加入了集群的天气。

我按照rabbitmq 官方文档来设置集群。

于 2016-07-29T21:05:11.900 回答
1

要更改 RabbitMQ sname/name 行为,您可以编辑脚本:

  • 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 回答
-2

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

所以你需要从你试图连接的节点复制cookie

示例:-rabbit@node1 rabbit@node2

转到 rabbit@node1 并从 cat /var/lib/rabbitmq/.erlang.cookie 复制 cookie

去 rabbit@node2 删除当前的 cookie 并粘贴新的。

在同一个节点上

/usr/sbin/rabbitmqctl stop_app

/usr/sbin/rabbitmqctl 重置

/usr/sbin/rabbitmqctl 集群 rabbit@node1

应该这样做。

同样记录在这里。

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

于 2013-05-03T20:48:19.887 回答