如何在多个Web服务器之间共享资产?


16

我有多个Linux Web服务器连接到负载均衡器,并且我希望在这些服务器之间共享资产(例如图片,视频和其他内容)。做这个的最好方式是什么?

目前,我已经将文件服务器安装到所有Web服务器上,但是我担心它在繁忙的流量下会崩溃。如何避免这种情况发生?

提前致谢。


这就是诸如Cassandra(NoSQL数据库)之类的东西有用的地方。
亚历克西斯·威尔克

是否考虑过使用Varnish改善交通繁忙时的性能? en.wikipedia.org/wiki/Varnish_%28software%29
托尔比约恩Ravn的安德森

Answers:


12

有多种方法可以根据您的需要执行此操作。

  • 使用在Web服务器上安装了fx NFS的中央文件服务器
  • 与上述相同,但多余,因此如果其中一个发生故障,另一个将接管
  • 使用某种同步工具(例如rsync)并将文件本地托管在Web服务器上。然后设置一个cronjob以特定间隔在服务器之间同步文件。
  • 使用CDN,例如Amazon S3,Akamai等。

如果您有很多新文件,前两个最好。如果您不经常添加或更改文件,第三个将是理想的解决方案,因为用户将获得尚未同步的静态内容的404。

在许多方面,最后一个选项可能是理想的选择,但在4种方法中,最后一个选择可能是最昂贵的。您还需要重写网站来支持此方法。


rsync的最大问题是,如果您上载新数据并且rsync不会很快发生,那么您很可能会收到404错误……而且像Cassandra这样的系统(第4点)是免费的,尽管当然没有10台服务器免费的...因此,也许我应该说不收取额外费用(尽管它需要一些编程才能使其全部工作。)
Alexis Wilke 2015年

@AlexisWilke-您对rsync的看法是正确的,我在回答中也提到了它。我已经在答案中澄清了。
弗雷德里克·尼尔森

回复:#3,之间的“死区时间”新的资产部署和新的资产同步,可以最小化,如果你使用的文件系统观察家(如Facebook的守望者)和快速同步工具(如csync2)。不,延迟永远不会降为零,但是它是最小的,并且比其他替代方案更容易部署。
pepoluan

2

减少Web服务器上的负载并执行负载平衡的另一种好方法是使用squid(即squid3)将其设置为带有缓存的反向代理。如果以这种方式设置,它将静态内容(例如图片等)缓存到HDD(默认)或RAM(更快更好)中。如果任何一个特定节点超载,它也能够与其他鱿鱼服务器循环。


1
我认为如果您想要一个非常动态的网站,这种缓存将失败。因为动态性很强,所以您仍然需要使用一台主后端服务器来处理大量数据。我认为用户正在寻找拆分后端工作的替代方法。
亚历克西斯·威尔克

1
您的答案关于减少负载可能是正确的,但没有回答有关在多台服务器之间共享资产文件的问题。

如果您没有正确设置鱿鱼,则@AlexisWilke会(失败)。在设置中调整它的缓存方式(或是否缓存),但是您可能发现没有页面是完全动态的。总有一些东西可以缓存。还有安德烈(Andre),如标题所述,它在共享资产方面有很大帮助,但文件共享却不多。问题是如何防止站点在高负载下崩溃。乌贼擅长于此。
Aihngel Tech

1

由于通常需要更多服务器是运行动态网站/ aps所需的资源,因此请考虑将静态资产托管在另一个子域/域中。(例如static.yourdomain.com)

然后,您可以使用其他服务器托管它们。静态文件托管不占用太多资源,因此您需要更少的服务器来存储静态内容。您还将为动态内容释放服务器上的一些资源。

根据负载均衡器的不同,您也许还可以在同一个域上执行此操作,负载均衡器可以决定使用哪个服务器来处理哪个请求,但是如果使用单独的域,则可以轻松地将静态资产放入CDN,如果需要应该出现!


1

解决此难题的一种方法是,将文件的主要读/写副本放在共享的NFS驱动器上,但还要在每个Web服务器上保持只读副本,以便NFS主机出现故障时可以进行文件访问处于只读模式,而不是完全丢失它们。

  • 文件位于中央主机上,并通过NFS挂载与网络主机共享
  • rsync 每15分钟运行一次,以使每个Web主机上的只读副本保持最新状态。
  • 一个check_linkbash脚本运行,每分钟以确保NFS挂载仍然存在,如果没有交换一个符号链接到只读副本。

从我第一次设置此系统时,在本文中找到了更多详细信息。

优点:

  • 文件读取的可用性很高
  • 文件写入没有竞争条件
  • 新文件可立即用于所有Web主机。

缺点:

  • 有点复杂。
  • 只读副本的数量与Web主机的数量成比例,如果您有两个以上,则可能会过多。
  • 文件写入不是高度可用。
  • 切换到只读副本之前,最多可能需要停机1分钟。

0

您可能要考虑使用NoSQL数据库。它们旨在在集群上工作,并提供最终的一致性。但是要小心,它们不是酸性的。

这是一个介绍,可以帮助您确定您想要哪种NoSQL数据库。

这是与可用NoSQL相关的资源列表


4
此答案如何帮助解决文件同步问题?
titus 2015年

@titus在NoSQL中,当其中一个节点上有写操作时,它将被复制到集群中的其他节点上。卡桑德拉写一致性水平可能作出明确帮助
Azzy

因此,方法是将所有文件存储在NoSQL db中?
titus 2015年

@titus可以,但是NoSQL数据库除了存储文件外还可以做很多事情,这一切都取决于您的需求。
Azzy 2015年

2
OP要求解决一个特定问题的解决方案“ 连接到负载平衡器的多个Linux Web服务器...在这些服务器之间共享资产(例如图片,视频和其他内容)。 ”您的回答非常笼统,您能否提出建议并提出建议?解释解决该问题的特定工具(最好是其配置)?
kdbanman 2015年

0

为什么不尝试DFS解决方案,它们提供了高水平的冗余,并且可以根据需要在任意数量之间共享该卷。Gluster是我最喜欢的一个,在任何著名的Linux发行版中都非常容易安装和配置

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.