【问题标题】:How to store many images on a webserver? [closed]如何在网络服务器上存储许多图像? [关闭]
【发布时间】:2012-12-14 19:13:38
【问题描述】:

我计划在网络服务器上存储许多图像 (>100,000)。

文件名将是 ex。

324-2012-07-25-143544.jpg

文件名是这样构建的:

用户ID-年-月-日-HHMMSS.jpg

这个文件名将被保存在一个mysql数据库中并且会被读取并且你知道文件路径的文件名->

images/userid/year/month/day/userid-year-month-day-HHMMSS.jpg

所以在这个例子中是

images/324/2012/07/25/324-2012-07-25-143544.jpg

将所有内容保存在基本文件夹 /images 中时可能出现的任何性能问题?

谢谢!

【问题讨论】:

  • 如果您想使用日期部分作为目录结构,请确保将它们唯一地存储在数据库中 - 如果它将用于绝对文件访问,则此很好。如果它们可能会以编程方式使用(使用图像列出有效年份),则将它们存储为单独的字段。没有什么比尝试将一个 Dd 字段拆分为多个进行处理更糟糕的了……

标签: mysql filesystems storage


【解决方案1】:

分片文件,就像您正在做的那样,是避免在一个目录中有许多文件时出现性能问题的好方法:在这种方法中,您可以确保在任何给定的目录中只有少数条目(目录或文件)目录。如果需要,也可以轻松拆分多个卷 - 您只需将一些高级目录挂载到不同的位置。

不过,您应该考虑几件事情。

身份

如果您打算永久存储这些图像,您可能希望根据 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。您必须预测您的网站将在接下来的一段时间内获得的流量。不过不要发疯,想想在某个时候你可能每天会拥有数百万用户。重新分片并非不可能,但这很痛苦。预测未来几年的增长并处理好。如果你增长得更快并且因此不得不重新分片,那么,这是一个很好的解决问题。如果因为目录条目占用的空间多于图像而导致磁盘空间不足,那么这是一个愚蠢的问题。

【讨论】:

    【解决方案2】:

    我会这样做:

    • 只需为您存储的每张图片使用一个唯一的 ID(只是一个数字,如表 ID 字段)
    • 检查您的网络服务器上一个目录中的最大文件数是多少
    • 将id除以这个数字得到目录名
    • 将图像(带编号)存储在此目录中

    例如图像编号1存储为/0/1.jpg,图像编号1234567存储为/123/1234567.jpg(假设您可以在一个目录中存储10000个文件)。

    最简单、最少的噪音并优化目录中的文件数量(而不是浪费大量半满的目录)。

    如果您真的要存储 很多 图像,请使用 2 个子目录!比如/0/0/1.jpg/1/12345/123456789.jpg

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 2016-01-09
      相关资源
      最近更新 更多