以最少的停机时间将生产部署到 EC2

jen*_*ren 7 deployment amazon-ec2

我在带有 EC2 的大型实例上部署了一个简单的 Web 应用程序。我现在想将最新的代码部署到这个服务器,但我想以一种最大限度地减少停机时间并且对最终用户来说尽可能顺利的方式来做到这一点。这是我的计划:

  1. 启动另一个大型实例
  2. 在该实例上安装所有软件层
  3. 将 EBS 驱动器还原并附加到实例
  4. 在新实例上部署我们最新的生产就绪代码
  5. 运行所有测试(包括应用程序的手动测试)
  6. (如果测试通过)在实时站点上放置“站点维护中”通知。
  7. 备份直播站点的EBS实例
  8. 从新服务器上分离 EBS 实例并替换为最新的备份
  9. 使用 ec2-associate-address 将 IP 地址移动到新实例
  10. 坐下来等待流量开始通过新实例流动
  11. 终止旧实例

这看起来是个好策略吗?有没有可能涵盖这个主题的教程或书籍?我已经阅读了 George Reese 的《云应用架构》,这是一本很好的书,但不包括部署。此外,我知道有一些工具可以帮助解决这个问题,例如 RightScale 或 enStratus,当我开始使用多个实例时,我会使用它们。

Jes*_*r M 7

好的,这是前一段时间问过的,但无论如何我都会用我的 2 美分。我认为您错过了云计算的好处

首先,您应该在 2 个不同的虚拟机上分离您的应用程序代码和持久数据。这会让您在虚拟机间通信延迟方面付出一些代价,但应该会使您的管理更加简单。请记住,拥有 2 个小型 VM 而不是 1 个大型 VM 并不昂贵;因此,请选择最符合您需求的主机数量。

如果可能,您希望您的应用程序服务器是“无状态的”,因为它们不应该具有持久数据,并且您应该能够以最少的手动工作生成一个新实例。

其次,您应该考虑一些 Amazon 托管服务,如 SimpleDB 或 Relational Database Service(托管 MySQL)是否适合您的持久数据存储。

理想的流程如下所示:

  1. 首先更改“最后的”后端系统。例如,如果您的更改需要向数据库表添加一列,则在正在运行的 RDS 实例上使用普通 MySQL 工具添加它。(这假设您的架构允许您的数据存储更改同时保持向后兼容性,或者您首先更新您的应用服务器代码以使其向前兼容。)
  2. 使用您预先准备好的自定义即用型 AMI 来启动新的应用程序服务器实例
  3. 在新的应用程序服务器上安装更新的代码,即使用新列并具有新功能的新代码。
  4. 测试
  5. 引入部分或全部流量,即通过 IP 地址移动/将 Elastic Load Balancing 切换到新的应用程序服务器。(在理想的世界中,您只会移动一小部分,例如 5% 的流量,然后注意任何问题。AFAIK Elastic Load Balancing 尚不支持加权粘性路由,因此您可能不应该这样做。也可以通过在代码中包含 2 个执行路径来实现逐步切换,但这样做既耗时又烦人——加权粘性负载平衡更简单。)
  6. 将旧的应用服务器实例保留几天,以防新代码出现回归并且您需要回滚。


gar*_*les 5

这看起来是一个很好的整体方法。通过创建包含您需要的所有软件层的自定义 AMI,您可以省去第 2 步,从而缩短启动时间;话虽如此,我仍会在启动时更新所有软件包,以确保您获得所有最新的安全更新。

您可能还想考虑使用EBS 支持的实例- 这样您就可以将启动卷、软件堆栈和您的应用程序全部放在 EBS 上,这样可以省去上面的一些步骤。