我发现 Instagram 通过他们的博客与其他开发人员分享他们的技术实现。对于遇到的问题,他们有一些很好的解决方案。他们拥有的其中一个解决方案是 Amazon 上的 Elastic Load Balancer,后面有 3 个 nginx 实例。那些 nginx 服务器的任务是什么?弹性负载均衡器的任务是什么,它们之间的关系是什么?
3 回答
免责声明:我不是这方面的专家,我自己也在学习 AWS 生态系统。
ELB(弹性负载均衡器)本身没有任何功能,除了接收请求并将其路由到正确的服务器。这些服务器可以运行 Nginx、IIS、Apache、lighthttpd,随叫随到。
我会给你一个真实的用例。
我有一台 Nginx 服务器运行一个 WordPress 博客。就像我说的那样,这个服务器由 Nginx 提供支持,它提供静态内容并将 .php 请求“上传”到运行在同一台服务器上的 phpfpm。一切都很顺利,直到有一天。这个博客在电视节目中出现。我有大量用户,服务器无法跟上那么多流量。我的第一反应是只使用 AMI(亚马逊机器映像)在更强大的实例(如 m1.heavy)上启动我的服务器副本。问题是我知道在接下来的几天里我的流量会随着时间的推移而增加。很快我将不得不旋转一台更强大的机器,这意味着更多的停机时间和更多的麻烦。相反,我启动了一个 ELB(弹性负载均衡器)并更新了我的 DNS 以将网站流量指向 ELB,而不是直接指向服务器。用户不知道服务器 IP 或任何东西,他只看到 ELB,其他一切都在亚马逊的云中进行。ELB 决定流量流向哪个服务器。您可以同时拥有 ELB 和仅一台服务器(如果您的流量目前较低),也可以是数百台服务器。可以随时创建服务器并将其添加到服务器阵列(服务器组),或者您可以配置自动缩放以生成新服务器并使用亚马逊命令行将它们添加到 ELB 服务器组,这一切都是自动的。
亚马逊云手表(AWS 生态系统的另一个产品和重要组成部分)一直在监视您的服务器的健康状况,并决定它将该用户路由到哪台服务器。它还知道所有服务器何时变得负载过重,并且是下达命令以生成另一台服务器(使用您的 AMI)的代理。当服务器不再承受重负载时,它们会自动销毁(或停止,我不记得了)。
这样我就可以随时为所有用户服务,当负载很轻时,我将拥有 ELB 和只有一个 Nginx 服务器。当负载很高时,我会让它决定我需要多少台服务器(根据服务器负载)。最少的停机时间。当然,您可以对可以同时负担的服务器数量以及类似的东西设置限制,这样您就不会因为您可以支付的费用而被计费。
你看,Instagram 的家伙说了以下的话——“我们曾经在它们之间运行 2 台 Nginx 机器和 DNS 循环”。与 ELB 相比,这是低效的 IMO。DNS Round Robin 是 DNS 将每个请求路由到不同的服务器。所以第一个去服务器一,第二个去服务器二,然后继续。ELB 实际上会监视服务器的运行状况(CPU 使用率、网络使用率),并据此决定哪些服务器流量。你看得到差别吗?他们说:“这种方法的缺点是更新 DNS 所需的时间,以防其中一台机器需要退役。” DNS Round robin 是负载均衡器的一种形式。但是,如果一台服务器停止运行并且您需要更新 DNS 以将该服务器从服务器组中删除,您将有停机时间(DNS 需要时间来更新到整个世界)。一些用户将被路由到这个坏的服务器。使用 ELB,这是自动的 - 如果服务器健康状况不佳,它不会接收更多流量 - 当然,除非整个服务器组健康状况不佳并且您没有任何类型的自动缩放设置。
现在 Instagram 的人:“最近,我们开始使用 Amazon 的 Elastic Load Balancer,它后面有 3 个 NGINX 实例,可以换入和换出(如果它们未能通过健康检查,则会自动退出轮换)。”。
我说明的场景是虚构的。它实际上比这更复杂,但没有什么是无法解决的。例如,如果用户将图片上传到您的应用程序,您如何保持服务器组上所有机器之间的一致性?您需要将图像存储在 Amazon s3 等外部服务上。在 Instagram 工程的另一篇文章中——“照片本身直接进入 Amazon S3,它目前为我们存储了数 TB 的照片数据。”。如果他们在负载均衡器上有 3 个 Nginx 服务器,并且所有服务器都提供 HTML 页面,其中图像链接指向 S3,那么您将没有问题。如果图像本地存储在实例上——没办法。ELB 上的所有服务器也需要一个外部数据库。因为亚马逊有 RDS——所有机器都可以指向同一个数据库,并且可以保证数据的一致性。在上图中,您可以看到一个 RDS“只读副本”——即 RDS 负载均衡方式。目前我对这方面了解不多,抱歉。
尝试阅读:http ://awsadvent.tumblr.com/post/38043683444/using-elb-and-auto-scaling
你能指出博客条目吗?
负载平衡器平衡负载。它们监视 Web 服务器的健康状况(响应时间等)并在 Web 服务器之间分配负载。在更复杂的实现中,如果出现流量高峰,可能会自动生成新服务器。当然,您需要确保服务器之间的一致性。例如,他们可以共享相同的数据库。
因此,我相信负载均衡器会受到打击,并根据服务器运行状况决定将流量路由到哪台服务器。. Nginx 是一个非常擅长为同时用户提供大量静态内容的 Web 服务器。动态页面的请求可以使用 cgi 卸载到不同的服务器。或者运行 nginx 的同一台服务器也可以运行 phpfpm。. 很多可能性。我现在在手机上。明天我可以多写一点。此致。
我知道我迟到了,但我认为在 Istagram 博客文章中使用 ELB 后面的 NGINX 实例是为了提供高可用负载均衡器,如此处所述。
NGINX 实例似乎没有在博文中用作 Web 服务器。对于那个角色,他们提到:
接下来是处理我们请求的应用服务器。我们在 Amazon High-CPU Extra-Large 机器上运行 Django
因此,ELB 仅用作替代他们的旧解决方案,在 NGINX 实例之间使用 DNS 循环,不提供高可用性。