Как хранить изображения в вашей файловой системе - PullRequest
29 голосов
/ 10 октября 2008

В настоящее время у меня есть изображения (макс. 6 МБ), хранящиеся в виде 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
   - imageStorage
     - f/347e/013b
       - f347e013bc04251cf985f7ad0daa987d
         - 0
           - album1_10
             - picture_1.jpeg
         - 1
           - album1_1
             - picture_2.jpeg
             - picture_3.jpeg
           - album1_11
             - picture_n.jpeg
         - n
           - album1_n

Я думаю, что я буду использовать идентификатор альбома, разделенный сзади (мне нравится эта идея!), Чтобы уменьшить количество альбомов в каталоге (хотя это не будет необходимо для большинства пользователей).

Спасибо!

Ответы [ 3 ]

23 голосов
/ 10 октября 2008

Просто разделите свой идентификатор пользователя сзади. например,

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

Что касается резервного копирования, вы можете использовать MySQL Replication и сделать резервную копию ведомого базы данных, чтобы избежать проблем (например, блокировок) при резервном копировании.

7 голосов
/ 11 октября 2008

Одна вещь о распределении имен файлов в разные каталоги. Если вы подумаете о разделении имен файлов md5 на разные подкаталоги (что, как правило, хорошая идея), я бы предложил сохранить полный хэш как имя файла и дублировать первые несколько символов как имена каталогов , Таким образом вы упростите идентификацию файлов, например, когда вам нужно переместить каталоги.

, например

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

если ваши имена файлов распределены неравномерно (не хэш), попробуйте выбрать метод разделения, который получит равномерное распределение, например, последние символы, если это инкрементный идентификатор пользователя

3 голосов
/ 17 февраля 2014

Я использую эту стратегию с уникальным идентификатором изображения

  • обратная строка
  • обнулить его начальным нулем, если нечетное число цифр
  • разбить строку на двухзначные подстроки
  • построить путь как показано ниже

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

Этот метод гарантирует, что каждая папка содержит до 100 изображений и 100 подпапок, а нагрузка равномерно распределяется между самыми левыми папками.

Кроме того, для доступа к файлу нужен только идентификатор изображения, не нужно читать таблицу изображений, содержащую другие метаданные. Пользовательские данные не хранятся близко друг к другу, и отношение ID-Path предсказуемо, оно зависит от ваших потребностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...