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

Cluster computing 网络故障后RabbitMQ群集未重新连接,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'

我有一个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从节点的情况下-实际的消息同步不会发生-从节点只是在消息从队列中消耗并添加更多消息时“赶上”)

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

    rabbitmqctl cluster_status
    
    在构成集群一部分的每个节点上。如果集群已断开,则只能看到一个节点。比如:

    Cluster status of node rabbit@rabbitmq1 ...
    [{nodes,[{disc,[rabbit@rabbitmq1]}]},{running_nodes,[rabbit@rabbitmq1]}]
    ...done.
    
    在这种情况下,您需要在构成原始集群一部分的其中一个节点上运行以下命令集(以便它将集群中的另一个主节点(比如rabbitmq1)作为从节点连接):

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


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

    从此类故障中恢复的另一种方法是使用Mnesia,它是RabbitMQ用作持久性机制的数据库,RabbitMQ实例(以及主/从状态)的同步由该机制控制。有关所有详细信息,请参阅以下URL:

    在此处添加相关部分:

    有几种情况下,Mnesia可能会检测到网络 由于通信故障已被分区

    一种是当Mnesia已经启动并运行,Erlang节点获得收益时 再次联系。然后,Mnesia将尝试与另一方的Mnesia联系 节点,查看它是否也认为网络已分区 有一段时间。如果两个节点上的Mnesia都记录了Mnesia_down条目 Mnesia从彼此生成一个系统事件,称为 {不一致的\数据库,运行\分区\网络,节点}这是 发送给Mnesia的事件处理程序和其他可能的订阅者。这个 默认事件处理程序向错误记录器报告错误

    另一种情况下,Mnesia可能会检测到网络已关闭 由于通信故障而分区,在启动时。如果记忆障碍 检测到本地节点和另一个节点都接收到mnesia\U down 它从彼此生成一个{不一致的}数据库, 启动_partitioned _network,Node}系统事件并按所述操作 上面

    如果应用程序检测到存在通信故障 这可能导致数据库不一致,它可能使用 函数mnesia:设置_master_节点(选项卡,节点)以精确定位 可以加载每个表的节点

    启动时,Mnesia的正常表格加载算法将被绕过,并 该表将从为定义的主节点之一加载 表,而不考虑日志中的潜在mnesia_down条目。这个 节点只能包含表具有复制副本且 为空时,特定表的主节点恢复机制 将被重置,并在下次运行时使用正常加载机制 重新启动

    函数mnesia:set_master_nodes(节点)为所有节点设置主节点 桌子。对于每个表,它将确定其副本节点并调用 mnesia:使用那些 包含在节点列表中(即TabNodes是 节点和表的副本节点)。如果十字路口是 清空特定表的主节点恢复机制将 将被重置,并在下次重新启动时使用正常加载机制

    功能mnesia:系统信息(主节点表)和 mnesia:表信息(选项卡,主节点)可用于获取信息 关于潜在的主节点

    确定通信失败后要保存的数据在外部 记忆的范围。一种方法是确定哪个“岛” 包含大多数节点。使用{多数,true}选项 关键表可以是一种确保不属于 “多数岛”的成员无法更新这些表。注意 这减少了少数节点上的服务。这 这将是一种有利于更高一致性保证的权衡

    功能mnesia:force_load_table(选项卡)可用于强制加载 无论启用了哪种表格加载机制,表格都会自动加载

    这是一种从此类故障中恢复的更为漫长和复杂的方法。。但将提供更好的粒度和对最终主节点中应可用数据的控制(这可以减少“合并”RabbitMQ主节点时可能发生的数据丢失量)。

    来自RabbitMQ文档:

    RabbitMQ还提供了三种自动处理网络分区的方法:
    pause minority
    mode,
    pa
    
    rabbitmqctl stop_app
    
    rabbitmqctl reset
    
    rabbitmqctl join_cluster rabbit@rabbitmq1
    
    rabbitmqctl start_app