2013-10-05 78 views
16

斐伊川有最好的collegue背后,nginx的负载均衡

我在那个Instagram的分享他们与其他开发者的技术实施来找到谷底自己的博客。他们为遇到的问题提供了一些很好的解决方案。他们提供的解决方案之一就是Amazon上的一个负载均衡器,后面有3个nginx实例。我的问题是这些nginx服务器的任务是什么?而弹性负载平衡器的任务又是什么?它们之间的关系是什么?

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

Tnx提前。

回答

43

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

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

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

我有一个运行一个WordPress博客的nginx服务器。就像我说的,这台服务器是由nginx提供静态内容和“upstreaming”.php请求给运行在同一台服务器上的phpfpm。一切都很顺利,直到有一天。这个博客曾在电视节目中亮相。我有大量的用户,服务器无法跟上那么多的流量。 我的第一反应是只使用AMI(亚马逊机器映像)在m1.heavy等更强大的实例上创建我的服务器的副本。问题是我知道在接下来的几天内会有流量增加。很快,我将不得不旋转更强大的机器,这意味着更多的停机时间和麻烦。 取而代之,我启动了一个ELB(弹性负载平衡器)并更新了我的DNS,以将网站流量指向ELB,而不是直接指向服务器。用户不知道服务器IP或任何东西,他只看到ELB,其他所有东西都在亚马逊的云中。 ELB决定流量到达哪个服务器。您可以在当时只有一台服务器(如果此时流量很低)或数百台服务器。可以随时创建服务器并将其添加到服务器阵列(服务器组),也可以配置自动扩展以产生新服务器,并使用亚马逊命令行将其自动添加到ELB服务器组中,全部自动完成。

ELB and auto scaling

亚马逊云表(其他产品和AWS生态系统的重要组成部分)总是看着你的服务器的健康状况,并决定哪些服务器它将路由用户。它也知道什么时候所有的服务器变得过载,并且是提供命令产生另一个服务器的代理(使用你的AMI)。当服务器不再承受重负时,它们会自动销毁(或停止,我不记得)。

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

你看,Instagram的人说,以下 - “我们曾经在它们之间运行2个nginx机器和DNS Round-Robin”。与ELB相比,这是低效率的IMO。 DNS循环是DNS将每个请求路由到不同的服务器。所以首先去服务器一,第二去服务器二,继续。 ELB实际上监视着服务器的健康状况(cpu使用情况,网络使用情况),并根据该情况决定向哪个服务器发送流量。你看得到差别吗?他们说:“这种方法的不足之处在于DNS需要更新的时间,以防其中一台机器需要退役。” DNS循环是负载平衡器的一种形式。但是,如果一台服务器出现故障,并且您需要更新DNS以将该服务器从服务器组中删除,则会导致停机(DNS需要时间才能更新到整个世界)。一些用户将被路由到这个不好的服务器。对于ELB,这是自动的 - 如果服务器运行状况不好,它不会收到更多的流量 - 除非整个服务器组的状态都不好,并且您没有任何类型的自动缩放设置。

现在,Instagram的人们说:“最近,我们转而使用亚马逊的弹性负载平衡器,其背后有3个NGINX实例,可以交换进出(如果他们健康检查失败,会自动失去轮换)“。

我说明的情景是虚构的。它实际上比这更复杂,但没有什么不能解决。例如,如果用户将图片上传到您的应用程序,您如何保持服务器组上所有机器的一致性?您需要将图像存储在Amazon S3等外部服务上。另一篇关于Instagram工程的文章 - “这些照片本身直接传到亚马逊S3上,亚马逊S3目前为我们存储了几兆太字节的照片数据。”如果负载平衡器上有3个nginx服务器,并且所有服务器都提供图像链接指向S3的html页面,则不会有任何问题。如果图像本地存储在实例上 - 无法执行此操作。 ELB上的所有服务器也需要一个外部数据库。对于那个亚马逊有RDS - 所有的机器可以指向相同的数据库,并保证数据的一致性。 在上面的图片中,您可以看到RDS“只读副本” - 即RDS负载平衡方式。对此我不太了解,对不起。

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

最好的问候。

+0

这么好的解释,谢谢你太多了。我现在的一切都很清楚。现在我去找出一些关于AWS的其他内容。 最好的问候。 – Navid

+0

祝你好运。 – ddutra

+1

这真是一个很棒的解释......帮了我很多 – sam

0

您能指出博客条目吗?

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

所以我相信负载平衡器会受到影响,并决定根据服务器的健康状况决定将哪个服务器路由流量。 。 Nginx是一款非常适合同时在线服务的Web服务器。 动态页面的请求可以使用cgi卸载到不同的服务器。或者运行nginx的服务器也可以运行phpfpm。 。 很多可能性。我现在正在用手机。明天我可以多写一点。 此致敬礼。

+1

博客条目是:http://instagram-engineering.tumblr.com/post/13649370142/what-powers-instagram-hundreds-of-instances-dozens-of他们的博客是伟大的和鼓舞人心的。非常感谢你的一个很好的解释。所以如果我明白自己的平衡器没有任何功能,它是组织流量的nginx服务器?那么你在其中一个负载平衡器上安装了一个nginx网络服务器?对于缺乏信息感到抱歉。 – Navid

+0

我会给你一个真实的用例,发生在我身上。 – ddutra

0

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

NGINX实例似乎并未被用作博客帖子中的Web服务器。 对于角色们提及:

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

所以ELB被使用,就像与DNS轮循,这不是提供高可用性NGINX实例之间的旧的解决方案的替代品。