Сообщение Re: Хранение файлов пользователей на файловой системе от 26.12.2019 19:38
Изменено 26.12.2019 19:39 Somescout
Re: Хранение файлов пользователей на файловой системе
Здравствуйте, halo, Вы писали:
H>/blobs/$HASHED_FILE
H>/files/$TYPE/$TENANT_ID/$HASHED_FILENAME
H>где:
H>* $HASHED_FILE -- имя файла, составляемое из хеша содержимого этого же файла в виде строки в base16;
H>* $HASHED_FILENAME -- символическая ссылка в виде хеша имени оригинального файла в base16, узывающая на блоб из директории /blobs.
H>Все три (на самом деле, нет: кроме второй) вышеуказанные проблемы в обозримом будущем покрываются таким подходом. Так, пока невозможный в этой системе /files/backgrounds/162/пустой-файл.bin мог бы быть представлен на файловой системе следующим образом (пускай хеш-функцией будет SHA-1):
H>/blobs/da/39a3ee5e6b4b0d3255bfef95601890afd80709 -- пустой файл
H>/files/backgrounds/162/05/562e534a175beadd7c5c5504af329b02e2ffbb -- символическая ссылка на /blobs/da/39a3ee...709
Как будет вести себя система, если два пользователя загрузят одинаковые файлы? Или один пользователь загрузит одинаковые файлы с разными именами? В частности как будет происходить удаление, ведь для этого нужно отслеживать число ссылок на файлы.
Если не планируется большой выигрыш от дедубликации файлов (оценить это можно уже сейчас), я бы убрал отдельное хранение блобов.
Если оно всё-же нужно, то стоит внести дополнительный слой — экземпляры файлов с хардлинками на исходник (примерно так делает dovecot):
/blobs/$HASHED_FILE-$TENANT_ID -> (hardlink to) -> /blobs/hashes/$HASHED_FILE
/files/$TYPE/$TENANT_ID/$HASHED_FILENAME -> (softlink to) -> /blobs/$HASHED_FILE-$TENANT_ID
Тогда алгоритм удаления будет таким: снести ссылку в каталоге пользователя, хардлинк по этой ссылке и если больше хардлинков не осталось, снести сам блоб.
H>/blobs/$HASHED_FILE
H>/files/$TYPE/$TENANT_ID/$HASHED_FILENAME
H>где:
H>* $HASHED_FILE -- имя файла, составляемое из хеша содержимого этого же файла в виде строки в base16;
H>* $HASHED_FILENAME -- символическая ссылка в виде хеша имени оригинального файла в base16, узывающая на блоб из директории /blobs.
H>
H>/blobs/da/39a3ee5e6b4b0d3255bfef95601890afd80709 -- пустой файл
H>/files/backgrounds/162/05/562e534a175beadd7c5c5504af329b02e2ffbb -- символическая ссылка на /blobs/da/39a3ee...709
Как будет вести себя система, если два пользователя загрузят одинаковые файлы? Или один пользователь загрузит одинаковые файлы с разными именами? В частности как будет происходить удаление, ведь для этого нужно отслеживать число ссылок на файлы.
Если не планируется большой выигрыш от дедубликации файлов (оценить это можно уже сейчас), я бы убрал отдельное хранение блобов.
Если оно всё-же нужно, то стоит внести дополнительный слой — экземпляры файлов с хардлинками на исходник (примерно так делает dovecot):
/blobs/$HASHED_FILE-$TENANT_ID -> (hardlink to) -> /blobs/hashes/$HASHED_FILE
/files/$TYPE/$TENANT_ID/$HASHED_FILENAME -> (softlink to) -> /blobs/$HASHED_FILE-$TENANT_ID
Тогда алгоритм удаления будет таким: снести ссылку в каталоге пользователя, хардлинк по этой ссылке и если больше хардлинков не осталось, снести сам блоб.
Re: Хранение файлов пользователей на файловой системе
Здравствуйте, halo, Вы писали:
H>/blobs/$HASHED_FILE
H>/files/$TYPE/$TENANT_ID/$HASHED_FILENAME
H>где:
H>* $HASHED_FILE -- имя файла, составляемое из хеша содержимого этого же файла в виде строки в base16;
H>* $HASHED_FILENAME -- символическая ссылка в виде хеша имени оригинального файла в base16, узывающая на блоб из директории /blobs.
H>Все три (на самом деле, нет: кроме второй) вышеуказанные проблемы в обозримом будущем покрываются таким подходом. Так, пока невозможный в этой системе /files/backgrounds/162/пустой-файл.bin мог бы быть представлен на файловой системе следующим образом (пускай хеш-функцией будет SHA-1):
H>/blobs/da/39a3ee5e6b4b0d3255bfef95601890afd80709 -- пустой файл
H>/files/backgrounds/162/05/562e534a175beadd7c5c5504af329b02e2ffbb -- символическая ссылка на /blobs/da/39a3ee...709
Как будет вести себя система, если два пользователя загрузят одинаковые файлы? Или один пользователь загрузит одинаковые файлы с разными именами? В частности как будет происходить удаление, ведь для этого нужно отслеживать число ссылок на файлы.
Если не планируется большой выигрыш от дедубликации файлов (оценить это можно уже сейчас), я бы убрал отдельное хранение блобов.
Если оно всё-же нужно, то стоит внести дополнительный слой — экземпляры файлов с хардлинками на исходник (примерно так делает dovecot):
/blobs/$HASHED_FILE-$TENANT_ID -> (hardlink to) -> /blobs/hashes/$HASHED_FILE
/files/$TYPE/$TENANT_ID/$HASHED_FILENAME -> (softlink to) -> /blobs/$HASHED_FILE-$TENANT_ID
Тогда алгоритм удаления будет таким: снести ссылку в каталоге пользователя, хардлинк по этой ссылке и если больше хардлинков не осталось, снести сам блоб (и как-то избежать racing condition).
H>/blobs/$HASHED_FILE
H>/files/$TYPE/$TENANT_ID/$HASHED_FILENAME
H>где:
H>* $HASHED_FILE -- имя файла, составляемое из хеша содержимого этого же файла в виде строки в base16;
H>* $HASHED_FILENAME -- символическая ссылка в виде хеша имени оригинального файла в base16, узывающая на блоб из директории /blobs.
H>
H>/blobs/da/39a3ee5e6b4b0d3255bfef95601890afd80709 -- пустой файл
H>/files/backgrounds/162/05/562e534a175beadd7c5c5504af329b02e2ffbb -- символическая ссылка на /blobs/da/39a3ee...709
Как будет вести себя система, если два пользователя загрузят одинаковые файлы? Или один пользователь загрузит одинаковые файлы с разными именами? В частности как будет происходить удаление, ведь для этого нужно отслеживать число ссылок на файлы.
Если не планируется большой выигрыш от дедубликации файлов (оценить это можно уже сейчас), я бы убрал отдельное хранение блобов.
Если оно всё-же нужно, то стоит внести дополнительный слой — экземпляры файлов с хардлинками на исходник (примерно так делает dovecot):
/blobs/$HASHED_FILE-$TENANT_ID -> (hardlink to) -> /blobs/hashes/$HASHED_FILE
/files/$TYPE/$TENANT_ID/$HASHED_FILENAME -> (softlink to) -> /blobs/$HASHED_FILE-$TENANT_ID
Тогда алгоритм удаления будет таким: снести ссылку в каталоге пользователя, хардлинк по этой ссылке и если больше хардлинков не осталось, снести сам блоб (и как-то избежать racing condition).