【问题标题】:AWS classic LB changing IPs/dropping connections results in lost messages on RabbitMQAWS 经典 LB 更改 IP/断开连接会导致 RabbitMQ 上的消息丢失
【发布时间】:2018-06-16 10:27:15
【问题描述】:

我运行一个带有 3 个节点的兔子 HA 集群,并且在它们前面有一个经典的 AWS 负载均衡器 (LB)。有两个应用程序,一个发布,另一个通过 LB 消费。 当发布者应用程序开始发送 300 万条消息时,在很短的一段时间后,它的连接就会进入流控制状态。发布完成后,在发布者应用程序日志中,我可以看到所有 300 万条消息都已发送。另一方面,在消费者应用程序日志中,我只能看到 500K - 1M 条消息(运行之间有所不同),这意味着大量消息丢失了。

所以发生的情况是,在运行过程中,经典 LB 决定更改其 IP 地址或断开连接,从而丢失大量消息(有关详细信息,请参阅我的更新)。

如果我跳过 LB 并直接命中节点,在应用端进行负载平衡,则不会出现此问题。当然,在这种情况下,我失去了 ELB 的所有好处。

我的问题是:

  • 为什么 LB 会更改 IP 地址并丢弃连接,这与来自发布者或流控制状态的高消息率有关吗?
  • 如何配置LB,才不会出现这个问题?

更新:

这是我对正在发生的事情的理解: 我使用 AMQP 0-9-1 并在没有“publish confirms”的情况下发布,因此消息一经连接就被视为已发送。此外,rabbitmq 节点上的连接是 LB 和节点之间的连接,而不是 Publisher 应用程序和节点之间的连接。

  1. 在通信进入 Flow Control 之前,消息会立即从 LB 传递到节点

  2. 然后LB与节点的连接进入Flow Control,Publisher App连接不被阻塞,继续以相同的速率发布。这会导致消息堆积在 LB 上。

  3. 然后LB决定更改IP(s)或出于任何原因断开连接并创建一个新的,导致所有堆积的消息丢失。这从 RabbitMQ 日志中清晰可见:

    =警告报告==== 2018 年 1 月 6 日::10:35:50 === 关闭 AMQP 连接 (10.1.1.250:29564 -> 10.1.1.223:5672): 客户端意外关闭 TCP 连接

    =信息报告==== 2018 年 1 月 6 日::10:35:51 === 接受 AMQP 连接 (10.1.1.22:1886 -> 10.1.1.223:5672)

【问题讨论】:

    标签: amazon-web-services rabbitmq load-balancing amqp amazon-elb


    【解决方案1】:

    ELB 会在根据流量进行扩展时更改其地址。新节点出现并出现在 DNS 中,然后旧节点最终可能会消失,或者它们可能会保持在线。

    它通过利用更大的资源(具有更高性能特征的资源)或更多的单独资源来增加容量。 Elastic Load Balancing 服务将在扩展时更新负载均衡器的域名系统 (DNS) 记录,以便新资源在 DNS 中注册其各自的 IP 地址。创建的 DNS 记录包括 60 秒的生存时间 (TTL) 设置,预计客户端将至少每 60 秒重新查找一次 DNS。 (强调添加)

    ——来自“Best Practices in Evaluating Elastic Load Balancing”

    您可以在该“最佳实践”指南中找到更多有用的信息,包括在 AWS 支持的帮助下预热平衡器的概念,以及如何以平衡器的扩展可以保持的方式增加测试流量起来。

    经典 ELB 的行为是自动的,用户无法配置。

    但这听起来好像您的队列存在配置问题,因为它似乎应该对断开的连接更具弹性。

    还请注意,AWS Network Load Balancer 不会更改其 IP 地址,也不需要像 ELB 那样通过替换资源来扩展,因为与 ELB 不同,它似乎不会在隐藏实例上运行——它是网络基础设施,或者至少看起来是这样。这可能是一个可行的替代方案。

    【讨论】:

    • 使用网络负载均衡确实可以解决问题。我用解释更新了我的问题。谢谢
    【解决方案2】:

    解决方案是使用 AWS network LB。网络 LB 将在 Publisher App 和 rabbitmq 节点之间建立连接。因此,如果连接被阻止或断开,发布者将意识到这一点并采取相应的行动。我用 3M 消息运行了相同的测试,并且没有丢失单个消息。

    在 AWS 文档中,有这一行解释了这种行为:

    保留源 IP 地址 网络负载均衡器保留客户端源 IP,允许后端查看 IP 地址 客户端。然后,应用程序可以将其用于进一步 处理。

    发件人:https://aws.amazon.com/elasticloadbalancing/details/

    【讨论】:

    • 很好的后续行动。 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 2017-01-12
    • 2013-02-06
    相关资源
    最近更新 更多