Вот такая ситуация:
У меня есть веб-приложение PHP / MySQL, которое принимает пользовательские загрузки (файлы PDF). Из страниц этих pdf-файлов на лету создается изображение для предварительного просмотра и предоставляется пользователям веб-приложения. Некоторые PDF-файлы могут быть большими, большинство - менее 50 МБ, но в некоторых крайних случаях может достигать нескольких сотен МБ. Небольшое ожидание изображения для предварительного просмотра для больших файлов pdf допустимо, но, скажем, не более минуты. На данный момент все работает на одном сервере, но вскоре приложение достигнет серверного лимита как по хранению, так и по вычислительной мощности.
Моя идея решить проблему:
Чтобы справиться с этой ситуацией, у меня возникла идея иметь один или несколько серверов обработки PDF по мере необходимости и один или несколько серверов хранения файлов. Эти два типа серверов подключены к серверу, на котором работает фактическое приложение, с использованием NFS. Затем приложение может использовать GearMan для делегирования задач обработки PDF этим серверам обработки. Сервер обработки может установить сервер хранения и прочитать файл, хранящийся там, обработать его и записать свой вывод на этот сервер. Серверы, о которых я говорю, будут экземплярами amazon ec2.
Веб-приложение возвращает ссылку на получившееся изображение предварительного просмотра в формате PDF на сервере хранения, которое использовалось, которое затем можно использовать во внешнем интерфейсе, чтобы показать изображение пользователю.
Мой вопрос:
У меня нет опыта работы с приложениями, использующими несколько серверов, жизнеспособна ли эта идея или есть лучший способ сделать это? Достаточно ли быстра и надежна установка NFS в этой ситуации?
Вы определенно думаете в правильном направлении, но, по моему опыту, общее хранилище на виртуальных машинах редко бывает производительным, поэтому я сомневаюсь, что в этом случае я бы действительно пошел по маршруту NFS.
Самым большим недостатком будет единая точка отказа, связанная с NFS поверх EBS, которую может оказаться довольно сложно устранить. В невиртуальном центре обработки данных я бы использовал кластерное устройство NAS для обработки отказоустойчивого NFS. На EC2 я не знаю, как бы я это сделал.
Если вы уже используете Amazon EC2 для рабочих мест, почему бы не хранить активы в корзине S3. Производительность хорошая, и корзина доступна из любой точки мира с использованием метода HTTP aceess.
Все, что вам нужно сделать, это загрузить на S3, попросить работника захватить файл, обработать его и сбросить полученные ресурсы обратно на S3.
Вы даже можете установить ведро S3 локально. https://stackoverflow.com/questions/10801158/how-stable-is-s3fs-to-mount-amazon-s3-as-a-local-directory
Фактически, вы могли бы пойти дальше на стек Amazon и использовать их простой сервис обмена сообщениями вместо (или не хуже) gearman.