Amazon EC2 Elastic Load Balancing – 零宕机服务器重启策略

我有5个Web服务器(Apache / mod_perl)在Amazon EC2 Elastic Load Balancing后面,当我将代码部署到Web服务器时,我正在这样做。

  1. 对于每台机器,closuresApache
  2. 更新代码
  3. 重新启动服务器并继续下一个服务器

我想当我的服务器closures时,ELB不会将请求分发到我的服务器,但请求仍然在服务如何?

我认为更好的方法是

  1. 停止接受ELB的新要求
  2. 有时候睡觉,只有在所有请求都被回复的情况下closuresWeb服务器
  3. 更新代码
  4. 再次启动服务器

但是,如何从本地服务器执行(1)和(2)? 我需要使用AWS API吗? 或者其他简单的方法来做到这一点?

谢谢。

我运行apache / mod_perl作为负载均衡的EC2实例,并按照您的说法定期进行代码升级。 我的过程是:

  1. 旋转一两个实例
  2. closures该实例的Apache
  3. 升级实例
  4. 回到旋转,并删除其他人

AWS文档将介绍如何使用您的select使用API​​或控制台来添加和删除实例 。 你会注意到,用我的方法,web服务器优雅地轮stream出来,所以我不担心是否有特定的用户请求被杀死。 正如@ cyberx86提到的,你可以使用命令apachectl -k graceful在每个请求被处理后closures你的apache服务器。

我有另一种方法来实现这一点,如果你有几个东西要升级在每台服务器上。 这将是非常浪费更新5服务器的相同的操作。

创build负载平衡和缩放组。确保已启用连接排空

有我的升级步骤。

  1. 从您的负载平衡器中删除1个实例。 更新你需要的一切。 并从您的生产实例创build一个AMI。 这将导致您的实例重新启动。
  2. 使用新的AMIconfigurationScaling组。
  3. 从负载平衡器中移除实例并停止实例。 新实例将自动启动
  4. 继续closures其他实例,并重新创build所有实例。 升级完成。

一些指南:
负载平衡您的Auto Scaling组
连接排水

如果您的部署可以修改为支持新创build的实例通过新代码联机,那么实际上您可以从ELB中删除实例,等待60秒(之后Amazon的ELB将closures连接到后端和客户端),然后终止实例并依靠亚马逊的Auto Scaling Group为您提供新的实例。 我创build了一个开源工具,可以自动执行此过程 – 在awsmissingtools.com上可用 – 查找名为“AWS-HA-Release”的工具。