据我了解,当 Amazon Auto Scaling 组缩减规模时,任何打开到已终止实例的连接都会丢失 - 没有正常终止。
我想知道其他人是如何处理这个问题的。
我的想法是连接的发起者应该处理失败,因为它应该能够处理实例失败而不是被故意终止的情况。
有什么想法吗?
谢谢,
皮特
据我了解,当 Amazon Auto Scaling 组缩减规模时,任何打开到已终止实例的连接都会丢失 - 没有正常终止。
我想知道其他人是如何处理这个问题的。
我的想法是连接的发起者应该处理失败,因为它应该能够处理实例失败而不是被故意终止的情况。
有什么想法吗?
谢谢,
皮特
如果您使用的是负载均衡器,您可以在“实例”选项卡上打开连接耗尽选项。它允许您设置在终止实例之前等待连接关闭的时间。最大值为 3600 秒。请参阅https://aws.amazon.com/blogs/aws/elb-connection-draining-remove-instances-from-service-with-care/
您通常在自动扩展的实例前使用弹性负载均衡器 (ELB)。负载均衡器将停止向即将终止的实例发送请求。例如,如果您使用以下格式:
as-put-scaling-policy MyScaleDownPolicy --auto-scaling-group MyAutoScalingGroup --adjustment=-1 --type ChangeInCapacity --cooldown 300
您将有足够的时间让您的实例在终止之前完成对它的请求的处理。
在此处查看更多详细信息:http: //docs.amazonwebservices.com/AutoScaling/latest/DeveloperGuide/US_SetUpASLBApp.html
请注意,您应该对这些实例有一个 ELB 组。来自AWS Auto-scaling 文档:
在 Auto Scaling 确定要终止哪个特定实例后,它会检查该实例是否属于 Elastic Load Balancing 组。如果是这样,Auto Scaling 会指示负载均衡器从负载均衡组中删除实例并等待删除完成。如果 Auto Scaling 确定实例不属于 Elastic Load Balancing 组,则 Auto Scaling 会尝试通过运行系统关闭脚本来终止实例。
我这样做的方式是使用生命周期挂钩。这可以在一定时间内中断终止过程(默认为 1 小时)。
它旨在在您的工作完成后恢复,但超时适用于 hacky 连接耗尽。
您可以选择将处于此状态的 Auto Scaling 组实例添加到 Terminating:Wait 状态。此状态允许您在这些实例终止之前访问它们。
来源:http ://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/AutoScalingGroupLifecycle.html
缺点:通过 CLI 设置,但还不错。
如何做到这一点: http ://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/adding-lifecycle-hooks.html
创建 IAM 时,您将需要此策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"autoscaling:PutLifecycleHook",
"autoscaling:DeleteLifecycleHook",
"autoscaling:RecordLifecycleActionHeartbeat",
"autoscaling:CompleteLifecycleAction",
"autoscaling:DescribeAutoscalingGroups",
"autoscaling:DescribeLifecycleHooks",
"autoscaling:PutInstanceInStandby",
"autoscaling:PutInstanceInService",
"iam:AddRoleToInstanceProfile",
"iam:CreateInstanceProfile",
"iam:CreateRole",
"iam:PassRole",
"iam:ListInstanceProfiles",
"ec2:Describe*"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
祝你好运!
EC2/AutoscalingGroups 的搜索空间没有解决方案。我不认为等待从 ELB 中删除完成意味着等待现有连接关闭。ELB 确实强制执行自己的不可配置超时,但即使假设当 ELB 报告任何打开的连接时该组将等待该超时也是乐观的。
一个可能的答案是扩展到其他 AWS 产品,例如 SQS 和 SNS。这两个可以代表大部分终止策略,因为它们也可以由 CloudWatch 警报触发。缺少的部分是工人选择、冷却时间和重置警报。