我想在 AWS 中设置自动扩展。我不想使用 Elastic Load Balancer。
亚马逊的自动扩展功能会在需求高峰期间无缝创建 EC2 实例以保持性能,并在需求低迷期间自动减少实例以最大限度地降低成本。
由于此 EC2 实例是自动创建的,因此 NGINX 不知道它们的主机名。
我知道并且已经在 nginx 中将上游设置到了 10 个 EC2 实例。
我希望能够添加/更新/删除自动地当自动扩展添加/更新/删除 EC2 实例时,将服务器名称添加到我的上游 nginx 配置中。
答案1
这可以通过使用 Amazon SDK(我快完成了,会把它放在 github 上)来实现,利用 SNS、EC2 和 Autoscaling 服务。
我按照以下步骤实现此目的:
- 启用 HTTP 通知并订阅我的网络服务器。
- 在我的自动缩放组中添加了一个心跳为 1 分钟的生命周期挂钩(在终止前等待 1 分钟),用于终止服务器
- 创建索引文件来解析消息以检测它是什么类型的消息(即启动或终止)
- 一旦确定了事件类型,我就会查询 EC2 以获取实例的私有 IP
- 如果要启动,请等到收到标头 200,然后将 IP 添加到 nginx 配置并重新加载
- 如果发生终止,请从配置中删除 IP 并重新加载 nginx
答案2
谢谢@talonx,我做了一些研究,Amazon Autoscale 有一个 API 可以查询当前自动缩放组状态,并枚举其成员。它返回实例 ID(http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/api_requests.html#query-example),然后您可以使用 describe 工具获取服务器名称(http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ApiReference-cmd-DescribeInstances.html) 并最终重新创建上游包含文件。我可以感知到 Autoscaling 通知启动了执行这些任务的进程。
我还没有实现它,但这是可行的方法。
还可以将 Autocaling 与 SNS 结合使用http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/ASGettingNotifications.html
答案3
我还没有自己实现这个,但我正在考虑使用动态重新配置的NGiNX Plus。我认为,设置 Auto Scaling Group 实例的 AMI 或配置管理(Puppet、Salt 等)可以访问 NGiNX 重新配置 API(可能通过内部 Route53 域名,因此不需要使用固定 IP),并将自身添加到反向代理的上游集群中。之后,NGiNX 的内置健康检查将接管该 [添加的] 实例,并在实例不可用时将其删除。这似乎是最干净的解决方案,添加实例没有延迟,删除实例几乎没有延迟,因为 NGiNX Plus 具有带外健康检查功能。
这种方法避免了需要设置自动发现系统(Consul、Serf 等),对于较小的设置来说,这在设置/管理以及所需的 EC2 实例方面似乎会带来很大的开销。例如,Consul 至少需要三个实例才能稳定运行。Serf 也许可以在 ASG 实例本身上运行,但维护它仍然有开销,如果 ASG 缩减为一个或两个实例,您将失去法定人数。
最后,这可以与 Auto Scaling Group 更改的自动通知相结合,也许在用于负载平衡的 NGiNX 服务器上。由此类通知触发的侦听器(这可能是 Upendra 也提到的)可以通过即时修改 API 立即将新实例添加到 NGiNX。除了 NGiNX Plus 的成本之外,这让人想知道为什么有人会首先使用存在众多问题的 Elastic Load Balancer。
编辑2015-12-07:ngx_openresty的平衡器-by-lua(请参阅此 GitHub 帖子) 提供了另一种可能的开源解决方案,用于从 NGiNX 上游组热添加/删除服务器。我自己还没有尝试过这个,但想在这里提到一下,以方便任何偶然发现这篇文章的人。