我想在 AWS 中设置自动缩放。我不想使用弹性负载均衡器。
Amazon 中的 Autoscaling 在需求高峰期间无缝创建 EC2 实例以保持性能,并在需求平缓期间自动减少以最小化成本。
由于此 EC2 实例是自动创建的,因此 NGINX 不知道它们的主机名。
我知道并且已经在 nginx 中设置了 10 个 EC2 实例的上游。
当自动缩放添加/更新/删除 EC2 实例时,我希望能够将服务器名称自动添加/更新/删除到我的上游 nginx 配置中。
我想在 AWS 中设置自动缩放。我不想使用弹性负载均衡器。
Amazon 中的 Autoscaling 在需求高峰期间无缝创建 EC2 实例以保持性能,并在需求平缓期间自动减少以最小化成本。
由于此 EC2 实例是自动创建的,因此 NGINX 不知道它们的主机名。
我知道并且已经在 nginx 中设置了 10 个 EC2 实例的上游。
当自动缩放添加/更新/删除 EC2 实例时,我希望能够将服务器名称自动添加/更新/删除到我的上游 nginx 配置中。
这可以通过使用 Amazon SDK(我几乎完成它,将其放在 github 上),利用 SNS、EC2 和 Autoscaling 服务来实现。
我已按照以下步骤实现此目的:
请在此处找到脚本https://github.com/singhupendra/aws-autoscale
谢谢@talonx,我做了一些研究,Amazon Autoscale 有一个 api 来查询当前的自动缩放组状态,并枚举其成员。它返回实例 ID(http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/api_requests.html#query-example),然后您可以使用描述工具获取服务器名称(http://docs .aws.amazon.com/AWSEC2/latest/CommandLineReference/ApiReference-cmd-DescribeInstances.html),最后重新创建上游包含文件。我可以感觉到自动缩放通知来启动执行这些任务的进程。
我仍然没有实现它,但它是一条路要走。
还可以将 Autocaling 与 SNS http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/ASGettingNotifications.html一起使用
我自己还没有实现这个,但我正在考虑使用NGiNX Plus的On-the-fly Reconfiguration。我认为 AMI 或设置 Auto Scaling Group 实例的配置管理(Puppet、Salt 等)可以访问 NGiNX 重新配置 API(可能通过内部 Route53 域名,因此没有固定 IP需要使用),并将自己添加到上游集群中进行反向代理。之后,NGiNX 的内置健康检查将接管那个 [添加的] 实例,并在它变得不可用时将其删除。这似乎是最干净的解决方案,添加实例没有延迟,删除它也几乎没有延迟,因为 NGiNX Plus 具有带外健康检查功能。
这种方法避免了需要设置自动发现系统(Consul、Serf 等),对于较小的设置,这在设置/管理以及所需的 EC2 实例方面通常看起来开销很大。例如,Consul 至少需要三个实例才能稳定。Serf 或许可以在 ASG 实例本身上运行,但仍然存在维护它的开销,并且如果 ASG 缩减到一两个实例,您将失去法定人数。
最后,这可以与 Auto Scaling Group 更改的自动通知相结合,可能在用于负载平衡的 NGiNX 服务器上。由此类通知触发的侦听器(这可能是 Upendra 也提到的)然后可以通过 On-the-fly 修改 API 立即将新实例添加到 NGiNX。除了 NGiNX Plus 的成本之外,这让人想知道为什么有人会首先使用具有众多问题的 Elastic Load Balancer。
编辑 2015-12-07:ngx_openresty的balancer-by-lua(参见这个 GitHub 线程)提供了另一种可能的开源解决方案,用于从 NGiNX 上游组中热添加/删除服务器。我自己还没有尝试过这个,但想在这里为任何偶然发现这篇文章的人添加一个提及。