Система распределенных вычислений на базе сервисов Amazon
Целевая аудитория: технические руководители, системные архитекторы и веб-разработчики.
Проектирование и реализация веб-приложений, требующих интенсивной работы процессора, — задача не из числа тривиальных. В теории все знают, что если сервер не справляется с требуемым объемом вычислений за определенное время, то нужно разбить задачу на мелкие и обрабатывать ее части параллельно на нескольких машинах. Этот подход известен как распределенные вычисления. Распространено мнение, что как разработка, так и поддержка серверного решения распределенных систем — трудоемкий и дорогой процесс, что является серьезным барьером для стартапов. В этой статье мы развеем этот миф, предложив практическое решение для такой задачи:
— данные для обработки поступают от заказчиков в виде задач через web в течение рабочего дня, однако обрабатывать их нужно в ночное время (например, с 00:00 до 06:00);
— объем входных данных для обработки задачи, как и данных, представляющих результат, невелик (например, несколько килобайт);
— все задачи и результаты должны быть зарегистрированы в единой базе;
— обработка задачи требует значительного времени в масштабах среднестатистического веб-сервера (например несколько секунд);
— количество задач, которые нужно обработать за ночь, довольно большое (тысячи).
Hardware: Серверное решение
Серверное решение базируется на том, что главный сервер круглосуточно собирает данные от пользователей и передает их на обработку другим серверам, специально подобранным и сконфигурированным для выполнения ресурсоемких вычислений (таких серверов может быть десятки или сотни). Вычисления производятся на этих серверах ежедневно в ночное время, как требует поставленная задача.
Организация подобной системы довольно затратна, поскольку требуется приобрести, настроить и поддерживать достаточное количество серверов. Кроме того, налицо неэффективное использование ресурсов — вычислительные серверы будут простаивать в дневное время. Если требуется обеспечить запас мощности (например, возможно некоторое колебание дневного объема задач), то нужно иметь определенное количество серверов в резерве.
Учитывая требования к системе, мы предлагаем использовать сервис Amazon EC2 как хостинг-платформу для вычислительных серверов. Преимуществом этой платформы являетется то, что возможен динамический запуск виртуальных машин, причем оплате подлежат фактические часы использования. Если программная логика позволяет динамически оценить количество требуемых машин для обработки данных за ночь, то можно без участия человека запускать требуемое количество машин, разворачивая их из подготовленного образа. Когда вычисления закончены, разумно остановить все машины, чтобы не оплачивать время простоя.
Для работы с виртуальными серверами доступен API и множество реализующих его библиотек. В своей работе мы используем Amazon EC2 API Tools. Однако детальное рассмотрение возможностей API выходит за рамки данной статьи. Для главного сервера подходит мощный сервер как на традиционном хостинге, так и на Amazon EC2.
Software: Архитектура
Назовем модуль, работающий на главном сервере, DCBoss, а внешний модуль, установленный на вычислительных серверах, — DCWorker. Функция DCWorker проста — он получает задачу (или пакет задач) на обработку, производит вычисления и возвращает результат DCBoss.
Рассмотрим задачи DCBoss более детально. Главный модуль ответственен за следующие процедуры:
1. получение данных от заказчиков;
2. распределение задач между копиями DCWorker, контроль выполнения;
3. получение результатов от DCWorker и сохранение в центральной базе.
Вторая задача довольно нетривиальна, но вполне стандартна. Чтобы не изобретать велосипед, мы использовали готовое решение — Amazon SQS, которое берет на себя разрешение вопросов диспетчеризации задач (блокировка задачи во время ее выполнения одной из копий DCWorker, повторная отправка задачи на выполнение в случае неуспешного завершения первой попытки и т.п.). Кроме того, в силу своей распределенной природы, Amazon SQS успешно справляется с тысячами одновременных запросов на получение новой задачи (в случае большого числа копий DCWorker).
Таким образом, мы пришли к модифицированной схеме процесса, где DCBoss выполняет следующие функции:
1. получение данных от заказчиков;
2. отправка задач в очередь на базе Amazon SQS (назовем ее TaskQueue);
3. получение результатов от DCWorker и сохранение в центральной базе.
В получившейся схеме все же присутствует одно слабое место — получение результатов от DCWorker, которое может оказаться массовым. Чтобы избежать ситуации пиковых нагрузок на главный сервер, мы ввели в схему еще одно звено — вторую очередь на базе Amazon SQS, в которую DCWorker сохраняет результаты вычислений. Назовем эту очередь ResultQueue. DCBoss сам инициирует чтение результатов вычислений из ResultQueue, что позволяет избежать ситуации массовых обращений к главному серверу копиями DCWorker.
В данной схеме DCBoss ответственен за такие функции:
1. получение данных от заказчиков;
2. отправка задач в TaskQueue;
3. получение результатов из ResultQueue и сохранение их в центральной базе.
При введении в систему элементов на базе Amazon SQS следует учитывать некоторые особенности этой реализации очереди.
— Принцип FIFO не соблюдается, и элементы возвращаются очередью в случайном порядке. Для нашей задачи это не принципиально, так как в момент запуска вычислений прием новых задач от заказчиков приостанавливается, и рассчитанные вычислительные мощности должны справиться с поступившими задачами.
— Amazon SQS гарантирует, что элемент очереди будет возвращен не менее одного раза, что означает вероятность обработки одной задачи несколькими копиями DCWorker.
В результате мы добились довольно гибкой схемы, где есть возможность управлять вычислительными мощностями за счет изменения количества копий DCWorker.
Software: Реализация
DCBoss и DCWorker — это два независимых модуля, которые могут быть реализованы на разных языках программирования и/или запущены на разных платформах, поскольку они взаимодействуют между собой только через Amazon SQS API. Мы выбрали для реализации соответственно Java и PHP, поскольку для них доступны библиотеки, реализующие SQS API. Хотя, конечно, можно реализовать все необходимые функции самостоятельно и на другом языке.
TaskQueue и ResultQueue оперируют с текстовыми сообщениями, представляющими задания и результаты. У Amazon SQS есть ограничение: длина сообщения не должна превышать 8kb. Если такое ограничение неприемлемо для системы, то обойти его можно, как рекомендует Amazon: «Сообщения большего размера можно хранить на Amazon Simple Storage Service (Amazon S3) или Amazon SimpleDB и использовать Amazon SQS для хранения указателя на объект Amazon S3 или Amazon SDB». [http://docs.amazonwebservices.com/AWSSimpleQueueService/2008-01-01/SQSGettingStartedGuide/]. С другой стороны, если, к примеру, объем сообщения не превышает 1kb, то можно оптимизировать передачу данных за счет объединения 8 заданий (или результатов) в пакет.
Демонстрационная система
Мы предлагаем исходный код простой реализации модулей DCBoss и DCWorker. Данная реализация нацелена на подтверждение концепции и визуализацию идеи. Применение ее на практике потребует по меньшей мере реализации обработки исключительных ситуаций.
Модуль DCBoss реализован как веб-приложение на Java, основанное на веб-оболочке Struts и библиотеке Typica для работы с Amazon SQS API. DCBoss позволяет пользователю создавать тестовую «задачу» и «запускать ее на выполнение» с возможностью наблюдать все этапы обработки. В демонстрационной системе пользователь вручную инициирует запуск копий DCWorker. Пользователь может получить информацию о том, какая из копий DCWorker обработала определенную задачу.
DCWorker — это скрипт на PHP с заглушкой на месте предполагаемой обрабатывающей функции. Здесь используется библиотека simple-aws для работы с Amazon SQS. DCWorker просто читает задачи из TaskQueue и помещает сообщения с добавлением своего идентификатора в ResultQueue. Для простоты копии DCWorker — всего лишь экземпляры PHP-класса, эмулирующие работу виртуальной машины и выполняющие обработку на одном сервере как обработчики HTTP-запросов.
В приложенном файле readme.txt можно найти информацию о том, как настроить оба модуля.
Современные технологии позволяют сделать даже масштабные по объемам вычислений решения вполне доступными. Amazon предоставляет целый ряд мощных средств для их реализации — Amazon SQS и Amazon EC2, рассмотренные в этой статье — только примеры, которые мы успешно применяем в нашей работе.
Автор: Екатерина Журданова





Copyright © 19992010 LAR