跨多个静态文件服务器进行负载平衡以实现带宽分配的最佳方法?


12

首先,我将向您解释我的情况。我正在运行一个相当受欢迎的网站作为附带项目,因此我无法真正投入大量资金。我目前只有一台服务器,前面有HAProxy,向Apache发送正常请求,向Lighttpd发送所有静态文件请求。这非常有效,因为所有php和post请求均由Apache处理,而所有图像均发送到速度更快的Lighttpd(该站点主要是图像,因此这很重要)。不必设置一个子域来提供图像会很好,因为短网址也非常重要,因此,我之所以使用HAProxy。

我发现一个托管服务提供商提供了我一直在使用的非常便宜的未计量带宽,当我开始提供100mbs网卡可以处理的最大带宽时出现了问题,因此需要第二台服务器。

我在选择方案时考虑了很多,因此我将向您解释每个方案。希望您可以提供一些见解,以了解哪个对我来说是最佳选择,或者也许还有另一个我还没有想到的选择。

要求:

  • 甚至带宽分配也是必须的。我有一台功能强大的服务器,因此无法扩展。我需要扩展以获取更多带宽。

  • 短网址。我真的不会设置像img.example.com这样的子域来提供图片。example.com/image.jpg是现在的样子,也是我真正希望它留下的样子。但是,如果没有其他办法,我就会理解。

  • 处理请求的最直接的服务器将非常好,但不是必须的。要记住的事情。

HAProxy进行负载平衡:

  • 因为我已经在使用HAProxy,所以这真的很容易。但是,我认为问题在于分配带宽时。我对此可能是错的,但是HAProxy不会将请求发送到服务器,服务器在该服务器上对其进行处理,然后再通过HAProxy将其发送回客户端吗?因此,所有流量都通过负载平衡器返回,导致它使用的带宽与所有服务器的总和一样多。

DNS轮循:

  • 这可能是我最好的选择。只需跨多个服务器复制网站,然后执行我现在正在做的事情。不利的一面是,如果一台服务器出现故障,客户端仍然会发送给它。我还需要跨多个服务器复制站点。我有点希望我可以有一个主服务器来处理除静态文件以外的所有内容,然后再有几个静态文件服务器。我还读到,这有点像“穷人的负载平衡”,最好有一些更复杂的东西。

服务器直接返回:

  • 看起来确实很复杂,但可能是一个不错的选择。我仍然可以将某些URL发送到某些服务器吗?就像现在使用HAProxy一样,每个以正确的文件扩展名结尾的URL都将发送到Lighttpd,而其他扩展名将发送到Apache。所以我需要类似的东西。像一样,所有php请求都由运行平衡软件的同一台服务器处理,而所有jpg请求都发送到多个服务器。

理想情况下,如果HAProxy支持Direct Server Return,那么我的问题将得到解决。我也不想使用CDN,因为它们确实很昂贵,而且毕竟这只是一个附带项目。

你明白我的问题吗?让我知道我是否解释不正确或您需要更多信息。


1
这是伊姆古尔(Imgur),最近筹集了4000万美元。:O
L1th1um 2014年

Answers:


3

绘制应用程序的请求/响应周期图,并隔离瓶颈。您是正确的,将单个代理分发负载到许多应用程序服务器将需要所有应用程序服务器的总带宽。经典的解决方案是RR DNS。Google,Yahoo和Amazon都使用带有短TTL的此技术。我前一段时间做了一些调查,并记录了我的发现

另一个解决方案是使用花式企业负载平衡解决方案,该解决方案使用虚拟IP寻址来平衡具有真实IP地址的多个应用服务器之间的请求。我曾经使用过Netscaler和Stonesoft产品。两者的性能都很好,但它们的特质却很糟糕,而且非常复杂。


非常感谢你。您的调查结果非常有帮助。我认为这是我最终会想到的解决方案。但是,“就像任何优秀的研究人员一样,只有拥有足够的数据,我才会采取行动。” :)
艾伦(Alan)

