Недавно для меня стало открытием, что некоторые компании, хранящие файлы юзеров, разбивают каждый файл на чанки определенного размера, ищет такие же в своей базе, если такого нет, то сохраняет, если такой есть, то отбрасывает. (чтобы не дублировать информацию). В итоге одна запись по загруженным файлам в БД имеет список ссылок на все чанки, которые все вместе создают тот самый файл, который юзер загружал.
Тогда у меня возник вопрос, который хотел задать понимающим в этом людям. Как эти чанки склеиваются перед выдачей юзеру? Ведь по логике запрос от пользователя выглядит так: запрос в БД по запрашиваемому файлу, получаем список ссылок на все чанки по кластеру/серверам и как то выдаем файл(ы). Как происходит склеивание или выдача? И происходит ли? Один сервер копируют чанки к себе и выдают склеенными?
Благодарю за время и ответ
Речь, судя по всему, о дедупликации данных.
Каждый файл можно разбить на N равных отрезков данных и 1 остаточной длины. Если пронумеровать эти отрезки последовательно, сохранив в БД номера их последовательностей с их полученных хэшами и файлами-отрезками, именованными хэшами, то для восстановления содержимого файла будет достаточно найти в БД все принадлежащие заданному файлу куски данных, считывая их соответствующие данные из файлов-отрезков. Не важно на каких узлах хранилищ хранятся эти файлы-отрезки, а важно то что есть лишь 1 сервер, склеивающий в 1 целый файл.
Дедупликация подходит в случаях частого повторения кусков контента. Допустим, много повторений может найтись среди архивов документов (дубликаты целых файлов или некоторых частей). Порой, дедупликация может дать хороший выигрыш когда одни и те же видео файлы находятся в разных уголках архива. Хотя шансов найти дубликаты кусков среди разных видео файлов очень малы.
Роман, благодарю за развернутый ответ. Уверен, это внесет ясность для тех, кто, как и я, будет искать ответ на этот вопрос. Насколько я понял, что такой способ хранения данных используется для не часто запрашиваемых файлов, ведь даже собрать все отрезки в рамках одного дата-центра далеко не секундное дело. Например, если разбивать файл по 64mb, вес которого 1Gb, займет десятки секунд.
Как вариант можно часто запрашиваемые файлы сохранять в кэш) и отдавать сразу, но если сервис слишком большой, то кэш становится ресурсопожирающим.
Роман, вы знаете как соблюдается приемлемая скорость выдачи файла при сборке файла? Очень интересно
Если же нужно отдавать один и тот же статический контент разным клиентам, то в этом случае подойдёт какой-нибудь сервис CDN (CloudFlare, Amazon CloudFront и т.д.) или же Varnish/Nginx своими силами.