一个用于Web应用程序的EC2 Spot架构

jopen 9年前

这篇博文使用实际的例子描述一个参考架构,它旨在帮助使你在保持web应用高可用性的同时实现更多为您节省成本的无状态web层。我们建议在应用到生产环境之前先调整和测试你的应用程序。

Spot Instance使你根据自己的应用情况,通过对未使用的Amazon EC2 Instance进行简单的竞标来指定自己的Amazon EC2 Instance计算能力的价格。常常可以大幅度降低你的Amazon EC2 Instance成本。比如,利用同一负载平衡器后面的不同现货竞标价,可将基于按需实例运行的自动伸缩组同基于Spot Instance运行的自动伸缩组放在一起,以提供更大的灵活性并满足不断变化的流量需求。请参阅

Launch Spot instances in Your Auto Scaling Group 和   Load Balance Your Auto Scaling Group 中关于“现场实例”和“具有弹性负载均衡的自动伸缩组”的更多细节。

会话的状态可以保存在web层的DynamoDB数据表中。DynamoDB是一个区域性的服务,这意味着数据能够自动地被跨可用区复制来实现容错。你也可以使用其它数据库来保存架构中的状态。Spot Instances的可用性取决于可获得多少个未使用的Amazon EC2 Instance,因为实时需求和供应决定了Spot Instance的可供应量和业务需求实例的数量。你应该构建它能够弹性地终止实例(注:此处翻译不确定,原文为“you should architect it to be resilient to instance termination”),这包括当现价超过你当初指定的价格(即买入价),此时的实例将收到一个两分钟的警告:该实例将被终止。你可以通过创建IAM角色来管理实例,这些角色来自于它们用来从ELB注销的Spot Instance.一旦它们收到通知,它们就会被终止。关于“Creating an IAM Role Using the AWS CLI”的详情见 这里 ,关于“Spot Instance Termination Notices”的详情见 这里 。下面这张图描述了这将是什么样子:

一个用于Web应用程序的EC2 Spot架构

像下面的脚本可以被放在一个循环中,并且可以在启动时运行(例如,通过systemd或rc.local)来检测Spot Instance是否终止。然后将任何会话信息保存到DynamoDB中同时从ELB中注销自身,以便它不会接受更多的请求。我们建议(对这种方法)感兴趣使用这种方法的应用每隔5秒终止一次通知;

$ if curl -s http://169.254.169.254/latest/meta-data/spot/termination-time | \  grep -q .*T.*Z; then instance_id=$(curl -s http://169.254.169.254/latest/meta-data/instance-id); \  aws elb deregister-instances-from-load-balancer \    --load-balancer-name my-load-balancer \    --instances $instance_id; /env/bin/flushsessiontoDBonterminationscript.sh; fi
基于按需实例运行的自动伸缩组和利用同一负载平衡器后面的不同竞标价且基于Spot Instance的自动伸缩组协同工作将会确保在Spot市场价格和Spot Instance变化的情况下应用程序的可用性。如果在自动伸缩组的Spot Instance因为价格上涨接近中标价格而终止,那么运行在按需实例的自动伸缩组会根据自定义的扩展策略来扩展以满足(实例终止前的)服务需求。为了实现自动伸缩组根据应用的需求来决定扩展,你必须说明你想如何变化来应对不断变化的情况。你可以给运行Spot Instance的伸缩组分配更积极的缩放政策 (如CPU达到75%的使用率时扩大规模,CPU使用率降到25%时缩小规模),给运行按需实例的缩放组分配更加保守的扩展策略。有关使用Amazon CloudWatch的指标来自动伸缩的信息,请参阅 Dynamic Scaling

请注意,弹性负载平衡器使用最少未完成请求路由算法(针对HTTP/ HTTPS连接),这个算法有利于用最少未完成请求的后端实例。由于我们使用能够跨越多个可用区域的多个自动伸缩组,我们强烈建议您启用跨区域负载均衡负载平衡器。跨区域的负载均衡允许每个负载均衡节点在多个可用区发送请求,确保每个区域接受等量的请求流量。在被注销的Spot Instance将要被终止时,为了完成还在发送中的请求,负载均衡器中的连接管道允许90秒的延时(即注销后90秒连接管道关闭)

原文链接 :  https://aws.amazon.com/cn/blogs/compute/