如何从ELB组中正常关闭或删除AWS实例

Joh*_*sen 23 amazon-ec2 amazon-web-services amazon-elb

我在Amazon运行的服务器实例云使用其负载均衡器来分配流量.现在我正在寻找一种优雅的方法来优雅地缩小网络,而不会在浏览器端造成连接错误.

据我所知,当从负载均衡器中删除时,实例的任何连接都将被粗暴地终止.

我希望有一种方法可以在关闭之前一分钟通知我的实例,或者让负载均衡器停止向死亡实例发送流量,但不会终止与它的现有连接.

我的应用程序是基于在Ubuntu上运行的node.js.我也有一些特殊的软件在运行,所以我不想使用许多PAAS提供node.js托管.

谢谢你的任何提示.

Ray*_*hey 16

这个想法使用ELB的功能来检测不健康的节点并将其从池中移除但是它依赖于ELB在下面假设中的预期行为.这是我一直想要为自己测试的东西,但还没有时间.当我这样做时,我会更新答案.

流程概述

可以在节点需要关闭时包装并运行以下逻辑.

  1. 阻止与nodeX的新HTTP连接,但继续允许现有连接
  2. 等待现有连接耗尽,方法是监视应用程序的现有连接或允许"安全"的时间.
  3. 使用直接使用EC2 API或Abstracted脚本在nodeX EC2实例上启动关闭.

根据您的申请"安全",这可能无法确定某些应用程序.

需要测试的假设

我们知道ELB 从它的池中删除了不健康的实例我希望它是优雅的,所以:

  1. 与最近关闭的端口的新连接将正常地重定向到池中的下一个节点
  2. 当节点标记为Bad时,已建立的与该节点的连接不受影响.

可能的测试用例:

  • ELB上的消息HTTP连接(例如,来自curl脚本)在脚本打开关闭其中一个节点HTTP端口期间记录结果.您需要进行实验以找到允许ELB始终确定状态更改的可接受时间量.
  • 在阻止新HTTP连接的同时保持长HTTP会话(例如文件下载),长会话应该有希望继续.

1.如何阻止HTTP连接

在nodeX上使用本地防火墙阻止新会话,但继续允许已建立的会话.

例如IP表:

iptables -A INPUT -j DROP -p tcp --syn --destination-port <web service port>
Run Code Online (Sandbox Code Playgroud)


Jaa*_*ans 16

我知道这是一个老问题,但应该注意亚马逊最近添加了支持connection draining,这意味着当从负载均衡器中删除实例时,实例将完成从负载均衡器中删除实例之前正在进行的请求.没有新请求将路由到已删除的实例.您还可以为这些请求提供超时,这意味着任何运行时间超过超时窗口的请求都将终止.

要启用此行为,请转到Instancesloadbalancer 的选项卡并更改Connection Draining行为.


Far*_*raz 7

从ELB分发流量的推荐方法是在多个可用区域中拥有相同数量的实例.例如:

ELB

  • 实例1(us-east-a)
  • 实例2(us-east-a)
  • 实例3(us-east-b)
  • 实例4(us-east-b)

现在有两个感兴趣的ELB API允许您以编程方式(或通过控制面板)分离实例:

  1. 取消注册实例
  2. 禁用可用区域(随后禁用该区域内的实例)

ELB开发指南具有一个描述禁用的可用性区域的影响的部分.该部分的说明特别令人感兴趣:

负载均衡器始终将流量分配到所有已启用的可用区.如果在为负载均衡器禁用可用区之前,可用区中的所有实例都已取消注册或运行状况不佳,则发送到该可用区的所有请求都将失败,直到DisableAvailabilityZonesForLoadBalancer调用该可用区.

有趣的是,上述说明可能意味着如果您调用DisableAvailabilityZonesForLoadBalancer,ELB可以立即开始仅向可用区域发送请求 - 当您对禁用可用区域中的服务器执行维护时,可能会导致0停机时间.

上述"理论"需要亚马逊云工程师的详细测试或确认.