Хранение и распределение изображений. Naming strategy

German Malinovsky

Новичок
Мне нужно придумать стратегию хранения изображений на ФС. Потенциально в такой структуре, должна быть возможность хранить несколько миллионов изображений. Есть ограничение в максимум 1000 файлов/поддиректорий в любой директории.

Допустим, что хранение нужно 1млрд. изображений. Варианты решения, которые я знаю на текущий момент:

1. Делать уникальный идентификатор для каждого файла в 9 символов (напр. id файла в БД, что инкрементится). 9 символов потому что как раз туда влезет 1 млрдное число.

Если id в БД 1 то полный id будет 000000001 (недостающие позиции забиваем нулями). Т.к. нужно не больше 1000 файлов/подпапок, то разбиваем на 3 уровня подпапок по 1000 - /000/000/001/000000001.jpg

/ [1..999] / [1..999] / [1..999] / Полный_id.jpg

2. То же самое как в первом случае только вместо id используем md5 по id или каком-то уникальному генератору id для более равномерного распределения

3. / {YYYY} / {MM} / {DD} / {MD5}-{PX-SIZE}.jpg. Но такой способ не подходит если в день будет добавляться больше 1000 файлов.


Порыскав по сайтам, я нашел вот такие распределения по подпапкам:

a) http://storage1.example.com/images/b/b/3/e/bb3e4912d9174537fe5857e7826fef86/640x424.jpg

Это крупный и посещаемый новостной сайт и 4 уровня подпапок? 16^4 = 65536 файлов может хранить. Или я что-то упускаю?

б). http://cdn.example.com/photos/24/2482/248221/248221small.jpg

Сайт с большим user-generated контентом. Тут вообще выходит, что в папке 2482 может быть больше 1000 подпапок. Опять таки не понятно что они намудрили... Если это не реальные подпапки, а виртуальный путь, то зачем их делать через подпапки в URL, а не как http://cdn.example.com/photos/248221small.jpg


в) http://icdn.example.com/images/2015/05/19/16/2015051916 5830200/pic_a8abdf056bddd69fd599437406f95ad5.jpg
Я так понял это расширеный 3й вариант с дополнительной подпапкой в конкретной дате, в этом случае это 16-я подпапка

г) http://example.com/image/attachments/images/000/009/554/large/JaC2lI0pciMqgQ12tKosQg.jpg
Тут смешан цифровой id и 22 байтовый id (почему-то вместо одного используют два)


Кто сталкивался с проблемой распределения файлов на ФС и как решал?
Очень не хочется использовать разные GridFS, MogileFS и enterprise решения
 
Последнее редактирование:

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Хранить 1 миллиард файлов на одной файловой системе без шардинга? А Вы знаете толк в извращениях
 

German Malinovsky

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

Меня интересует именно равномерное распределение файлов.
 

AmdY

Пью пиво
Команда форума
в варианте а, ты посчитал количество возможных директорий, умножь ещё на количество файлов в каждой.

плюс ты пожешь не первые 4 буквы использовать, а хоть десяток, тонда будет 16^10 директорий.

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

такие задачи лучше отдавать на откуп спец сервисам, плата небольшая, а гемороя меньше.
 

fixxxer

К.О.
Партнер клуба
Для равномерного распределения - md5($name). Дальше str_split (по 2 символам вполне разумно) и столько уровней вложенности, сколько разумно для данного проекта. Обычно 2-3 достаточно.
 

WMix

герр M:)ller
Партнер клуба
Для равномерного распределения - md5($name). Дальше str_split (по 2 символам вполне разумно) и столько уровней вложенности, сколько разумно для данного проекта. Обычно 2-3 достаточно.
для равномерного я такую хрень придумал
PHP:
for($i=0; $i<100;$i++){
    $rev = strrev(str_pad($i, 2,"0", STR_PAD_LEFT));
    echo "id: ".$i."\tpath: ".substr($rev,0,1)."/".$i.".jpeg\n";
}
 

Adelf

Administrator
Команда форума
Не, а чем олимпиадники не угодили? Вот интересно))
Я не фиксер, но вижу ОЧЕНЬ небрежный хелп. И есть мнение, хоть ничем и не подтвержденное, что и к коду такое же отношение.
 

Фанат

oncle terrible
Команда форума
Для равномерного распределения - md5($name).
мне кажется, тут не сильно равномерное будет - много одинаковых префиксов. Плюс дубли ж. Микротайм если только присобачивать строковый.

Я вот делаю md5() от содержимого и перевожу в base36 для сокращения длины. Заодно и дубли, буде попадаются - отсекаются.
 

MiksIr

miksir@home:~$
для равномерного я такую хрень придумал
PHP:
for($i=0; $i<100;$i++){
    $rev = strrev(str_pad($i, 2,"0", STR_PAD_LEFT));
    echo "id: ".$i."\tpath: ".substr($rev,0,1)."/".$i.".jpeg\n";
}
substr($i,-1,1)
А в общем согласен, на больших числах файлов такое распределение выглядит достаточно равномерным.
 

German Malinovsky

Новичок
Про миллиард в примере это я погарячился, наверное. В общем на деле это пару миллионов картинок с сумарным размером до 1 Тб. Нашел Swift и Ceph. Может действительно взять что-то из них и не мучаться, а то мой подход устарел на лет так 5.
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
Про миллиард в примере это я погарячился, наверное. В общем на деле это пару миллионов картинок с сумарным размером до 1 Тб. Нашел Swift и Ceph. Может действительно взять что-то из них и не мучаться, а то мой подход устарел на лет так 5.
Ceph нормальный, главное - не вздумай трогать cephfs.

Насчет Swift... Конкретно насчет именно Swift не знаю, но вообще, Openstack хорош в одном случае: если ты - сотрудник Rackspace. :)
 

Breeze

goshogun
Команда форума
Партнер клуба
ceph хороший, есть тут место, где он юзается под qemu-kvm виртуалки (не proxmox :)

но он не означает, что 2кк файлов надо в одной дире хранить :)
и не стоит забывать, что даже пустая директория занимает место на диске
 
Сверху