在一个大约有5万个用户的社交网络网站中,哪种类型的文件系统适合存储图片?
我的意思是如何创建目录?存储图片的文件夹层次结构应该是什么样的(例如按相册或按用户)。
我知道Facebook现在使用的是Haystack,但在此之前它使用简单的NFS。NFS的层次结构是什么?
在一个大约有5万个用户的社交网络网站中,哪种类型的文件系统适合存储图片?
我的意思是如何创建目录?存储图片的文件夹层次结构应该是什么样的(例如按相册或按用户)。
我知道Facebook现在使用的是Haystack,但在此之前它使用简单的NFS。NFS的层次结构是什么?
从文件系统的角度来看,没有一种“最佳”方法来处理这个问题--例如,NFS除了您在写入照片的NFS共享中创建的目录之外,没有任何设置的“层次结构”。
每种底层文件系统类型(不是NFS,我指的是您将使用NFS来提供文件的服务器端文件系统)都具有其自己独特的性能特征,但可能所有这些文件系统都有一个相对快速的(O(1)
或至少O(log(n))
)查找目录中的文件的方法。因此,您可以基本上使用任何目录结构并获得“不太糟糕”的性能。因此,您应该根据什么使编写和维护应用程序最容易的原则做出决策,特别是因为您现在只有相对较少的用户。
话虽如此,如果我想解决这个问题并想使用相对简单的解决方案,我可能会给每张照片一个长的十六进制随机数(例如b16eabce1f694f9bb754f3d84ba4b73e
)或使用照片的校验和(例如运行md5
/md5sum
命令后的输出,例如5983392e6eaaf5fb7d7ec95357cf0480
),然后将其拆分为“目录”前缀和“文件名”后缀,例如5983392e6/eaaf5fb7d7ec95357cf0480.jpg
。选择在数字中创建拆分的深度将确定您将在每个目录中结束多少个文件。然后,我会将该数字/校验和存储为数据库表中的一列,以跟踪已上传的照片。
5983392e6/eaaf5fb7d7ec95357cf0480.jpg
切换到 5983392e6/eaaf5fb7/d7ec95357cf0480.jpg
。此外,如果仅使用单个NFS服务器无法处理负载,则可以使用前缀将照片分布在多个NFS服务器上,而不是简单地跨多个目录。