更新 2
是否可以配置 Auto Scaling 以删除此类实例?
是的,见下文 - 根据您的 cmets,您已经正确完成了这项工作。
我们不想为检查设置任何自定义 cronjobs。
鉴于您的配置显然是正确的(暗示 Auto Scaling 和/或 ELB 各自存在问题),恐怕无法通过主动关闭未使用的实例来避免自定义解决方案或促进as-set-instance-health,正如我在下面的初始回答中已经建议的那样 - tribalcrossing 对ELB-Unhealthy instances taken OOS then removed from ELB automatically 的回答也建议了前者,这似乎解决了您的情况:
我们运行一个每 5 分钟触发一次的 cronjob 来扫描所有
ELB 中的服务器以检查它是否已启动超过 5 个
分钟和是不健康的。当我们找到一个时,我们将其关闭。我们已经
hadd 的“死”实例卡在 ELB 中并抛出的问题
监控触发自动缩放操作的指标,以及 cronjob
为我们解决了问题。
更新 1
ELB 实例运行状况检查也被使用,但是这个 %0 实例是
健康。
您指的是哪个健康指标以及您如何依次得出实例健康的结论?
重要的是要意识到,Autoscaling 和 ELB 测量健康实例的方式不同,请参阅 alighafour 对 Autoscaling not reacting to unhealthy instances 的回复:
ELB 在应用层进行检查,而在应用层进行自动缩放检查
机器层。
AWS 团队对链接问题 ELB-Unhealthy instances taken OOS then removed from ELB automatically 的回复中进一步详细说明了这种差异(实际上解决了一个相反的问题):
自动缩放正在查看实例运行状况 - 他们将采用实例
如果数据显示实例不健康,则关闭。他们会采取
在那个时候把它从ELB中取出,然后关闭实例。
另一方面,ELB 正在通过以下方式进行应用程序运行状况检查
读取文件或连接到端口。如果申请
未能通过一定数量的这些检查,实例继续运行,
但 ELB 不会向其发送任何新流量。 ELB 继续
执行健康检查 - 如果应用程序实例变得健康
再次,它将开始将流量路由到它。 ELB 不会删除
ELB 注册中的实例 - 它只是停止发送它
交通,直到它再次健康。 [强调我的]
结论
看起来上述场景可能确实适用于您的体验:ELB 停止向您的实例发送流量,因为 ELB 健康检查失败,而 Auto Scaling 健康检查没有发现实例存在问题;例如,如果 ELB 运行状况检查探测 Apache 提供的网页,该网页由于任何原因(例如 Apache 崩溃或其他)未能响应,则可能会发生这种情况。
解决方案
您需要配置 Auto Scaling 策略,使其健康决策基于 EC2 健康状态和 ELB 健康状态,如 部分所述为 Elastic Load Balancing 创建运行状况检查 within Maintaining Current Scaling Level:
默认情况下,Auto Scaling 使用 Amazon EC2 的所有运行状况
Auto-Scaling 托管实例。同时使用弹性负载
Balancer的健康检查,设置组的HealthCheckType属性
到 ELB:
% as-update-autoscaling-group myGroup –-health-check-type ELB
有了这个配置,一旦 ELB 健康检查失败,实例就会被认为是不健康的,并且会被相应地替换。
初步回答
一个 Auto Scaling 组是否可以有多个触发器?
很遗憾,没有,参见例如AWS 团队回复How to set Multiple Triggers in Template:
很遗憾,Auto Scaling 服务每个 Auto 仅允许 1 个触发器
缩放组,因此我们不支持有多个触发器
此时模板中的同一组。
另一种方法是通过 as-set-instance-health 实施自定义解决方案,如Maintaining Current Scaling Level 中的自定义健康检查部分所述:
如果您有自己的健康检查系统,您可以将其与
自动缩放。使用 SetInstanceHealth 发送实例的运行状况
信息直接从您的系统传输到 Auto Scaling。