Наше приложение PHP состоит из одного веб-сервера, который будет получать файлы от клиентов и выполнять на них интенсивный анализ ЦП. Прямо сейчас анализ загрузки одного пользователя может занять 3 секунды и потребовать 100% ЦП. Таким образом, производительность нашей системы составляет 1/3 запроса в секунду.
Требование моей команды - увеличить пропускную способность без серьезной реинжиниринга кода. Возможным решением может быть установка балансировщика нагрузки перед несколькими серверами, на которых выполняется одно и то же приложение, с подключением к общей БД. Проблема в том, что анализ выводит файлы на диск.
Балансировщик нагрузки увеличит емкость, но тогда файлы не будут доступны между серверами, поэтому последующие запросы клиентов могут завершиться ошибкой. Мы размещены в Rackspace, есть ли способ настроить какое-то «общее» хранилище для всех серверов без необходимости переписывать наш код сохранения файлов? Текущий код основан на простых операциях и т. Д. Какие у нас есть варианты?
Почему бы вам не смонтировать облачные файлы на каждый сервер с помощью CloudFuse?
Затем вы можете использовать облачные файлы в качестве общей файловой системы. Он не идеален для тяжелой работы I.O., но для того, чтобы просто время от времени говорить и читать, он отлично работает, плюс вы можете передать файл из CDN.
GlusterFS будет обеспечивать полный экспорт файловой системы POSIX, который может быть смонтирован так же, как и большинство других локальных файловых систем. Он будет реплицироваться до заданной степени для избыточности, а в противном случае будет извлекать данные только по запросу. Пока каждый сервер настроен так, что созданные файлы имеют уникальные пути даже в слепой ситуации, вы должны быть в очень хорошем месте.
Какие последующие запросы потребуются для доступа к файлу? Только один пользователь в этом сеансе входа в систему, один и тот же пользователь навсегда или кто-нибудь? Если это один из первых двух вариантов, балансировщик нагрузки должен помочь.
Я считаю Rackspace предлагает услугу балансировки нагрузки на основе F5 BIG-IP. Постоянство сеанса (отправка пользователей обратно на один и тот же сервер для всего сеанса) должно быть опцией в службе балансировки нагрузки. Я предполагаю, что вы говорите о HTTP-трафике, и в этом случае балансировщик нагрузки может ввести файл cookie в сеанс и использовать его, чтобы убедиться, что клиент возвращается на тот же сервер, на котором находится их обработанный файл (либо файл cookie сеанса, либо время ограниченный).
Я не знаю, позволяет ли Rackspace клиентам использовать F5 iRules, но если они это сделают, вы даже сможете справиться с третьим случаем, заставив балансировщик нагрузки определить, на каком сервере размещен файл.
Если файлы никогда не попадают в базу данных, то да, вам нужна единая файловая система, используемая всеми веб-головами. Если файлы используются только во время пользовательского сеанса (сеанса, который загружает файл), вы можете использовать исходный IP-адрес или привязку на основе сеанса в балансировщике нагрузки для решения проблемы без необходимости использования единой файловой системы.
Все балансировщики нагрузки поддерживают различные методы закрепления. Балансировщик нагрузки F5 великолепен, но в стойке также продается парча, которая намного дешевле.
Если вам нужно перейти на одну файловую систему, это потребует некоторой доработки, и есть несколько способов решить эту проблему (например, одной из веб-головок может быть файловая система, или сервер базы данных, или новая выделенная система, или облачная система хранения из Rckspace, AWS или другого).
hth!