Создание нескольких файловых серверов для файлового хостинга или файлообменника
- Подробности
- Категория: PHP, MySQL, Java
- Опубликовано 15.01.2013 19:44
Нижеописанный текст может быть непонятем многим либо в силу того что я непонятно пишу либо в силу трудности понимания происходящего.
В данной статье не будут рассмотрены сами скрипты, а лишь будет указан принцип создания файлового хостинга с несколькими файловыми серверами.
В своё время я очень занялся идеей как создать несколько серверов где будут храниться файлы для файлообменника. Причиной тому была возикшая проблема - интернет канал сервера был слишком загружен и соответственно скорость скачивания файлов была прямо-таки сказать не очень. Именно эта ситуация заставила меня искать пути решения проблемы.
Много часов я думал как сделать лучше, было много вариантов, безде были плюсы и минусы, но решил сделать всё в итоге так:
Файловый хостинг с несколькими серверами.
Схематичный рисунок:
В данном представлении многосерверного файлообменника всё состоит так:
База данных MySQL
Имеется всего 1 БД файлов, которая расположена на сервере сайта файлового хостинга. При скачивании все файловые сервера подключаются к ней удалённо. В одной из ячеек таблицы БД в которую записываются данные о загруженном файле, так же записывается сервер на котором он расположен, например "s1". Как вы получаете к нему доступ??? А вот как. Все ссылки на файлы, независимо от того на какой они сервер загружены, выглядят вида aaa.ru/file/blablabla, а не s1.aaa.ru/file/blablabla или s2.aaa.ru/file/blablabla, где blablabla - уникальное имя файла.
Допустим посетитель скачивает файл, расположенный на файловом сервере 2. Он переходит по ссылке aaa.ru/file/blablabla, на открывшейся странице появляется информация о скачиваемом файле и ещё допустим каптча, для большей защиты. Предполагается что после верного ввода каптчи должно начаться скачивание файла. Это осуществится тем, что мы опираясь на уникальное имя файла - blablabla выбираем из БД всю строчку и все данные о файле, в том числе и сервер на который он загружен. После чего с помощью PHP мы подставляем имя сервера (s1 или s2) в ссылку на которую нас перенаправит каптча в случае верного ввода ( например ссылка получится http://s1.aaa.ru/blablabla/
Сайт
На сервере где стоит сайт с БД файлов, сами файлы не хранятся, в целях улучшения производительности сайта. Хранятся лишь страницы с каптчей для безопасного доступа к скачиванию и самое главное тут же присутствует и страница с формой для загрузки файлов (!). Но маленький ньюанс в настройке формы, вот кусочек HTML кода формы:
<form enctype="multipart/form-data" action="
Главное обратите внимание на то что файл данная форма передаёт не на один из локальных обработчиков как это обычно делают, а на один из наших файловых серверов, о настройке которого будет опять-таки ниже на странице. В данном случае файл отправляется на Первый файловый сервер, по мере заполнения его файлами, вы можете следить за средней коростью скачивания файлов, и когда она начнёт существенно снижаться, меняйте в форме загрузки файлов action="http://s1.aaa.ru/upload.php" на action="http://s2.aaa.ru/upload.php", предварительно настроив Второй файловый сервер для работы.
Файловые сервера
Ну и вот самое весёлое. Осталось последнее в схеме настройка файлового сервера. Как, надеюсь, стало уже понятно на файловых серверах хранятся файлы, так же именно на них расположен обработчик загрузки файлов с формы сайта нашего файлового хостинга и так же здесь у нас скрипт который выдаёт файл для скачивания. Но обо всём по порядку. Обработчик загрузки файлов представляет собой обычный PHP код, который записывает в базу данные о загружаемом файле, в том числе сервер на который он загружается (s2.aaa.ru запишет в строку с файлом в ячейке о сервере соответственно s2) и также обработчик копирует загружаемый файл к себе на файловый сервер.
Скачивание файлов происходит так: например, пользователь, как описывалось выше вводит верно каптчу и PHP его пересылает на адрес s1.aaa.ru/blablabla Поскольку blablabla - наш идентификатор файла, по нему мы находим все данные о файле в БД MySQL и PHP скрипт отдаёт пользователю файл.
Стоит также отметить, что файловый сервер НЕ ИМЕЕТ собственной БД, а поделючается к БД сайта файлового хостинга ( Т.е при подключении вместо привычного localhost используем IP адрес сервера на котором расположен сайт файлового хостинга.
Вероятно если не всё, то многое непонятно, но старался как мог.