感谢您的见解。不幸的是,具有讽刺意味的是,指向您的发现的链接似乎已断开,您可以解决它吗?
TCB13 '19

3

一些答案:

  • 是的,所有流量都通过HAProxy传递,因为它充当HTTP级别的代理。即使将HAProxy安装在负载均衡多个后端服务器的单独服务器上,也是如此。因此,如果您的托管服务提供商仅提供100MBit网络端口,而您已经在推动100MBit,那么您将遇到问题。
  • 关于域,最佳的选择是从与您的Web应用程序不同的域中提供图像-而不是子域,即另一个域,以使cookie不会随图像请求一起发送。请参阅Steve Souders的原始工作,或在Stack Overflow上的实现。如果短URL对您来说非常重要,那么最好的办法是将Webapp从主URL移开,即将文件管理应用程序移至login.sitename.com?

您是否需要对图像请求进行身份验证?如果没有,那么使用类似Amazon S3的东西怎么样?它具有很大的可扩展性,并且数据传输成本相当便宜。在这种情况下,我将使用i.sitename.com之类的东西作为Amazon S3存储桶主机名的DNS CNAME,请参阅Amazons docs。AFAIK您不能将根域名(sitename.com)用作CNAME,因此您必须使用i.sitename.com之类的子域。

您还可以跨多个服务器散列图像。即您创建一个DNS结构,如login.sitename.com和a.sitename.com;b.sitename.com; c.sitename.com等。“一”。和“ b”。etc服务器仅包含一个带有图像的文件系统和一个轻量级的HTTP服务器(您已经在使用Lighttpd,因此请继续使用。对于将来的项目,我建议将nginx视为一种更好的替代品。)当用户上传时在图像中,您将创建一个唯一标识符哈希,该唯一标识符可能是他的用户名,文件名或多个标识符的组合。通过此哈希,您可以确定将映像存储在哪个服务器上。

编辑我应该已经看到哈希已经讨论过了。本质上,我在这里建议的是也要在主机名上使用哈希,以在多个主机上平均分配网络流量。

我不知道您需要多便宜 -但是当您推动100MBit的网络流量时,“便宜又好”很快就会变成一种幻想。也许您应该首先考虑获得良好的商业模型,该模型可以提供经常性收入,然后再实施适当的技术?


1

我假设HAProxy与您的其他应用程序位于同一服务器上吗?您可以将HAProxy分解到另一个系统上,以运行请求,然后将常规请求发送到一台服务器,将映像请求发送到另一台服务器。这些问题是所有请求仍然都在一个盒子中,如果您饱和了它的带宽,那可能对您没有太大帮助。

您说短网址很重要。为什么?将图片从“ example.com”切换到“ i.example.com”真的是一件大事吗?您可以使用Lighttpd在自己的服务器上将“ i”设置为其自己的IP,并完全绕过HAProxy,从而解决吞吐量问题。您还将获得Web浏览器的优势,该浏览器允许一次打开更多请求,因为它将认为它们是不同的域名,并且可以打开更多并发连接。如果单个“ i”服务器饱和,则可以使用DNS循环添加另一台。希望到那时,您已经产生了足够的收入来实施更好的解决方案。


是的,HAProxy在同一台服务器上-到目前为止,我只有一台。即使我将其分发给另一台服务器,也不会像我上面解释的那样,所有数据仍通过HAProxy通过服务器传输吗?短网址很重要,因为这是网站的目的。这是ImageShack和TinyPic之间的交叉。URL越长,我的站点就越少。但是正如我所说,如果唯一可行的选择是设置子域,那么我只需要这样做。我真的不愿意。
艾伦(Alan)2009年

1

您的托管服务提供商是否提供负载平衡服务?我认为是最好的解决方案。

