负载均衡器后面的nginx

时间:2013-10-05 16:38:10

标签: nginx load-balancing

Hii有最好的同事,

我发现Instagram上的其他开发者通过他们的博客分享了他们的技术实现。他们为遇到的问题提供了一些很好的解决方案。其中一个解决方案是亚马逊上的一个负载平衡器,其后面有3个nginx实例。我的问题是那些nginx服务器的任务是什么?那么Elastic Load平衡器的任务是什么?它们之间有什么关系?

有人可以解释一下这个解决方案背后的想法吗?

提前Tnx。

3 个答案:

答案 0 :(得分:47)

声明:我不是这方面的专家,而是我自己学习AWS生态系统的过程。

ELB(弹性负载均衡器)除了接收请求并将其路由到正确的服务器外,没有任何功能。服务器可以运行nginx,IIS,Apache,lighthttpd,你可以命名它。

我会给你一个真实的用例。

我有一个运行一个wordpress博客的nginx服务器。像我说的那样,这个服务器由nginx服务静态内容和“上游”.php请求运行在同一服务器上的phpfpm提供支持。一切都很好,直到有一天。这个博客在电视节目中有特色。我有大量的用户,服务器无法跟上那么多的流量。 我的第一反应是只使用AMI(亚马逊机器映像)在更强大的实例(例如m1.heavy)上启动我的服务器副本。问题是我知道在接下来的几天里我的流量会随着时间的推移而增加。不久我将不得不旋转一台更强大的机器,这将意味着更多的停机和麻烦。 相反,我启动了一个ELB(弹性负载均衡器)并更新了我的DNS,将网站流量指向ELB,而不是直接指向服务器。用户不知道服务器IP或任何东西,他只看到ELB,其他一切都在亚马逊的云内。 ELB决定流量服务器。您当时可以启用ELB并且只能打开一个服务器(如果此时流量较低),或者数百个。可以随时创建服务器并将其添加到服务器阵列(服务器组),也可以配置自动缩放以生成新服务器,并使用amazon命令行将它们全部自动添加到ELB服务器组。

ELB and auto scaling

亚马逊云观察(另一个产品和AWS生态系统的重要部分)始终关注服务器的运行状况,并决定将该用户路由到哪个服务器。它还知道所有服务器何时变得过载,并且是使命令产生另一个服务器的代理(使用您的AMI)。当服务器不再处于高负载状态时,它们会被自动销毁(或停止,我不记得)。

这样我就可以随时为所有用户提供服务,当负载很轻时,我会有ELB,只有一个nginx服务器。当负载很高时,我会让它决定我需要多少台服务器(根据服务器负载)。最短的停机时间。当然,你可以设置限制你可以同时支付多少服务器以及类似的东西,这样你就不需要支付你可以支付的费用。

你看,Instagram的人说下面的话 - “我们曾经在他们之间运行2台nginx机器和DNS Round-Robin”。与ELB相比,这是低效的IMO。 DNS Round Robin是将每个请求路由到不同服务器的DNS。所以首先进入服务器1,然后进入服务器2,然后继续进行。 ELB实际上监视服务器HEALTH(cpu使用情况,网络使用情况)并根据该数据决定服务器流量。你看得到差别吗? 他们说:“这种方法的缺点是DNS更新所需的时间,以防其中一台机器需要退役。” DNS循环是一种负载均衡器。但是,如果一台服务器出现故障并且您需要更新DNS以从服务器组中删除此服务器,您将有停机时间(DNS需要时间来更新到整个世界)。有些用户将被路由到这个糟糕的服务器。使用ELB,这是自动的 - 如果服务器运行状况不佳,则不会再接收任何流量 - 除非整个服务器组的运行状况不佳,并且您没有任何类型的自动缩放设置。

现在这些人在Instagram:“最近,我们开始使用亚马逊的弹性负载均衡器,其背后有3个NGINX实例,可以交换进出(如果健康状况检查失败,会自动退出) 。“

我说明的场景是虚构的。它实际上比这更复杂,但没有什么是无法解决的。例如,如果用户将图片上传到您的应用程序,您如何保持服务器组中所有计算机之间的一致性?您需要将图像存储在Amazon s3等外部服务上。另一篇关于Instagram工程的帖子 - “这些照片本身就直接进入了亚马逊S3,它目前为我们存储了数TB的照片数据。”如果他们在负载均衡器上有3个nginx服务器,并且所有服务器都提供图像链接指向S3的html页面,那么您将没有问题。如果图像本地存储在实例上 - 无法做到这一点。 ELB上的所有服务器也需要一个外部数据库。因为亚马逊有RDS - 所有机器都可以指向同一个数据库,并且可以保证数据的一致性。 在上图中,您可以看到RDS“Read replica” - 这是RDS的负载均衡方式。我此时不太了解,抱歉。

请尝试阅读:http://awsadvent.tumblr.com/post/38043683444/using-elb-and-auto-scaling

最好的问候。

答案 1 :(得分:0)

你能指出博客文章吗?

负载平衡器平衡负载。它们监视Web服务器的运行状况(响应时间等)并在Web服务器之间分配负载。在更复杂的实现中,如果存在流量峰值,则可以自动生成新服务器。当然,您需要确保服务器之间存在一致性。例如,它们可以共享相同的数据库。

所以我认为负载均衡器会受到影响,并根据服务器运行状况决定它将路由流量的服务器。 。 Nginx是一个非常擅长为同时用户提供大量静态内容的Web服务器。 可以使用cgi将动态页面请求卸载到其他服务器。或者运行nginx的相同服务器也可以运行phpfpm。 。 很多可能性。我现在在手机上。明天我可以写一点。 最好的问候。

答案 2 :(得分:0)

我知道我迟到了,但我认为在Istagram blogpost中使用ELB背后的NGINX实例是提供here所描述的高可用负载均衡器。

NGINX实例似乎没有在博客帖子中用作Web服务器。 对于那个角色,他们提到:

  

接下来是处理我们请求的应用程序服务器。我们运行Djangoon亚马逊高CPU超大型机器

因此,ELB仅用作NGINX实例之间的DNS Round-Robin的旧解决方案的替代品,但未提供高可用性。