RabbitMQ 不会集群(nxdomain)

RabbitMQ wont cluster (nxdomain)

我想设置 2 个 rabbitmq 服务器在集群中工作。 当试图 运行

rabbitmqctl join_cluster rabbit@my_rabbit_1.my.domain.namemy_rabbit_1

我得到unable to connect to epmd (port 4369) on my_rabbit_2.my.domain.name: nxdomain (non-existing domain)

我用rabbitmq:latest(debian),.erlang.cookie是一样的,hosts解析的很好:我可以ping两个方向,nmap -6 -p 4369 my_rabbit_2.my.domain.namreturns4369/tcp open epmd

编辑:

tcpdump 表明在解析主机名时,rabbitepmd 不执行 2 种类型的 DNS 查询:IPv6 的 AAAA 和 IPv4 地址的 A,但只有 IPv4 反复失败nxdomain 因为没有可用的 IPv4 地址。但是,它不会尝试 AAAA DNS 查询,除非尝试 运行 命令,如 rabbitmq -n rabbit@local.machine.domain.name:然后它 运行s AAAA 查询并成功输出。因此问题。我该如何解决?

unable to connect to epmd (port 4369) on my_rabbit_2.my.domain.name: nxdomain (non-existing domain)

这是一个错误,当 rabbitmq 服务器 运行 在一个主机名上而不是你认为的 运行 上,或者当 hostname 没有解析到什么你认为是的。

有趣的是,昨晚我遇到了这个完全相同的问题,当时我们集群中的一个实例失败,返回一个新的主机名,并以某种方式破坏了它的内部身份验证存储等。

如果您的设置没有确切的 dns 条目等,我只能提供一般的故障排除步骤。

请参阅 this Whosebug 问题以获得可能对您有帮助的解决方案 - 特别是 Kishor Pawar 的回答。

您确定将 rabbitmq 配置为侦听 IPV6 吗?有什么原因不能在 127.0.0.1 上将它绑定到 IPV4 以进行管理操作?

终于找到适合我的解决方案。 Erlang documentation 表示,默认情况下,-proto_dist 指定 Erlang 分发的协议,默认为 inet_tcp(IPv4 上的 TCP)。因此,在仅 IPv6 环境中,您必须为 erl.

设置 -proto_dist inet6_tcp 标志

这可以通过将以下行添加到您的 rabbitmq-env.conf(参见 RabbitMQ configuration docs)来完成:

# For rabbitmq-server
RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="-proto_dist inet6_tcp"
# For rabbitmqctl
RABBITMQ_CTL_ERL_ARGS="-proto_dist inet6_tcp"

请注意 rabbitmqctlrabbitmq-server 使用不同的 erl 设置:如果没有使用 rabbitmqctl join_cluster rabbit@host.in.my.domainRABBITMQ_CTL_ERL_ARGS="-proto_dist inet6_tcp" 设置,我无法创建集群。在生产模式下应该没有必要。另请注意,RabbitMQ configuration docs 建议不要使用此设置,调试除外。