处理用户上传到Web服务器群集

我们在一个硬件负载平衡器后面有许多Linuxnetworking服务器,它们服务于一个网站。

游客需要能够上传文件。 这些文件的大小一般为300-700KB,我们预计在这个区域有100万个文件。 但是,这带来了一个明显的问题:如果用户上传文件到处理请求的服务器,我们如何保持所有的服务器同步?

延迟应该是最小的,所以在设定的时间表上使用rsync之类的东西并不是真正的select。 也不应该有一个单一的故障点,所以NFS不适合,除非它与DRBD结合来创build故障转移NFS服务器。

我研究过共享/集群文件系统(GlusterFS,MogileFS,OCFS2和GFS),但没有这些经验,所以我不确定它们在性能和可靠性方面如何在生产环境中执行。

我很欢迎任何有关如何最好地解决这个问题的build议。

非常感谢

通过DRBD的GFS2 / OCFS2允许一对服务器作为集群存储运行双主节点。 你的networking前端将从共享对拉。 您也可以使用多个磁头共享单个FC连接介质,也可以使用NFS来为每个Web前端使用一个共享的文件系统。 如果您使用带有DRBD的NFS,请记住,由于缺less集群锁,因此只能在主/从模式下运行。 这可能会减less一半的潜在吞吐量。

GlusterFS听起来更像你正在寻找的东西。 它会有一些独特的怪癖,即文件请求节点上还没有它,元数据查找说,它在那里,它从一个复制节点转移,然后服务。 根据文件大小,第一次在节点上请求会有一些滞后。

OpenAFS也是另一种可能性。 你有共享存储,每个本地资源都有一个最近使用的项目的本地池。 如果存储引擎closures,您的本地资源池仍然可用。

Hadoop的HDFS是另一种“有效”的select。 设置起来有点复杂,但是也可以满足你的要求。 使用分布式文件系统时,会出现大量重复的内容。

另一个肮脏的方法是在每个Web前端上运行caching,从一台计算机上提取静态/上传的内容,并在每个前端上使用Varnish来维护单个副本的内存caching版本。 如果单台机器出现故障,Varnish会caching现有的项目,直到宽限期,新项目将会丢失。

这很大程度上取决于您需要的后端的可靠性。 分布式文件系统在你的本地机器是一个复制节点的情况下可能会在速度上有优势,因为它们不涉及networking操作来获取数据,但是,使用gigE和10G卡很便宜,你可能不会遇到显着的延迟。

所有集群文件系统都有一个核心的弱点:如果一定比例的系统脱机,那么整个文件系统就没有用处,但是仍然存在的节点可能无法正常处理。

例如,假设您在机架中有30台服务器,并且想共享其本地空间。 你build立一个集群文件系统,你甚至可以build立它,这样,如果只有一个节点出现故障,数据就会被复制到足够的其他节点上,这样就没有问题了。 到现在为止还挺好。 然后,以太网交换机中的一个卡片死亡。 此交换机将群集中的所有节点相互连接。 该卡closures了30个节点中的15个通信。 你需要问自己的问题是:

  1. 如果这种情况对你来说很好,那么失败有多优雅呢? 进程是否挂起直到通信恢复,或者您是否必须login并重新启动每个系统才能重新获得控制权?
  2. 在机架中出现交换机或电源故障时,您的客户是否会晾干? 如果是这样的话,可以考虑把你的节点分散到整个数据中心,或者让每个节点都进入两个交换机并绑定接口。 一些开关魔法也需要发生,所以find一个networkingpipe理员。

向前思考几个步骤,以及在任何主要组件(包括networking或电力电缆)的故障下系统将执行什么操作。

现在你已经准备好了一个集群文件系统和所有你以前不知道的新的术语。

我们使用NetApp机箱中的NFS或FC LUN中的OCFS2卷,我不知道它们是否是最好的select,但是它们已经为我们工作了多年。 当然,两个performance都非常好,尽pipe我个人更喜欢OCFS2而不是FC LUN选项,因为我更像是一个存储家伙。 我想这真的归结于你已经拥有的舒适的共享存储基础设施。