假设我的 ELB 实例后面有几台 Web 服务器。我想关闭其中一半服务器以进行软件更新。假设我的应用程序有一些可能较长的请求(比如由于数据库速度慢,可能需要长达 30 秒)。我不想直接关闭服务器,让用户看到错误。我可以从 ELB 注销该实例以阻止任何进一步的请求到达该实例,但在关闭之前留出一些时间让该实例完成其当前请求吗?ELB 是否仍会转发最近注销的实例的响应?
答案1
https://forums.aws.amazon.com/message.jspa?messageID=231571
我们刚刚对 ELB 进行了测试,既进行了健康检查,又手动从 ELB 中删除了一个实例,所有现有连接几乎立即(大约一秒钟内)被粗鲁地丢弃。
亚马逊的回应:
我们意识到这种行为会给客户带来痛苦,这样的反馈有助于我们更好地了解该问题的真正影响和重要性。请继续提供反馈。
不要指望能快速解决问题,两年后情况仍然如此。
答案2
因为我最近自己使用了此功能,并且对所问/描述的问题有解决方案(现有评论/答案中未涉及):
它称为连接耗尽,可以在 ELB 配置中设置。您可以定义一个超时时间(默认为 300 秒),在此期间 ELB 会保持连接打开直至完成,然后再丢弃它们。
以下博客文章解释了如何在 ELB 中设置连接耗尽:https://aws.amazon.com/de/blogs/aws/elb-connection-draining-remove-instances-from-service-with-care/
以及 AWS 文档:http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/config-conn-drain.html
嗯,我不能发布超过 2 个链接,因为我缺乏声誉......如果你访问 github.com 并在 awslabs 帐户中搜索 aws-codedeploy-samples,你会发现从 ELB 取消注册实例的 shell 脚本。