我面临一个有趣的问题。我们运行基于状态的基于HTTPS的应用程序。状态基于会话cookie维护。应用程序的设计方式是,如果会话突然终止,应用程序将恢复到主屏幕,任何未保存的数据都将丢失。因此,对我们来说保持会话非常重要。
过去有一点决定将AWS服务用于此目的,当前架构有一个ELB,可以将负载与自动扩展组进行平衡。使用的第一个体系结构启用了基于HTTP的粘性会话。在测试期间发现,缩小现有会话时会立即关闭并重新路由到可用实例。即使在启用排水(超过5分钟)之后也会发生这种情况,根据文件应该可以防止这种情况发生。有人可以告诉我,我们做错了什么,这是假设工作的方式吗?
我的第二个问题是,我们发现当使用ELB来平衡基于tcp连接的负载时,情况并非如此。在这种情况下,当我们缩小旧的tcp连接时,它会被维护,直到它关闭或超时,并且新连接被路由到其他实例。这是我们正在使用的当前设置。所以我的问题是为什么ELB在两种情况下的行为都不同,有没有办法让ELB使用HTTP粘性会话和基于tcp连接的耗尽?
如果您有答案,请与配置详细信息分享。感谢。
答案 0 :(得分:2)
关于问题#1 - 这是ELB连接排放的预期行为。
来自doc:“连接耗尽导致ELB负载均衡器停止向取消注册实例或不健康实例发送新请求,同时保持现有连接处于打开状态。这使负载均衡器可以完成对运行中的请求。取消注册或不健康的实例。“ http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#conn-drain
ELB不了解您的会话状态,因为这是您的应用程序管理的内容。连接耗尽仅适用于网络级别。如果没有与您的实例的开放连接,ELB可能会选择您的实例以从AutoScaling取消注册(并且自动扩展将在以后终止它)
问题2:在负载均衡器上使用TCP模式时,它会尝试了解HTTP内容(例如cookie)并愉快地将从客户端收到的任何内容发送到后端。您正在尝试的行为可能与客户端浏览器管理连接的方式有关(即保持打开连接)。这必须通过Web开发工具进行验证。
对于您的用例,我会调查自动缩放生命周期事件,以便在自动缩放对您的实例执行操作时触发您的一段代码。使用生命周期事件,您有机会在实例的关键生命周期状态下触发自定义代码,并采取其他操作或要求Auto Scaling ABANDON更改。
详情请见http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/AutoScalingGroupLifecycle.html http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/lifecycle-hook-considerations.html