分片文件,就像您正在做的那样,是避免在一个目录中有许多文件时出现性能问题的好方法:在这种方法中,您可以确保在任何给定的目录中只有少数条目(目录或文件)目录。如果需要,也可以轻松拆分多个卷 - 您只需将一些高级目录挂载到不同的位置。
不过,您应该考虑几件事情。
身份
如果您打算永久存储这些图像,您可能希望根据 id 进行分片。这在数据库方面更容易处理(出于同样的原因,我们在数据库设计中使用任意主键)。
就像@Veger 建议的那样:imageid 123456 变为 /12/1234/123456.jpg。
安全
不过,使用日期、用户 ID 或自动递增数字可能会带来安全风险,因为它们相对容易猜测,因此很容易获取所有图像。
此外,如果用户没有理由知道上传日期,则在 URL 中包含日期可能会泄露信息。
如果您使用的是非常难以猜测的密钥,则它可以提供一定程度的安全性,防止信息泄露。例如,您可以使用 GUID:图像 ID 6f33395e-eda8-4486-8b8e-51ea0f91751b 存储为 /6/6f33/6f33395e/6f33395e-eda8-4486-8b8e-51ea0f91751b.jpg。
有大量的 GUID(它是 128 位),因此有人可能需要数百万年才能收获所有内容(即使您不采取任何额外的步骤,例如限制每个 IP 每小时的连接数等)。
易失性图像
如果您的图像是不稳定的——也就是说,它们会在一段时间后过期——那么实际上最好根据日期结构进行分片,例如/2012/12/14/2012-12-14-hhmmss-userid.jpg,或者您可以将其与 guid 结合使用获取/2012/12/14/6f/6f33395e-eda8-4486-8b8e-51ea0f91751b.jpg。
如果您想删除 2011 年的所有文件,只需 rm -rf 2011。将其用于日志文件的一个很好的例子。
您必须记住,这仅对 非常 大量图像才有意义,因为您可以在数据库中进行查询以根据日期查找过时的图像,然后删除他们一个接一个。
分片的粒度
对您计划最终存储的图像越多,使用更高粒度的分片,但请记住,如果您太细化,您将丢失大量的开销磁盘空间到目录条目。
目标是将每个目录的条目数保持在文件系统可以处理的范围内;好的经验法则似乎是最大约 10,000。您必须预测您的网站将在接下来的一段时间内获得的流量。不过不要发疯,想想在某个时候你可能每天会拥有数百万用户。重新分片并非不可能,但这很痛苦。预测未来几年的增长并处理好。如果你增长得更快并且因此不得不重新分片,那么,这是一个很好的解决问题。如果因为目录条目占用的空间多于图像而导致磁盘空间不足,那么这是一个愚蠢的问题。