我一直在努力把越来越多的服务从NFS的依赖,我想知道其他人已经做了什么这个问题。 我知道那里有分布式文件系统,而且我也有使用其中之一的经验(mogilefs)。 我很想知道其他人使用NFS来移除,尤其是关于用户上传的内容。 特别是在networking域中,假设用户将内容上传到特定的Web服务器 – 您如何在群集中提供该内容? 我已经考虑到集群中其他机器的rsync,或者只是单个内容服务器,但很好奇别人为解决这个问题所做的工作。
我花了一年的时间试图(和失败)保持GFS以任何一种理智的方式运行之后,我都远离任何集群文件系统。 这是非常复杂的,并没有执行一个该死的负载下的价值。 这个评估通过关联扩展到了我所研究过的其他所有集群文件系统 – 移动部件的数量,缺乏有效的文档,以及整个Rube Goldberg装置的一般脆弱性,使得我的每一个部分都变成了“aieeeeeee!”。
另一方面,我获得了巨大的成功,使用更高级的,特定于应用程序的抽象概念 – 思考应用程序特别需要如何处理所涉及的数据,然后提供相应的方法。 Web应用程序中的数据实际上需要对应用程序中的数据进行完整的POSIX文件系统抽象是相当罕见的; 相反,它可以逃脱更多的function动词。 这是您的Web层和数据之间的访问层。
例如,拍照。 如果你有他们,你可能现在把它们推到你的NFS服务器上,networking服务器把它们拉出来,根据需要操作它们。 但是你们究竟对他们做了什么? 它们分别由一个唯一的键标识,存储它们(一个PUT请求),检索它们(一个GET请求),删除它们(一个DELETE请求),并且可能以不同的大小获得它们参数) – 嘿presto,有一个REST API。 不喜欢REST? SOAP,XML-RPC等等。 地狱,你甚至不必使用HTTP(虽然这是Web应用程序的自然select,因为您的GET请求可以直接发送到文件服务器)。 可以在存储服务器上处理任何resize的方法(并且caching这些大小调整),这节省了networking带宽,将处理它们所涉及的逻辑本地化,并使存储的图像接近处理它们的处理能力(更近==快==真棒)。
缩放这些存储系统通常比扩展文件服务器更容易。 他们不需要快速扩展,因为他们更有效率,但是当他们这样做的时候,确定一个分片algorithm并在几个关键的地方实现它是一件简单的事情。 我喜欢确定单个服务器可以支持多less(例如)图像的简单性,然后使用id / capacity来获取用于任何给定图像请求的服务器的数量。
这不是我第一次写这个答案。 看到这个问题稍有不同就这个问题。
数据库(像MongoDB这样的传统SQL或NoSQL)是解决这个问题的常用方法。
将需要共享的内容存储在数据库中,并从前端Web服务器中检索。
另一个相当常见的解决scheme是共享访问的SAN。
虽然我不是NFS的粉丝,但我会说,如果它为你工作,devise和实施得很好,而且相对无故障,你可以继续使用它几乎无限期。 离开它是好事,但是除了“Ew,这是NFS ! 不要为了摆脱而自杀
如果你正在寻找集群文件系统,有很多开放/封闭的解决scheme。 仅举几例: GFS , Lustre , GlusterFS , OCFS2 , Veritas Cluster FS 。 最后一个是商业企业FS,但是经验最好的。
编辑:忘了提及这些应该抵制在所有群集节点共享的SAN设备上。 这也是Veritas CFS的要求。