【问题标题】:How to store images in your filesystem如何在文件系统中存储图像
【发布时间】:2010-09-16 13:13:37
【问题描述】:

目前,我已将图像(最大 6MB)作为 BLOB 存储在 InnoDB 表中。 随着数据量的增长,每晚备份的速度越来越慢,影响了正常性能。

所以,二进制数据需要进入文件系统。 (指向文件的指针将保存在数据库中。)

数据具有树状关系:

- main site
  - user_0
    - album_0
    - album_1
    - album_n
  - user_1
  - user_n
etc...

现在我希望数据通过目录结构均匀分布。我应该如何做到这一点?

我想我可以尝试MD5('userId, albumId, imageId'); 并将结果字符串切分以获得我的目录路径:

/var/imageStorage/f/347e/013b/c042/51cf/985f7ad0daa987d.jpeg

这将允许我将第一个字符映射到服务器并将目录结构均匀地分布在多个服务器上。

然而,这不会按用户组织图像,可能会将 1 个相册的图像分布在多个服务器上。

我的问题是:
以平衡的方式将图像数据存储在文件系统中,同时将用户/相册数据保存在一起的最佳方法是什么?

我的想法是否正确?还是这完全是错误的做事方式?

更新:
我将使用md5(user_id) 字符串切片,以便在最高级别进行拆分。 然后将所有用户数据放在同一个桶中。这将确保数据的均匀分布,同时将用户数据存储在一起。

/var - 图像存储 - f/347e/013b - f347e013bc04251cf985f7ad0daa987d - 0 - 专辑 1_10 - 图片_1.jpeg - 1 - 专辑 1_1 - 图片_2.jpeg - 图片_3.jpeg - 专辑 1_11 - 图片_n.jpeg -n - 专辑 1_n

我想我会使用从后面拆分的 albumId(我喜欢这个主意!)以减少每个目录的专辑数量(尽管对于大多数用户来说不是必需的)。

谢谢!

【问题讨论】:

  • 您是否考虑过对数据库进行增量备份?
  • 啊 - 我建议将“均匀分布”编辑为“均匀分布”。我现在意识到您的目标是尝试平均每个文件系统文件夹的图片数量。
  • 我认为增量备份只能暂时解决问题。

标签: database data-structures blob file-organization


【解决方案1】:

只需从后面拆分您的用户 ID。例如

UserID = 6435624 
Path = /images/24/56/6435624

至于备份,您可以使用 MySQL Replication 并备份从站 数据库以避免备份时出现问题(例如锁定)。

【讨论】:

  • 是的,这就是我要说的。颠倒数字 ID 中的数字,它更有可能均匀分布,类似于循环。
  • @Bill:我不明白。为什么反转用户 ID 更有可能均匀分布?是因为老用户有更多时间上传更多图片吗?
  • @Alix:假设 75 个用户 ID 以单调递增的方式分配。 1 的数字从 0 到 9 循环,并重复。平均而言,每个数字出现的次数相等。 10 的数字也循环,但只有 0 到 7;它永远不会达到 8 或 9。而且 100 的数字只是 0——根本没有分布。所以最好使用userid的低位作为上级目录的索引。
  • @wilmoore:取决于您使用的哈希算法,但可能您正在使用 md5 或其他东西,其中任何数字都可能与另一个数字一样均匀分布。因此,在这种情况下,为顶级目录选择最右边的数字没有任何好处。通过选择散列字符串的最左边的数字,您同样可能均匀分布文件。
  • 什么是用户的id小(比如5或19)?您会将图像存储在哪里?
【解决方案2】:

关于将文件名分配到不同目录的一件事,如果您考虑将 md5 文件名拆分为不同的子目录(这通常是一个好主意),我建议将完整的哈希保留为文件名并将前几个字符复制为目录名.这样,您将更容易识别文件,例如当您必须移动目录时。

例如

abcdefgh.jpg -> a/ab/abc/abcdefgh.jpg

如果您的文件名分布不均匀(不是散列),请尝试选择一种分布均匀的拆分方法,例如如果是递增的用户 ID,则为最后一个字符

【讨论】:

    【解决方案3】:

    我正在使用这个策略给定一个唯一的图片 ID

    • 反转字符串
    • 如果有奇数位数,则用前导零填充它
    • 将字符串分块为两位数的子字符串
    • 如下构建路径

      17 >> 71 >> /71.jpg
      163 >> 0361 >> /03/61.jpg
      6978 >> 8796 >> /87/96.jpg    
      1687941 >> 01497861 >> /01/49/78/61.jpg
      

    此方法可确保每个文件夹最多包含 100 张图片和 100 个子文件夹,并且负载平均分布在最左侧的文件夹之间。

    而且,您只需要图片的ID即可到达文件,无需读取包含其他元数据的图片表。 用户数据确实不会紧密存储在一起,ID-Path 关系是可预测的,这取决于您的需求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-15
      • 2013-05-04
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      • 2012-12-02
      相关资源
      最近更新 更多