首页 > 解决方案 > 存储许多缩略图的有效方法

问题描述

所以目前我将所有缩略图存储在一个目录中,文件名作为完整大小图像的完整路径的 md5 哈希。但是我在这里读到,当目录达到数千个文件时,这会导致问题。它们将被 linux 文件系统定位得越来越慢。

考虑到我只能通过原始图像路径找到缩略图,我有什么选择?日期将是最好的选择,例如year/month/day/md5_hash.jpg,但这需要我从某个地方存储和读取日期,因此需要添加一些额外的步骤。

我正在考虑拆分 md5,例如前两个字符 = 子文件夹名称,其余 = 文件名。那会给我 15*15 个子文件夹,但我想听听更好的选择,谢谢!


我刚刚得到的另一个想法:创建一个单独的服务器来组织缩略图。服务器将跟踪缩略图计数并在达到某个限制时创建额外的文件夹,并在删除缩略图时重新使用旧文件夹。缺点是我需要一个单独的数据库来将哈希映射到缩略图路径:(

标签: imageserverthumbnailsdirectory-structureorganization

解决方案


我们使用的是 FreeBSD(文件系统 UFS),而不是 Linux,所以一些细节可能会有所不同。

背景

我们在这个系统上有数百万个文件,需要尽快从网站上提供服务,以供个人访问。我们一直使用的系统在过去 16 年中运行良好。

服务器 1(名为:Tom)的主要用户网站具有相当标准的 Apache 设置和 MySQL 数据库。没有什么特别的。

服务器 2(命名为:Jerry)是存储用户文件的地方,并且已针对这些小文件的快速交付进行了定制。

Jerry 的硬盘驱动器在创建过程中进行了调整,以确保我们不会用完 inode - 在创建数百万个小文件时需要考虑这一点。

Jerry 的 Apache 配置针对非常短的连接时间和每个连接的单个文件访问进行了调整。如果没有这些调整,您将有开放的连接坐在那里浪费资源。这个 Apache 配置根本不适合主系统 (Tom),并且会导致许多问题。

当您提供“缩略图”而不是单个请求时,您可能需要稍微不同的结构。老实说,我对您的需求知之甚少,无法真正建议最适合您的网络服务器配置的方法。

从历史上看,我们在多个服务器上使用多个 SCSI 驱动器。目前,我们有一台具有 300MB/s 驱动器的服务器。该业务已经下降了一段时间(感谢 Facebook),但我们仍然每天处理超过 200 万个文件请求。在我们的高峰期,每天大约有 1000 万。

我们的结构(一个可能的答案)

Jerry 上的所有内容都针对小文件传输进行了调整,仅此而已。

Jerry 是一个网络服务器,但我们更像是一个数据库。所有不需要的都被删除。

每个文件都有一个 4 个字符的 ID。ID 是字母数字 (0-9,az,AZ)。这为您提供了 61*61*61*61 组合(或 13,845,841 个 ID)。

我们也有多个域,因此每个域最多有 13,845,841 个 ID。在 Facebook 出现之前,我们已经非常接近这个限制的流行“域”,我们已经准备好允许 5 个字符 ID 的计划,但最终不需要它。

如果您知道文件的完整路径,文件系统查找会非常快。如果您需要扫描文件匹配,它只会很慢。我们充分利用了这一点。

每个 4 字符 id 是一系列目录。例如,aBc9/path/to/a/B/c/9

仅 4 个目录中的唯一 ID 数量非常多。每个目录最多有 61 个子目录。在不淹没文件系统索引的情况下创建快速查找。

位于目录./9(ID 中的最后一个目录)中的是必要的元数据文件和原始数据文件。元数据是一个已知的文件名,数据文件也是如此。我们在每个文件夹中还有其他已知文件,但您明白了。

如果用户正在更新或检查元数据,则 ID 是已知的,因此会返回对元数据的请求。

如果再次请求数据文件,则 ID 是已知的,因此返回数据。不执行扫描或复杂检查。

如果 ID 无效,则返回无效结果。

没有什么复杂的,一切都是为了速度。

我们的问题

当您谈论数百万个小文件时,可能会用完 inode。请务必从一开始就将此因素考虑到为服务器创建磁盘。未雨绸缪。

我们禁用和/或编辑了一些 FreeBSD 系统检查。维护 cronjobs 不是为有这么多文件的系统设计的。

Apache 配置需要经过反复试验才能使其恰到好处。当你得到它时,解脱是巨大的。Apachemod_status非常有帮助。

首先要做的是禁用所有日志文件。接下来,禁用所有内容并仅重新添加您需要的内容。

用于传递(和保存)元数据和原始数据的代码也非常优化。忘记代码库。多年来,每一行代码都经过检查和重新检查,以确保速度。

结论

如果您确实有很多缩略图,请拆分系统。从为此优化的专用服务器提供小文件。保持对主系统进行调整以实现更标准的使用。

只要您不需要扫描文件,基于目录的 ID 系统(即随机的 4 个字符或 MD5 的一部分)可以很快。

您的基本操作系统需要进行调整,以便系统检查不会占用您的系统资源。

禁用网络服务器日志文件创建。您几乎永远不需要它,它会在文件系统上造成瓶颈。如果您需要统计信息,您可以从mod_status.

老实说,关于您的个人案例和需求的信息还不够多。我不确定我的任何个人经历是否会有所帮助。

祝你好运!


推荐阅读