做到这一点的另一种方法(但需要对其进行测试)是重写请求(轻而易举地)。例如:example.com/file.html停留在apache中,而example.com/image.jpg重定向到i.example.com/image.jpg。所有请求都将通过apache进行管理,但是响应(上行带宽)将流向lighttpd服务器。域对用户是透明的。仍然需要测试apache是​​否可以处理所有请求,或者让lighttpd完成这项工作。

您是对的,所有数据都是通过HAProxy传递的,因此(据我所知)您不能直接用它返回服务器。

更新

通过查看HAproxy文档,我发现了“ redir”参数。我不知道它是否可以像apache rewrite一样工作,但它可能有用。该文件说:

主要用途是通过使客户端直接连接到静态服务器来增加其带宽。

也许它适合您的情况。


嘿,谢谢你的回应。我实际上已经尝试过了,它在实践中并不如理论上那样好用。原因是Apache处理所有请求,因此,每当用户点击图片时,都会生成Apache,查看URL,然后将其发送给它。这与让Apache首先处理映像没有什么不同。我同意主机提供的负载平衡器是最好的选择,但它也是最昂贵的之一。它们为每个并发连接收费,而我得到了数百个。
艾伦(Alan)2009年

轻量级服务器将响应直接发送到消耗自己带宽的客户端的方式有所不同。问题是Apache服务器将处理许多请求。检查对我的答案的更新,我找到了另一个解决方案。
hdanniel

1

我假设对于任何可观的图像集,您都不是基于原始文件名来存储图像,因为您很快就会遇到名称冲突。

处理这些类型问题的许多应用程序都使用文件的哈希和基于该哈希的目录结构。目录结构如下所示,其中目录路径是哈希的前两个字符,然后第二级目录是哈希的后两个字符。

/image root/AA/AA/images  
/image root/AA/AB/images

这样做的好处是,散列使文件的分配保持均匀,并为您提供易于拆分到多个服务器的名称空间。基本上,您提供来自不同服务器的部分哈希空间,并且在扩展时可以根据需要进一步细分。

缺点是哈希值不完美,可能会发生冲突。我不确定如何处理。因此,您可能需要进行一些研究。我认为代理中的重写规则应该能够对A3A8BBC83261.jpg进行哈希处理并将其重写为http://img3.domain.com/A3/A8/BBC83261.jpg。您可能不认为这是一个短网址。


是的,这正是我存储图像的方式。但是,问题不在于存储,而在于带宽分配。
艾伦,

但是,如果将AA到33存储在一台服务器上,将34到99存储在另一台服务器上,则不仅可以平衡存储问题,还可以平衡带宽分配。
09年

0

在您的帖子中,您提到您认为DNS轮询可能是您的最佳选择,但是您担心单个服务器出现故障...

如果是这种情况,请查看JH Software的简单故障转移。我过去使用过它,效果很好。

http://www.simplefailover.com

基本上,它会监视您的服务器,当发现一台服务器出现故障时,它会迅速重写DNS,以将失效的服务器从循环中移出。

这是他们网站上的摘录:

“简单故障转移”会持续监视您的服务器,以找出哪些服务器已启动以及哪些服务器已关闭,然后它会相应地动态更新DNS记录,以便您的域名始终指向功能正常的服务器。

它可与Web服务器(HTTP),邮件服务器(SMTP,IMAP,POP3),FTP服务器以及几乎任何其他基于TCP / IP的服务器类型一起使用。

如前所述,我过去在网站和邮件服务器上都使用过它。表现还不错。在大多数情况下,故障转移非常快(猜测2-5分钟),我想几乎每个人都可以在15分钟内完成故障转移。

不一定是完美的……但绝对快捷而简单。

注意:这是Windows产品。我不确定它们是否具有Linux版本,但是由于基于DNS的服务器可以故障转移。

在我们的案例中,我们只是将其扔到XP机器上,告诉机器每晚重新启动一次,并且运行了好几年。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.