【问题标题】:Is ELB draining tcp based?ELB 是否基于 tcp 耗尽?
【发布时间】:2015-02-10 23:31:25
【问题描述】:

我正面临一个有趣的问题。我们运行基于状态的基于 HTTPS 的应用程序。状态基于会话 cookie 进行维护。该应用程序的设计方式是,如果会话突然终止,应用程序将恢复到主屏幕,任何未保存的数据都会丢失。所以保持会话对我们来说非常重要。

在过去的某个时间点,它决定使用 AWS 服务来实现此目的,而当前架构具有一个 ELB,可将负载平衡到自动扩展组。使用的第一个架构启用了基于 HTTP 的粘性会话。在测试过程中发现,当缩小现有会话时,会立即关闭并重新路由到可用实例。即使在启用排水(超过 5 分钟)之后也会发生这种情况,根据文档应该可以防止这种情况发生。有人可以告诉我我们做错了什么吗?这是应该的工作方式吗?

我的第二个问题是,我们发现当使用 ELB 用于基于 tcp 连接的负载平衡时,情况并非如此。在这种情况下,当我们缩减旧的 tcp 连接时,会一直保持到它关闭或超时,并且新连接会被路由到其他实例。这是我们正在使用的当前设置。所以我的问题是为什么 ELB 在这两种情况下的行为不同,有没有办法让 ELB 使用 HTTP 粘性会话并基于 tcp 连接进行消耗?

如果您确实有答案,请与配置详细信息分享。谢谢。

【问题讨论】:

    标签: session amazon-web-services tcp sticky amazon-elb


    【解决方案1】:

    关于问题 #1 - 这是 ELB Connection Draining 的预期行为。

    来自文档:“连接耗尽导致 ELB 负载均衡器停止向取消注册的实例或不健康的实例发送新请求,同时保持现有连接打开。这允许负载均衡器完成对注销或不健康的实例。” http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#conn-drain

    ELB 不知道您的会话状态,因为这是由您的应用程序管理的。连接耗尽仅适用于网络级别。如果您的实例没有打开的连接,ELB 可能会选择您的实例从 AutoScaling 中注销(并且 Auto Scaling 稍后会终止它)

    问题 #2:在负载均衡器上使用 TCP 模式时,它不会尝试理解 HTTP 内容(例如 cookie),并且会愉快地将从客户端接收到的任何内容发送到后端。您正在试验的行为可能与客户端浏览器管理连接的方式有关(即保持打开连接)。这必须使用 Web 开发工具进行验证。

    对于您的用例,我会调查自动缩放生命周期事件,以在自动缩放将对您的实例采取行动时触发您的一段代码。使用生命周期事件,您有机会在实例的关键生命周期状态下触发自定义代码,并采取其他操作或要求 Auto Scaling 放弃更改。

    详情请点击此处http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/AutoScalingGroupLifecycle.html http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/lifecycle-hook-considerations.html

    【讨论】:

    • “保持现有连接打开”意味着现有的 tcp 连接只要没有被任何一方关闭就可以保持活动状态。但是当我们进行测试时,情况并非如此。当我们针对独立服务器进行测试时,我们在 HTTP 请求上保持活动状态,并且客户端和服务器都保持 tcp 连接保持打开状态。但是 ELB 只是关闭了连接,尽管启用了排水并使用了基于应用程序的会话粘性。
    • 默认情况下,ELB 保持与您的客户端和后端的连接打开 60 秒。您可以随时更改该值并指定 1 到 3600 秒之间的任何值。如果您在后端指定保持活动状态,并且希望负载均衡器负责关闭连接,则必须将 ELB 空闲超时配置为低于保持活动状态的值
    • 连接耗尽独立于连接保持活动。 Keep alive 是一种网络优化,可以避免为每个 HTTP 请求打开 TCP 连接的开销。连接耗尽是关于在将从负载均衡器中删除实例时保留用户连接,以避免中断正在进行的客户 HTTP 连接。最后,HTTP 会话仅在应用程序级别可见,在 ELB 中不可见(只有会话 cookie 在您的 ELB 上以 HTTP 模式工作时)
    • 所以你的意思是说,当配置为使用 HTTP 时,ELB 中的耗尽将保持会话打开,只要当前 HTTP 请求处于活动状态,并且同一会话的下一个 http 请求仍将转到不同的服务器。我知道我正在推动它,但这将是我的最后一个问题:)
    • ELB 连接耗尽不知道 http 会话。关闭 http 会话是应用程序级别的事件(通常在您的用户注销时)。 HTTP 会话和 TCP 连接不相关。用户可以在应用程序级别关闭其 http 会话,而浏览器可能会保持 TCP 连接打开,反之亦然。无论后端 HTTP 会话的状态如何,ELB 连接耗尽都会处理 TCP 连接。
    猜你喜欢
    • 2015-04-28
    • 2016-03-07
    • 2013-09-11
    • 2017-02-27
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 2010-09-22
    • 2017-03-23
    相关资源
    最近更新 更多