Я проектирую сеть для загрузки файлов.
Конечная цель - создать API, который позволяет напрямую загружать файл на сервер хранения (без шлюза или чего-либо еще).Затем файл сохраняется и ссылается в базе данных.
Когда файл повторно запрашивается, в базе данных выбирается сервер, на котором в данный момент хранится файл, и выполняется перенаправление http (или API выдает действующий в настоящее время прямой URL-адрес).).
Фоновые задания позаботятся о желаемой репликации файла в целях обеспечения устойчивости / масштабирования.
Фоновые задания также перемещают файлы для обеспечения равномерной нагрузки на серверы в отношении использования диска и пропускной способности.
Рейда или чего-то еще нет.Каждый диск просто висит на сервере как JBOD.Вся репликация на уровне приложения.Если один из серверов выходит из строя, он просто помечается как поврежденный в базе данных, а фоновые задания выполняют репликацию из исправных источников до тех пор, пока снова не будет достигнута требуемая избыточность.
Системе также требуется точная статистика для мониторинга / балансировки иМэйби позже биллинг.
Итак, я подумал о следующей настройке.
Среда представляет собой классический стек Ubuntu, Apache2, PHP, MySql LAMP.
URL-адрес, который попадает на текущий сервер хранения, генерируется API (это не проблема). Классический веб-сайт PHP и база данных MySQL)
Теперь он получаетинтересно ...
Сервер хранения запускает Apache2, и PHP-скрипт перехватывает запрос.Параметры URL (хеш безопасного токена) проверяются.IP, метка времени и имя файла проверяются, поэтому запрос авторизуется.(Соединение с базой данных не требуется, только PHP-скрипт, который знает секретный токен).
PHP-скрипт устанавливает хадер файла для использования apache2 mod_xsendfile
Apache доставляет файл, переданный mod_xsendfile, и настроен на передачу журнала доступа в другой скрипт PHP
Apache запускает mod_logio, а журнал доступа находится в Комбинированный формат журнала ввода-вывода , но дополнительно добавляется с помощью переменной% D (время, затрачиваемое на обслуживание запроса, в микросекундах.) Для расчета узких мест скорости передачи данных в сети и прочем.
Журнал конвейерного доступа затем переходит к PHP-скрипту, который анализирует URL-адрес (первая папка является «зарезервированной», так же как хранилище Google или amazon s3, которому назначен один клиент. Таким образом, клиент известен) подсчитывает ввод/ вывод трафика и увеличение полей базы данных.Из соображений производительности я подумал о том, чтобы иметь ежедневные поля и обновлять их, как трафик = трафик + X, и, если ни одна строка не была обновлена, создайте ее.
Я должен упомянуть, что сервер будетмалобюджетные серверы с большим объемом памяти.
Можно внимательно посмотреть на предполагаемую настройку в этом потоке на serverfault .
Ключевыми данными являются то, что системы будут иметьГигабитная пропускная способность (максимально 24/7) и запросы полей будут довольно большими (поэтому нет изображений или множества небольших файлов, которые создают высокую нагрузку при большом количестве строк журнала и запросов).Мегабайт в среднем 500 МБ или что-то!
Запланированная на данный момент установка работает на дешевой потребительской материнской плате (asus), 2 ГБ оперативной памяти DDR3 и процессоре AMD Athlon II X2 220, 2x 2,80 ГГц.
Конечно, проблема с менеджерами загрузок и диапазонами запросов, но я думаю, что средний размер доступа будет не менее 50 мегабайт или около того.
Итак, мои вопросы:
Есть ли у меня серьезное узкое место в этом потоке?Можете ли вы обнаружить какие-либо проблемы?
Правильно ли я предполагаю, что mysql_affered_rows () может быть непосредственно прочитан из последнего запроса и не выполняет другой запрос к серверу mysql?
Как вы думаете, система с приведенными выше характеристиками может справиться с этим?Если нет, как я могу улучшить?Я думаю, что первым узким местом будет процессор, не так ли?
Что вы думаете об этом?Есть ли у вас предложения по улучшению?Мабы, что-то совершенно другое?Я думал об использовании Lighttpd и модуля mod_secdownload.К сожалению, он не может проверить IP-адрес, и я не так гибок.Преимущество будет в том, что для проверки загрузки не потребуется процесс php для запуска.Но так как он работает только на короткое время и не читает и не выводит сами данные, я думаю, это нормальноВы?Однажды я скачивал с помощью lighttpd на старых одноразовых ПК, и производительность была потрясающей.Я также думал об использовании nginx, но у меня нет опыта с этим.Но
Как вы думаете, что из протокольной регистрации в скрипт, который непосредственно обновляет базу данных?Стоит ли писать запросы в очередь заданий и обновлять их в базе данных во втором процессе, который может обрабатывать задержки?Или не делать это вообще, но анализировать файлы журналов ночью?Я думал, что хотел бы, чтобы это было как можно в реальном времени, и я не собирал данные где-то еще, кроме как в центральной базе данных.Я также не хочу отслеживать работу, выполняемую на всех серверах.Это может быть беспорядок, чтобы поддерживать.Должен быть простой модульный тест, который генерирует защищенную ссылку, загружает ее и проверяет, все ли работает и ведется ли запись в журнал.
Есть еще предложения?Я рад за любой ваш вклад!
Я также планирую открыть все это.Я просто думаю, что должна быть альтернатива дорогим хранилищам с открытым исходным кодом, как amazon s3, которая ориентирована на загрузку файлов.
Я действительно много искал, но ничего подобного не нашелтам что.Конечно, я бы использовал существующее решение.Предпочтительно с открытым исходным кодом.Вы знаете что-нибудь подобное?