我希望我的网站有一个负载均衡器,并使网站保持最新状态。当处理能力达到一定水平时,负载均衡器将采用我选择的 AMI 并启动更多此类实例。问题是 AMI 可能不是最新的,所以我会将一些实例保持最新状态,而将其他实例保持最新状态。部署时,我可以毫无问题地部署到负载均衡器下的所有实例,但我需要知道负载均衡器何时启动新实例才能触发此部署。此外,更新会有一个时间段,从而大大降低其响应能力。所以我想出了一个计划。
我的计划:
部署后:
identify one of the instances and
get instance id
identify volume of instance id
ec2-create-snapshot vol-yyyyyyyy
get snapshot volume id
ec2reg -s snap-zzzzzzzz -a x86 -d Description -n imagename
get image id
as-delete-launch-config existinglaunchconfig
as-create-launch-config mylaunchconfig --image-id IMAGEID --instance-type m1.small --key mykey --group mysecuritygroup
as-update-auto-scaling-group --launch-configuration mylaunchconfig
在我花上无数个小时试图弄清楚这个问题并编写脚本、测试和做其他事情之前,我的问题是:这有用吗?有没有更好的方法?有没有人知道的教程或帖子可以加快我在这个问题上的努力?谢谢。
答案1
另一种可与 AWS 配合使用的方法是将更新的站点/数据/配置存储在 S3 等位置。配置 AMI(或指定适当的用户数据脚本),以便在启动新实例时,它会自行更新。您可以通过在更新完成之前不对健康检查做出积极响应来阻止将其添加到负载均衡器。
否则,如果您需要让实例更快地启动,那么您的方法似乎是合理的。只需确保在开始更新实时实例之前暂停自动扩展,并在新的启动配置后恢复。您不希望它启动未更新的实例。
我也不确定您是否可以删除 ELB 正在使用的启动配置。该步骤可能必须等到它被替换之后才能进行。当您发现后,请在此处发布更新。
答案2
我遇到了和你一样的问题。我有一个自动扩展组,可以根据流量进行扩展和缩小,即使在高峰负载下,我也会一直推送更新。我的解决方案相当复杂,因为我需要一个暂存区,以便在代码更新到达实时服务器之前对其进行测试。最简单的方法是,以下是我构建/更新服务器的方法。
构建基础 AMI- 这是没有任何源代码的 AMI,此 AMI 可以与您需要或不需要的第三方应用程序捆绑在一起。例如,我的一台服务器需要 AppFabric、IIS、AWSSDK.NET 和 .NET 4.0。我安装了所有这些工具并保存了 AMI。我的 Linux 服务器我在运行时执行此操作,因为它的速度要快得多。
将源代码存储在 S3 或 SVN 中- 当您的服务器启动时,它会从 SVN 或 S3 获取最新代码。要更新现有服务器,只需一次或按组终止它们,Auto Scaling 组就会使用最新代码启动另一个服务器。
根据您的服务对故障的容忍程度,您还可以实现暂存服务器,就像我必须在开始发送请求之前测试新代码一样。我的设置需要两个自动缩放组。第一个组基本上是我的安全和身份验证层,它使用 php 代码。请求经过验证后,将被转发到另一个自动缩放组。
安全认证层的更新仍然需要我和 Eric Hammond 解释的步骤。但是,我尽量不经常更新此代码,它不包含任何业务逻辑,几乎从不更改。对此层的更改应始终向后兼容,这样如果您进行更新,就可以同时在线使用 2 个版本的服务器,而不会出现任何问题。
业务层更新是我将所有代码更改应用到升级功能、修复错误等的地方。诀窍是在使用自己的服务器和代码进行更新时创建另一个自动缩放组/负载均衡器(再次从 SVN 或 S3)。测试完成后,更新本地 DNS 服务器(假设您有一个),安全身份验证层会自动开始使用新服务器。
编辑:忘记添加此链接http://www.slideshare.net/AmazonWebServices/aws-architectingjvariafinal。包含一些关于解决此类问题的非常有用的信息,以及一些您可能知道或不知道的有关 aws 的其他信息。