在我的aws账户中,我有一个针对我的SQS用户的ASG设置。最小容量为3,最大容量为8,销毁策略设置为默认。它有两个简单的伸缩策略,附加到监控SQS队列大小的云监控告警上。
这是云手表警报ApproximateNumberOfMessagesVisible >= 10 for 1 consecutive periods of 300 seconds for the metric dimensions的阈值。
当云监控告警状态在300秒后为“报警”时,ASG会添加1个实例,直到达到最大容量。同样,当云监控警报状态在300秒后为"ok“时,ASG将删除1个实例,直到达到最小容量。
ASG似乎可以毫无问题地扩展到最大容量。然而,我遇到的问题发生在ASG缩减规模的时候。当警报状态从“alarm”返回到"ok“时,ASG似乎只是随机选择一个实例关闭。如果要关闭的实例当前正在处理SQS消息,则这是一个问题。
例如,如果我的SQS队列有20条可见消息,那么我的ASG将扩展到8条。一旦可见消息小于或等于10,ASG将开始终止我的ASG中的实例。但是,它可能会选择一个正在处理SQS消息的实例。如果是这样,那么SQS消息就会进入我的DLQ。
以前有没有人遇到过这个问题?
有没有办法将ASG配置为监控SQS长度,并仅销毁已完成消息处理的实例?也许当SQS是"ok“并且实例的CPU较低时?或者,我是否应该在我的云手表闹钟中将阈值设置为2?
发布于 2020-12-05 03:05:26
你的应用需要明确地告诉asg一个实例当前不能被杀死。查看Instance scale-in protection的文档。
在开始处理消息之前,您需要执行以下操作:
aws autoscaling set-instance-protection --instance-ids i-5f2e8a0d --auto-scaling-group-name my-asg --protected-from-scale-in
然后处理来自自动缩放组my-asg中的受保护实例i-5f2e8a0d的消息。最后,当您使用以下命令完成处理后,关闭实例保护:
aws autoscaling set-instance-protection --instance-ids i-5f2e8a0d --auto-scaling-group-name my-asg --no-protected-from-scale-in
一旦机器受到保护,ASG将无法终止它。关闭保护后,实例可以终止,自动伸缩将继续按预期进行扩展。如果所有实例都是受保护的,自动伸缩不会终止任何实例(所以要小心,你总是关闭实例保护,否则你可能会被完全放大)。
https://stackoverflow.com/questions/65144916
复制相似问题