cluster-computing - 网络故障后 RabbitMQ 集群未重新连接

标签 cluster-computing rabbitmq

我有一个 RabbitMQ 集群,其中有两个生产节点,集群因以下错误消息而中断:

=ERROR REPORT==== 23-Dec-2011::04:21:34 ===
** Node rabbit@rabbitmq02 not responding **
** Removing (timedout) connection **

=INFO REPORT==== 23-Dec-2011::04:21:35 ===
node rabbit@rabbitmq02 lost 'rabbit'

=ERROR REPORT==== 23-Dec-2011::04:21:49 ===
Mnesia(rabbit@rabbitmq01): ** ERROR ** mnesia_event got {inconsistent_database, running_partitioned_network, rabbit@rabbitmq02}
我试图通过使用“tcpkill”终止两个节点之间的连接来模拟问题。集群已断开连接,令人惊讶的是,两个节点并没有尝试重新连接!
当集群中断时,HAProxy 负载均衡器仍将两个节点标记为事件节点并向它们发送请求,尽管它们不在集群中。
我的问题:
  • 如果节点被配置为集群工作,当我遇到网络故障时,为什么他们不尝试重新连接?
  • 如何识别损坏的集群并关闭其中一个节点?分别使用两个节点时,我遇到了一致性问题。
  • 最佳答案

    RabbitMQ 集群在不可靠的网络上不能很好地工作(RabbitMQ 文档的一部分)。因此,当网络故障发生时(在两节点集群中),每个节点都认为它是集群中的主节点和唯一节点。两个主节点不会自动重新连接,因为它们的状态不会自动同步(即使在 RabbitMQ 从属的情况下 - 实际的消息同步不会发生 - 从队列只是“ catch ”消息从队列中消耗和更多消息被添加)。

    要检测您是否有损坏的集群,请运行以下命令:

    rabbitmqctl cluster_status
    

    在构成集群一部分的每个节点上。如果集群坏了,那么你只会看到一个节点。就像是:
    Cluster status of node rabbit@rabbitmq1 ...
    [{nodes,[{disc,[rabbit@rabbitmq1]}]},{running_nodes,[rabbit@rabbitmq1]}]
    ...done.
    

    在这种情况下,您需要在构成原始集群一部分的节点之一上运行以下命令集(以便它作为从属节点加入集群中的另一个主节点(例如 rabbitmq1)):
    rabbitmqctl stop_app
    
    rabbitmqctl reset
    
    rabbitmqctl join_cluster rabbit@rabbitmq1
    
    rabbitmqctl start_app
    

    最后再次检查集群状态..这次你应该看到两个节点。

    注意:如果您在 HA 配置中使用虚拟 IP 的 RabbitMQ 节点(并且客户端使用此虚拟 IP 连接到 RabbitMQ),那么应该成为主节点的节点应该是具有虚拟 IP 的节点。

    关于cluster-computing - 网络故障后 RabbitMQ 集群未重新连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8654053/

    相关文章:

    windows - 无法使用 pkcs12 文件连接到 RabbitMq Broker

    rabbitmq - 服务器在 pika.exceptions.StreamLostError : Stream connection lost 后关闭

    swift - 我怎样才能用swift语言在rabbitmq中获取未确认的消息?

    web-applications - Go Webapp集群领导者选举

    docker - Kubernetes-上传crisocket : timed out waiting for the condition时出错

    python - 如何在 Google 应用引擎上部署 Celery Worker

    elasticsearch - Redis 与 RabbitMQ 作为介于 Logstash 和 elasticsearch 之间的数据代理/消息系统

    java - Log4J SocketAppender 吞下来自远程客户端的调试信息

    java - 如何在集群中为一个节点和所有节点运行计划方法?

    java - 集群中 2 个节点之间的通信