在Amazon EC2中使用自动扩展的应用程序中,管理代码变更的最佳方法是什么?

18

我在AWS上有多个实例运行在负载均衡和自动扩展之后。

现在,如果我想要将一些代码变更推送到这些实例中,以及由于自动扩展策略可能启动的任何新实例,最好的方法是什么?

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

非常感谢任何指向此方向的提示。


那段代码运行在哪个平台上,J2EE、PHP等?如果是J2EE,例如,使用哪个引擎,Jetty、Tomcat等? - Frodo Baggins
我正在使用带有LAMP安装的Ubuntu AMI来运行一个PHP应用程序。 - Aditya
3个回答

5
我进行代码更改的方式是有一个主服务器,我在上面编辑代码。所有扩展的从服务器都通过cron作业通过ssh进行rsync同步,以使所有文件保持最新状态。所有服务器每30分钟同步一次+-一些随机秒数,以避免在完全相同的时间访问。 (请注意,我将主服务器从负载均衡器中去除,因此用户始终会收到相同的代码。同样,当我决定发布我的代码更改时,我会从测试服务器到主服务器进行rsync同步。)
使用这种方法,您只需将同步命令放在启动中,就无需担心从服务器映像上的代码状态,因为它将在启动后保持最新状态。
编辑: 我们现在已停止使用此方法,并开始使用专门用于此目的的新服务AWS CodeDeploy:

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

希望这有所帮助。

你如何将从实例与主实例同步? - t q
1
我使用相当简单的rsync,只要在从服务器和主服务器之间设置了基于密钥对的ssh身份验证。一个示例命令:rsync -arvzi --perms --exclude ".*" -e ssh MyUser@Master.MyDomain.com:/var/www/ /var/www/这个命令在从服务器上运行,会从主服务器拉取并更改文件。然后我会设置一个类似这样的命令,每30分钟作为定时任务运行。希望这能为您澄清问题。 - David
所以,我假设数据库架构永远不会更改?因为那样的话,你会在尚未更新的从服务器上抛出错误。对吧? - Christian
我们实际上使用 DynamoDB 进行数据库管理(NoSQL)。我们的数据结构实际上是以 JSON 格式存储,仅存储与行默认值不同的信息。这样做的好处是,如果引入新值,则默认值已经隐含在以前的行中,也意味着模式本身是从软件端建立的,并且同时更新。 - David

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 repo。
  4. 应用puppet脚本(它是repo的一部分)来配置自身。 Puppet安装其余所需的软件模块。

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

现在,为了升级软件,我们使用本地的boto脚本。 该脚本逐个关闭运行旧代码的服务器。自动扩展机制会启动新的(并且已升级)服务器。
请确保使用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/

关于codento博客:似乎不仅仅是创建AMI快照来启动的原因不足:“问题在于每当您想要升级到新的基本AMI时,您需要重复此过程”。从自动扩展的角度来看,这非常慢。我看到你正在杀死实例(感谢as vs. ec2提示),但是如何通过git克隆简单地更新ebs支持的ec2实例的var / www / directory repo并让服务器继续运行呢?新的自动缩放实例也会从那里拉取。这种简单方法有问题吗? - Ricalsin
显然,修补现有的服务器更快。我不确定如何将ELB与Web服务器重启同步,以管理无终端用户停机时间。此外,在使用峰值警报后大约5分钟内,我没有问题,直到我想要加入群组的服务器数量达到预期。在我的用例中,它足够快。而且在大多数情况下,我会提前发出警报。 - Tal Weiss

-2

看起来您可以手动将自动缩放组大小加倍,它将使用当前启动配置中的 AMI 创建 EC2 实例。现在,如果您将自动缩放组减小到先前的大小,旧实例将被终止,只有从新的 AMI 创建的实例将幸存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接