Буду ли я сталкиваться с проблемами загрузки с этим стеком приложений? - PullRequest
1 голос
/ 20 февраля 2011

Я проектирую сеть для загрузки файлов.

Конечная цель - создать 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, которая ориентирована на загрузку файлов.

  • Я действительно много искал, но ничего подобного не нашелтам что.Конечно, я бы использовал существующее решение.Предпочтительно с открытым исходным кодом.Вы знаете что-нибудь подобное?

1 Ответ

2 голосов
/ 21 февраля 2011

MogileFS, http://code.google.com/p/mogilefs/ - это почти то, что вам нужно.

...