我在 Amazon EC2 Elastic Load Balancing 后面有 5 个 Web 服务器(Apache/mod_perl),当我将代码部署到 Web 服务器时,我正在执行此操作..
- 对于每台机器,关闭 Apache
- 更新代码
- 重新启动服务器并继续到下一个服务器
我认为当我的服务器关闭时,ELB 将不会将请求分发到我的服务器,但是请求仍在服务怎么办?
我认为更好的方法是
- 停止接受来自 ELB 的新请求
- 有时会休眠,只有当所有请求都得到响应时才关闭 Web 服务器
- 更新代码
- 重新启动服务器
但是如何从我的本地服务器执行 (1) 和 (2)?我需要使用 AWS API 吗?或者有其他简单的方法吗?
谢谢。
答案1
我将 apache/mod_perl 作为负载平衡的 EC2 实例运行,并定期进行代码升级,正如您所说。我的流程是:
- 取一两个实例不循环
- 关闭该实例上的 Apache
- 升级实例
- 返回旋转,并移除其他
这AWS 文档介绍了如何添加和删除轮换实例使用 API 或控制台,任您选择。您会注意到,使用我的方法,Web 服务器可以正常退出轮换,因此我不必担心某个用户请求是否会被终止。正如 @cyberx86 提到的,您可以apachectl -k graceful
在处理完每个请求后使用该命令关闭 Apache 服务器。
答案2
我有另一种方法来实现这一点,如果你在每台服务器上都有几件事情需要升级。那么为同样的操作更新 5 台服务器将非常浪费。
创建负载平衡和扩展组。确保连接耗尽已启用。
这是我的升级步骤。
- 从负载均衡器中删除 1 个实例。更新您需要的所有内容。然后从生产实例创建 AMI。这将导致实例重新启动。
- 使用新的 AMI 配置扩展组。
- 从负载均衡器中删除实例并停止该实例。新实例将自动启动
- 继续关闭其他实例,直到所有实例重新创建。升级完成。
一些指南:
平衡 Auto Scaling 组的负载
连接耗尽
答案3
如果您的部署可以修改为支持使用新代码上线的新创建的实例 - 您实际上可以从 ELB 中删除该实例,等待 60 秒(此后,Amazon 的 ELB 将关闭与后端和客户端的连接),然后终止该实例 - 并依靠 Amazon 的 Auto Scaling Group 为您启动新实例。我创建了一个开源工具来自动执行此过程 - 可在 awsmissingtools.com 上找到 - 查找名为“AWS-HA-Release”的工具。