Session ELB是基于tcp的吗?

Session ELB是基于tcp的吗?,session,amazon-web-services,tcp,sticky,amazon-elb,Session,Amazon Web Services,Tcp,Sticky,Amazon Elb,我面临一个有趣的问题。我们运行基于状态的基于HTTPS的应用程序。状态是基于会话cookie维护的。应用程序的设计方式是,如果会话突然终止,应用程序将恢复到主屏幕,任何未保存的数据都将丢失。所以对我们来说,保持训练是非常重要的 在过去的某个时候,决定为此目的使用AWS服务,而当前的体系结构有一个ELB,用于平衡自动缩放组的负载。使用的第一个体系结构启用了基于HTTP的粘性会话。在测试过程中发现,当缩小现有会话时,它们会立即关闭,并重新路由到可用实例。即使在启用排水(时间超过5分钟)后也会发生这种

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

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

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

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

关于问题1-这是ELB连接排水的预期行为


来自文档:“连接排空导致ELB负载平衡器停止向注销实例或不健康实例发送新请求,同时保持现有连接打开。这允许负载平衡器完成向注销实例或不健康实例发出的飞行中请求。”

ELB不知道您的会话状态,因为这是由您的应用程序管理的。连接排水仅适用于网络级别。如果没有与您的实例的开放连接,ELB可能会选择您的实例从自动缩放中注销(自动缩放稍后将终止它)

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

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

详情可在此查阅

“保持现有连接处于打开状态”意味着只要任何一方未关闭现有tcp连接,它们就保持活动状态。但当我们进行测试时,情况并非如此。我们在HTTP请求上保持活动状态,并且在对独立服务器进行测试时,客户端和服务器都保持tcp连接打开。但是,ELB只是关闭连接,尽管启用了排水功能并使用基于应用程序的会话粘性。默认情况下,ELB会将到客户端和后端的连接保持打开60秒。您可以随时更改该值,并指定1到3600秒之间的任何值。如果您在后端指定保持活动,并且希望负载平衡器负责关闭连接,则必须将ELB空闲超时配置为低于保持活动连接的值,该值独立于连接保持活动。Keep alive是一种网络优化,以避免为每个HTTP请求打开TCP连接的开销。连接排空是指在将从负载平衡器中删除实例时保留用户连接,以避免中断正在进行的客户HTTP连接。最后,HTTP会话仅在应用程序级别可见,而在ELB中不可见(在ELB上使用HTTP模式时,只有会话cookie可用)因此,您的意思是,当配置为使用HTTP时,ELB中的排水将仅在当前HTTP请求处于活动状态时保持会话打开,并且来自同一会话的下一个HTTP请求仍将转到不同的服务器。我知道我在推它,但这将是我的最后一个问题:)ELB连接不知道http会话。关闭http会话是一个应用程序级事件(通常在用户注销时)。HTTP会话和TCP连接不相关。用户可以在应用程序级别关闭其http会话,而浏览器可能会保持TCP连接打开,反之亦然。ELB连接将负责TCP连接,而不管后端上http会话的状态如何。