2011-04-21 47 views
18

我在AWS中使用Auto Scaling在Load balancer后面运行多个实例。使用Auto Scaling管理Amazon EC2中应用程序代码更改的最佳方法

现在,如果我必须将一些代码更改推送到这些实例以及由于自动扩展策略而可能启动的任何新实例,那么执行此操作的最佳方法是什么?

我知道的唯一方法是,创建一个包含最新代码的新AMI,修改自动扩展策略以使用此新AMI,然后终止现有实例。但这可能涉及更长的停机时间,我不确定整个过程是否可以自动化。

任何在这个方向的指针将不胜感激。

+0

该代码运行在什么平台上,J2EE,PHP等?如果J2EE,例如,哪个引擎,Jetty,Tomcat等? – David 2011-04-21 11:30:20

+0

我正在为PHP应用程序使用带有LAMP安装的ubuntu AMI。 – Aditya 2011-04-29 07:39:05

回答

4

我做我的代码更改的方式是有一个主服务器,我在代码上编辑。所有从服务器通过cron作业通过ssh进行rsync同步,使所有文件保持最新状态。所有的服务器每隔30分钟同步一次 - 几秒钟的随机秒数以防止在同一秒内访问它。 (请注意,我将Master设置为关闭负载平衡器,因此用户始终将相同的代码发送给他们。同样,当我决定发布代码更改时,我会从我的测试服务器向我的主服务器执行rsync。

使用这种方法,您只需将sync命令置于启动状态,不必担心从图像上的代码状态是什么,因为它在引导后会保持最新状态。

编辑: 我们现在使用这种方法停止,并使用新的服务AWS CodeDeploy这是这个确切的目的而作出开始:

http://aws.amazon.com/codedeploy/

希望这会有所帮助。

+0

你如何将从机实例同步到主机? – 2012-06-16 20:31:34

+1

我使用rsync witch非常简单,只要你在从服务器和主服务器之间用ssh设置了密钥对认证。示例命令:rsync -arvzi --perms --exclude“。*”-e ssh [email protected]:/ var/www// var/www/ 该命令在从服务器上运行,并从主服务器进行更改。然后我会有一个像这样的命令,每30分钟运行一次。作为一个慢性工作。希望能为你澄清它。 – David 2012-06-17 02:10:49

+0

那么,我假设从来没有任何数据库模式更改?因为那样你会在还没有更新的奴隶上抛出错误。是吗? – Christian 2014-02-12 09:07:05

1

我们配置我们的启动配置使用“干净”关闭的,现成的AMI - 我们使用这些:http://aws.amazon.com/amazon-linux-ami/

其中一个的AMI的特点是CloudInit - https://help.ubuntu.com/community/CloudInit

此功能使我们向新产生的普通香草EC2实例提供一些数据。具体来说,我们给这个实例一个脚本来运行。
脚本(简而言之)执行以下操作:

  1. 升级本身(以确保所有的安全补丁和漏洞修复应用)。
  2. 安装Git和Puppet。
  3. 从Github克隆Git回购。
  4. 应用puppet脚本(它是repo的一部分)来配置自身。 Puppet安装所需的其他软件模块。

它的确需要比从预先配置的AMI启动更长的时间,但是我们会在每次更新软件时(每周几次)跳过实际制作这些AMI的过程,并且服务器总是“干净“ - 没有手动补丁,所有软件模块都是最新的等等。

现在,为了升级软件,我们使用本地boto脚本。 该脚本逐个杀死运行旧代码的服务器。 Auto Scaling机制启动新的(和升级的)服务器。

请确保使用as-terminate-instance-in-auto-scaling-group,因为使用ec2-terminate-instance将导致ELB继续向关闭实例发送流量,直到它无法执行运行状况检查。

有趣的相关博客文章:http://blog.codento.com/2012/02/hello-ec2-part-1-bootstrapping-instances-with-cloud-init-git-and-puppet/

+0

重新编写codento博客:看起来不是简单地创建AMI快照启动的原因是不充分的:“问题在于,无论何时您想升级到新的基础AMI,都需要重复该过程。伸缩的角度来看,这是非常缓慢的。我看到你正在关闭实例(感谢as vs. ec2提示),但是如何简单地更新ebs支持ec2实例的var/www /目录repo与git克隆并让服务器继续运行?新的自动缩放实例也会从那里拉动。这种简单的方法有问题吗? – Ricalsin 2013-08-06 18:20:48

+0

显然修补现有服务器速度更快。我不确定如何将ELB与Web服务器重新同步以管理没有最终用户停机时间。另外,从使用高峰警报大约5分钟后,我就没有问题,直到我拥有尽可能多的服务器。在我的用例中它足够快。而且在大多数情况下,我会提前发出警报。 – 2013-08-06 20:47:24

-2

看样子你可以手动双自动缩放组的大小,它会创建一个使用AMI从当前启动配置EC2实例。现在,如果将自动缩放组缩小回到之前的大小,旧的实例将被终止,并且只有从新的AMI创建的实例才能存活。

相关问题