Amazon EC2 Elastic Load Balancing - 零停机服务器重启策略

Amazon EC2 Elastic Load Balancing - 零停机服务器重启策略

我在 Amazon EC2 Elastic Load Balancing 后面有 5 个 Web 服务器(Apache/mod_perl),当我将代码部署到 Web 服务器时,我正在执行此操作..

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

我认为当我的服务器关闭时,ELB 将不会将请求分发到我的服务器,但是请求仍在服务怎么办?

我认为更好的方法是

  1. 停止接受来自 ELB 的新请求
  2. 有时会休眠,只有当所有请求都得到响应时才关闭 Web 服务器
  3. 更新代码
  4. 重新启动服务器

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

谢谢。

答案1

我将 apache/mod_perl 作为负载平衡的 EC2 实例运行,并定期进行代码升级,正如您所说。我的流程是:

  1. 取一两个实例不循环
  2. 关闭该实例上的 Apache
  3. 升级实例
  4. 返回旋转,并移除其他

AWS 文档介绍了如何添加和删除轮换实例使用 API 或控制台,任您选择。您会注意到,使用我的方法,Web 服务器可以正常退出轮换,因此我不必担心某个用户请求是否会被终止。正如 @cyberx86 提到的,您可以apachectl -k graceful在处理完每个请求后使用该命令关闭 Apache 服务器。

答案2

我有另一种方法来实现这一点,如果你在每台服务器上都有几件事情需要升级。那么为同样的操作更新 5 台服务器将非常浪费。

创建负载平衡和扩展组。确保连接耗尽已启用。

这是我的升级步骤。

  1. 从负载均衡器中删除 1 个实例。更新您需要的所有内容。然后从生产实例创建 AMI。这将导致实例重新启动。
  2. 使用新的 AMI 配置扩展组。
  3. 从负载均衡器中删除实例并停止该实例。新实例将自动启动
  4. 继续关闭其他实例,直到所有实例重新创建。升级完成。

一些指南:
平衡 Auto Scaling 组的负载
连接耗尽

答案3

如果您的部署可以修改为支持使用新代码上线的新创建的实例 - 您实际上可以从 ELB 中删除该实例,等待 60 秒(此后,Amazon 的 ELB 将关闭与后端和客户端的连接),然后终止该实例 - 并依靠 Amazon 的 Auto Scaling Group 为您启动新实例。我创建了一个开源工具来自动执行此过程 - 可在 awsmissingtools.com 上找到 - 查找名为“AWS-HA-Release”的工具。

相关内容