[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Загрузка статики на удаленные сервера
Santehnick
Есть социальная сеть. Есть много пользователей, которые заливают много статического контента (фото/видео/аудио). Хранить это локально на том же сервере нельзя, объем памяти жестких дисков быстро исчерпается. Докупаем несколько физических серверов под эти нужды. Теперь встает задача программного уровня. Пишем загрузчик файлов, например изображений для начала. Когда пользователь выбрал в форме загрузки файлов изображения, они с помощью ajax запроса отсылаются на обработку php-скрипту, когда php-скрипт обработал фотографию (поменял ширину/высоту/обрезал и т.п.), он пишет новое изображение в файл с помощью функции imagejpeg и ей подобных пока что локально на этом же сервере, чтобы дальше загрузить это изображение на ftp-сервер и информацию по файлу в базу данных, а после этого происходит уничтожение локальной копии файла. Хорошо, тут я и предлагаю, всем вместе подумать. Очевидно у нас может быть много серверов со статикой, также очевидно, что в базе данных, нужно хранить номер сервера где хранится этот файл, чтобы потом собрать ссылку до этого файла. Теперь осталось всего ничего написать программный компонент, который будет возвращать скрипту-загрузчику файлов, соединение с тем фтп-сервером на который будет заливаться этот файл.

Я думаю, что этот компонент должен быть реализован с помощью шаблона проектирования singleton, это раз. Второе, я думаю, что этот компонент должен по каким-то критериям, выбрать фтп-сервер и попробовать с ним установить соединение и вернуть его, если этого не получается сделать, то повторить процедуру и суметь избежать зацикливания. Третье, собственно определить, по каким критериям выбирать фтп-сервер, рандомно, round-robin (наверное нужно хранить номер последнего сервера, который обратывал запрос), по загруженности сервера? По какой формуле определять эту загруженность? Как удостоверится, что файлу точно хватит места на жестком диске? Четвертое, решить где хранить данные по фтп-серверам массивом в файле/sql/nosql еще где-то?

Как вы вообще видите реализацию такого компонента? А может вовсе не нужно такого делать и есть уже какие-то готовые решения? Пишите, буду рад.
Santehnick
Нашел решение. Вспомнил, что раньше натыкался на статьи о сетевых файловых системах, особо не вникал, читал через строку. И решение моментально пришло в голову, черт возьми, я в линукс могу примонтировать что угодно и работать с этим как с обычной локальной директорией. Нашел, что facebook в качестве такого решения использовал NFS-протокол. Поднял между двумя линуксовыми машинами сеть и настроил NFS как, как написано здесь.. Работает.

Дальше, можно поднять GluserFS, который как пишут, объединяет хранилища данных с разных серверов в единое. Это значит, что будет достаточно примонтировать хранилище к серверу где хранятся скрипты, а нгиксу сказать, из какой ему директории отдавать статику. В базе данных, достаточно хранить только имя файла в формате filename.jpg, а приложение научить строить линки динамически. В последствии можно будет вынести статику на отдельный домен/поддомен.

user posted image

Может будет полезно, если здесь кто-то интересуется хайлоад-проектами.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.