负载均衡器之后的nginx

嗨,那里最好的同事,

我发现,Instagram通过他们的博客与其他开发者分享他们的技术实现。 他们遇到的问题有一些很好的解决scheme。 他们的解决scheme之一就是Amazon上的一个负载均衡器,后面有3个nginx实例。 我的问题是这些nginx服务器的任务是什么? 弹性负载平衡器的任务是什么?它们之间的关系是什么?

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

Tnx提前。

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

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

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

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

ELB和自动缩放

Amazon云监视(AWS生态系统的另一个产品和重要组成部分)始终监视您的服务器的运行状况,并决定将该用户路由到哪个服务器。 它也知道什么时候所有的服务器都变得过载了,并且是使命令产生另一个服务器的代理(使用你的AMI)。 当服务器不再承受重载时,它们会自动销毁(或停止,我不记得)。

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

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

现在,Instagram的人士说:“最近,我们转而使用亚马逊的Elastic Load Balancer,后面有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

最好的祝福。

你能把这个博客点出来吗?

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

所以我相信负载平衡器会受到影响,并根据服务器的健康状况决定将哪个服务器路由流量。 。 Nginx是一个Web服务器,它非常适合为同时在线的用户提供大量的静态内容。 可以使用cgi将动态页面的请求卸载到不同的服务器上。 或者运行nginx的服务器也可以运行phpfpm。 。 很多的可能性。 我现在正在用手机。 明天我可以再写一点。 最好的祝福。