**Распределенные вычисления: Часть 3. Развертывание сервера распределенных вычислений** **1. Введение** [[ru:chast_1|Первая статья]] этой серии была посвящена распределенным вычислениям по принципу «volunteer computing», в частности, платформе BOINC, приютившей большое количество проектов, имеющих широкую мировую известность. В [[ru:chast_2|прошлой статье]] мы подробно разобрали архитектуру сервера BOINC. Вся эта информация пригодится нам для развертывания и запуска собственного полноценного сервера распределенных вычислений на платформе BOINC – этому и посвящена статья. **2. Подготовительные шаги** Перед тем как приступать к собственно установке требующегося программного обеспечения, необходимо выполнить ряд предварительных шагов. Прежде всего, под сервер должен быть отведен достаточно производительный компьютер. На сайте разработчиков BOINC указываются следующие требования: «Компьютер должен иметь достаточно производительный процессор (например, двухъядерный Xeon или Opteron) и, как минимум, 2 ГБ оперативной памяти. Для проектов с высокой нагрузкой необходимо не менее 8 ГБ оперативной памяти и более производительный процессор.» Для более или менее серьезных проектов, как и положено серверу, должны быть проведены мероприятия по повышению отказоустойчивости (подключение источника бесперебойного питания, настройка RAID, контроль и поддержание температурного режима и т.д.). Удостоверившись в выполнении необходимых аппаратных требований – обеспечении достаточной производительности и хорошей отказоустойчивости, можно приступать к подготовке системного программного обеспечения. На компьютере, выделенном вами в качестве сервера BOINC, должна быть установлена операционная система GNU/Linux (подойдет любой понравившийся вам дистрибутив). В системе должны присутствовать средства разработки (компилятор, компоновщик связей и т.д.), сервер баз данных и Web-сервер, а также некоторые дополнительные библиотеки и вспомогательные утилиты, которые можно устанавливать по мере возникновения необходимости. При написании этой статьи в качестве сервера использовался компьютер на основе двухъядерного процессора Intel Xeon 2.80 ГГц с 2 ГБ оперативной памяти. Аппаратные ресурсы управлялись OpenSUSE Linux 11.1. Позаботьтесь о том, чтобы хорошо защитить свой сервер на программном уровне – необходимо своевременно устанавливать обновления безопасности, настроить межсетевой экран, отключить ненужные сетевые сервисы и т.д. Большую помощь в этом могут также оказать средства обеспечения мандатного контроля доступа AppArmor, TOMOYO Linux или даже SELinux. Все стандартные рекомендации по обеспечению защищенности и отказоустойчивости аппаратных ресурсов и программной системы имеют особую важность при организации распределенных вычислений «volunteer computing», так как напрямую отражаются на популярности проекта. Если ваш сервер будет периодически «пропадать» или станет распространителем спама и руткитов, то вряд ли найдется много желающих отдавать ресурсы своих компьютеров такому проекту! Теперь нужно установить необходимое для работы BOINC вспомогательное программное обеспечение. Для развертывания сервера понадобятся СУБД MySQL, Web-сервер Apache, интерпретаторы и стандартные библиотеки языков python и php. Объяснение такому разнообразию необходимых инструментов можно найти в прошлой статье – помните, там говорилось о том, что Web-сервер – это составная часть сервера BOINC, а база данных несет на себе огромную функциональность. Кроме того, для получения и сборки исходного кода потребуются клиент системы управления версиями Subversion (svn), компилятор gcc и средства разработки из состава GNU Tools, а также открытый криптографический пакет OpenSSL и вспомогательная утилита pkg-config. Установив вспомогательное программное обеспечение, создайте пользователя-администратора проекта BOINC, (например, boincadmin), от имени которого будут работать служебные скрипты сервера. Этот пользователь должен иметь возможность работать с базой данных, а также создавать и удалять файлы в каталогах Web-сервера Apache. Еще одно важное требование – сервер BOINC должен иметь доменное имя и «белый» IP-адрес. Однако необходимость в «белом» IP-адресе отпадает, если BOINC-сервер – и все размещаемые на нем проекты – должен быть виден только в рамках локальной сети, например, университета. Однако в любом случае для комфортной работы IP-адрес должен быть статическим. Теперь, когда выполнены все вспомогательные шаги и предварительные условия, можно переходить непосредственно к сборке программных компонент сервера BOINC. **3. Установка сервера шаг за шагом** Для развертывания сервера BOINC, необходимо его прежде всего... скомпилировать. Скачайте исходный код с помощью команды svn co http://boinc.berkeley.edu/svn/branches/server_stable Если все дополнительные инструменты установлены, то можно приступать к компиляции (исходный код уже должен находиться в подкаталоге server_stable домашнего каталога пользователя boincadm). boincadm@boincserver:~/server_stable> ./_autosetup boincadm@boincserver:~/server_stable> ./configure --disable-client --disable-manager Из опций скрипта configure понятно, что компилировать мы будем только серверные компоненты и дополнительные библиотеки – об этом скажет последняя строчка, выведенная скриптом (если все прошло нормально, конечно): Build Components: ( libraries server) Внимательно просмотрев сообщения, выдаваемые по ходу работы configure, вы, возможно, обнаружите какие-нибудь предупреждения наподобие этого: checking if CFLAG '-include fcgi_stdio.h' works... no configure: WARNING: fcgi-stdio.h not found. ------------------------------------------------------------ Disabling FCGI. Will not build components that require FCGI ------------------------------------------------------------ Такие зависимости, не приводящие к ошибкам скрипта, являются необязательными. Вы можете либо проигнорировать предупреждения, либо установить недостающие компоненты, чтобы получить дополнительную функциональность. Однако если не будут найдены, например, библиотеки mysql, то скомпилировать сервер не удастся! В итоге, возможно, что после непродолжительной борьбы с зависимостями придет время запустить на выполнение команду boincadm@boincserver:~/server_stable> make и пойти выпить кружку чая – компиляция компонент сервера займет некоторое время... **4. Запуск тестового проекта** Теперь можно перейти к созданию первого тестового проекта под управлением сервера BOINC. Прежде всего убедитесь, что запущены фоновые процессы, отвечающие за работу Apache и MySQL, и последовательно выполните все этапы, описанные ниже. **4.1. Создание инфраструктуры проекта** Для выполнения всей необходимой работы, связанной с созданием нового проекта распределенных вычислений, разработчиками BOINC создан специальный скрипт make_project. Найти его можно в подкаталоге tools каталога скомпилированного сервера. Запустите этот скрипт с именем нового проекта: boincadm@boincserver:~/server_stable> ./tools/make_project myapp Сообщения, которые выводит скрипт во время своей работы, помогут понять, что происходит при создании нового проекта. Прежде всего устанавливаются параметры, связанные с доступом к Web-странице проекта (здесь boincserver.domain.ru – это имя сервера в сети): Creating project 'myapp' (short name 'myapp'): PROJECT_ROOT = /home/boincadm/projects/myapp/ URL_BASE = http://boincserver.domain.ru/ HTML_USER_URL = http://boincserver.domain.ru/myapp/ HTML_OPS_URL = http://boincserver.domain.ru/myapp_ops/ CGI_URL = http://boincserver.domain.ru/myapp_cgi/ KEY_DIR = /home/boincamd/projects/myapp/keys/ DB_NAME = myapp DB_HOST = Затем создаются необходимые каталоги... Setting up server: creating directories … и генерируются криптографические ключи Keys don't exist in /home/boincadm/projects/myapp/keys/; generate them? [Y/n] y Setting up server files: generating keys Наконец, копируются необходимые файлы, создаются таблицы базы данных и файлы настроек, а также устанавливаются службы, которые не зависят от приложения: Setting up server files: copying files Setting up database Setting up server files: writing config files Setting up server files: linking cgi programs update_translations finished Done installing default daemons. Скрипту make_project при желании можно указать набор параметров для изменения стандартных настроек. Поначалу, скорее всего, наиболее востребованными параметрами окажутся --**delete_prev_inst** и --**drop_db_first**, позволяющие переписать (или просто удалить) данные уже существующего проекта. Об остальных возможностях можно узнать, использовав параметр --**help**. В домашнем каталоге администратора проекта BOINC (в примере, приведенном в статье, это /home/boincadm) вы обнаружите подкаталог projects/myapp со следующим содержимым: boincadm@boincserver:~/server_stable> ls ~/projects/myapp {{:ru:chast_3_myapp_list.png|}} Все эти подкаталоги (и их содержимое) и файлы, а также записи о проекте в базе данных сервера BOINC, созданы скриптом make_project. Назначение большей части из этих файлов и каталогов станет понятно при дальнейшем прочтении статьи (а что хранится в одном из этих каталогов, вы уже знаете, верно?). В дальнейшем основным рабочим каталогом для нас будет являться каталог /home/boincadm/projects/myapp – перейдите в него. **4.2. Web-страница проекта** Необходимые настройки Web-сервера Apache для нового проекта содержатся в файле myapp.httpd.conf. Его содержимое можно либо подключить в основном файле настроек, либо напрямую перенести настройки (и то, и другое делается с правами root): root@boincserver:/home/boincadm/projects/myapp> cat myapp.httpd.conf >> /etc/apache2/httpd.conf Теперь нужно перезапустить сервер Apache: root@boincserver:/home/boincadm/projects/myapp> apache2ctl restart Если все настроено верно, то при вводе в браузер адреса http://localhost/myapp (с компьютера, на котором находится проект) или http://boincserver.domain.ru/myapp (с сетевого компьютера локальной или глобальной сети, в зависимости от области видимости домена domain.ru) вы увидите картинку, как на рисунке 1. ''**Рисунок 1. Главная страница тестового проекта BOINC**'' {{:ru:pic1.jpg|}} Это главная страница нашего тестового проекта BOINC, она является основной контактной точкой с будущими пользователями вашего сервера. Разработчики BOINC поработали на славу, давая вам возможность воспользоваться шаблоном сайта. При желании шаблон можно изменить, кардинально переработав интерфейс и функционал, как это сделано, например, в проекте SETI@HOME (http://setiathome.berkeley.edu/), или оставить все как есть, только наполнив сайт содержанием (например, Einstein@HOME – http://einstein.phys.uwm.edu/). **4.3. Периодический запуск фоновых процессов** Теперь необходимо обеспечить запуск периодически выполняемых вспомогательных служб (таких, например, как служба освоения результатов – assimilator). Делается это посредством системной службы cron: чтобы установить необходимую периодичность, достаточно выполнить команду boincadm@boincserver:~/projects/myapp/> crontab myapp.cronjob В файле myapp.cronjob записано указание службе cron на запуск скрипта ~/projects/myapp/bin/start каждые пять минут: boincadm@boincserver:~/projects/myapp/> more myapp.cronjob 0,5,10,15,20,25,30,35,40,45,50,55 * * * * /home/boinc/projects/myapp/bin/start --cron Этот скрипт, в свою очередь, вызывает все утилиты сервера BOINC, предназначенные для периодического выполнения. **4.4. Известные платформы и имя приложения** В качестве приложения, которое будет запускаться участниками распределенного проекта, воспользуемся примером, распространяемым все с тем же BOINC. Некоторые подготовительные шаги для этого уже сделаны разработчиками. Взгляните на файл project.xml, находящийся в корне каталога проекта: boincadm@boincserver:~/projects/myapp> more project.xml i686-pc-linux-gnu Linux running on an Intel x86-compatible CPU uppercase upperCASE В файле project.xml (здесь представлена только часть его) описаны программно-аппаратные платформы, «известные» проекту. Для каждой из этих платформ можно создать собственную версию программы. В конце файла записана информация о приложении – имя программы, используемое в служебных целях (например, для именования каталогов не используйте в нем зарезервированных системой символов!), а также имя, выводимое на обозрение пользователям. Чтобы занести в базу данных проекта известные платформы и имена приложения, выполните команду boincadm@boincserver:~/projects/myapp> ./bin/xadd … Processing ... Committed ; values: {'_dirty': False, '_lazy_lookups': {}, 'create_time': 1258736642L, 'deprecated': 0, 'id': 3L, 'name': 'i686-pc-linux-gnu', 'user_friendly_name': 'Linux running on an Intel x86-compatible CPU'} … Processing ... Committed ; values: {'_dirty': False, '_lazy_lookups': {}, 'beta': 0, 'create_time': 1258736642L, 'deprecated': 0, 'homogeneous_redundancy': 0, 'id': 1L, 'min_version': 0L, 'name': 'uppercase', 'target_nresults': 0, 'user_friendly_name': 'upperCASE', 'weight': 1.0} ... **4.5. Исполняемые файлы распределенного приложения** В подкаталоге apps/ каталога проекта должны содержаться файлы приложения, которое будет выполняться на компьютерах участников проекта. Создайте в каталоге apps/ подкаталог по имени приложения (это имя должно совпадать с тем, что записано в файле project.xml: uppercase). Скопируйте в новый каталог соответствующий исполняемый файл из каталога скомпилированного сервера: boincadm@boincserver:~/projects/myapp> cp ~/server_stable/apps/upper_case ./apps/uppercase/uppercase_1.0_ i686-pc-linux-gnu Помните, что имя исполняемого файла должно строго соответствовать следующему формату: <имя>_<версия>_<платформа>[.<расширение>] Именно этот формат используется для записи имени в нашем случае: имя приложения: uppercase; версия: 1.0; платформа: i686-pc-linux-gnu. Важно, чтобы название платформы совпадало с каким-нибудь из названий, определенных в файле project.xml. В дальнейшем, когда клиент BOINC соединится с сервером проекта, планировщик передаст клиентскому приложению именно тот исполняемый файл из каталога apps/, платформа которого совпадает с платформой клиентского компьютера. В каталоге ~/server_stable/apps содержится не только исполняемый файл для платформы i686-pc-linux-gnu, но и исходный код приложения uppercase, поэтому, при желании, вы можете собрать этот тестовый проект для любой интересующей вас платформы. Теперь, когда необходимые исполняемые файлы размещены в соответствующем каталоге, необходимо занести в базу данных информацию о соответствии файла приложения платформам. Для этого служит специальная утилита update_version: boincadm@boincserver:~/projects/myapp> ./bin/update_version Утилита update_version должна идентифицировать исполняемый файл и подобрать для него подходящую платформу: Found version 100 for : uppercase_1.0_i686-pc-linux-gnu Вам предложат сформировать электронную подпись для исполняемого файла. Закончиться процесс добавления приложения должен следующими строчками: Committed: Touched trigger file to make feeder re-read app_version table from database Done Видимый результат ваших действий — следующая картинка по ссылке «Приложения» главной страницы проекта (рисунок 2). ''Р**исунок 2. Список приложений и поддерживаемых платформ**'' {{:ru:pic2.jpg|}} **4.6. Создание рабочих единиц проекта** Итак, завершен этап создания проекта. Следующий этап – создание рабочей единицы (Work Unit) этого проекта. Прежде всего создадим текстовый файл в каталоге download – этот файл будет содержать исходные данные для приложения uppercase: boincadm@boincserver:~/projects/myapp> echo "My first BOINC-project is working" > download/in Теперь нужно создать шаблоны (в подкаталоге templates каталога проекта), описывающие рабочее задание и требуемый результат. Первый файл называется upper_case_wu и содержит текст: boincadm@boincserver:~/projects/myapp> more templates/upper_case_wu 0 0 in 1 1 Второй файл – upper_case_result, его содержимое: boincadm@boincserver:~/projects/myapp> more templates/upper_case_result 10000 out Теперь все готово к созданию рабочего задания нашего проекта. Запускаем следующую команду: boincadm@boincserver:~/projects/myapp> ./bin/create_work -appname uppercase -wu_name test -wu_template templates/upper_case_wu -result_template templates/upper_case_result in Обратите внимание на то, какие параметры необходимо поменять, если вы использовали отличные названия файлов и проекта: * --appname <название> – название приложения; * --wu_name <название> – название рабочего задания; * --wu_template <имя файла> – относительный путь и имя файла шаблона рабочего задания, относящегося к проекту. Обычно шаблоны хранят в подкаталоге templates/ каталога проекта; * --result_template <имя файла> – относительный путь и имя файла шаблона результата, относящегося к проекту. Обычно также хранится в подкаталоге templates/ каталога проекта. Утилита create_work имеет большое количество дополнительных необязательных параметров. Узнать подробнее о них (а также о других возможностях по генерации заданий) можно из страниц wiki-проекта BOINC (по адресу http://boinc.berkeley.edu/trac/wiki/JobSubmission). **4.7. Запуск фоновых процессов** Следующий этап – запуск проекта, точнее, его фоновых процессов: boincadm@boincserver:~/projects/myapp/> bin/start Entering ENABLED mode Starting daemons Starting daemon: feeder -d 3 Starting daemon: transitioner -d 3 Starting daemon: file_deleter -d 3 Убедимся, что проект работает: boincadm@boincserver:~/projects/myapp> bin/status BOINC is ENABLED {{:ru:chast_3_daemons_list.png|}} Из вывода утилиты status проекта видно, какие фоновые процессы запущены и какие файлы используются. В случае, если что-то пошло не так (например, не хватает какой-либо из служб), то можно просмотреть в поисках наводящих сообщений лог-файлы, которые хранятся в подкаталоге log_<имя компьютера>/ каталога проекта. Там вы найдете лог-файлы каждой из служб в файлах с названиями <имя службы>.log. **4.8. Подключение к проекту** Все готово! Теперь можно запускать клиент BOINC (его можно скачать по ссылке на главной странице разработчиков BOINC – см. п. 3 раздела "Ресурсы") и подключать его к проекту. В клиенте BOINC (лучше всего запускать его не на том же компьютере, где располагается сервер) нажмите кнопку AddProject (в Simple view) или выберите в меню Сервис пункт «Attach to project or account manager» (в Advanced view) и в диалоговом окне введите адрес вашего проекта: http://boincserver.domain.ru/myapp. Если все предыдущие шаги были выполнены правильно, то вам предложат зарегистрироваться в проекте и, наконец, вы увидите сообщение об успешном подключении к проекту (рисунок 3). ''**Рисунок 3. Результат – успешное подключение к проекту**'' {{:ru:pic3.jpg|}} Следите за сообщениями, которые появляются на вкладке «Сообщения» клиента BOINC в Advanced view: клиент должен успешно подключиться к серверу, соединиться с планировщиком, получить от него исполняемый файл (соответствующий клиентской платформе) и файл исходных данных. После этого клиент должен провести необходимые преобразования (буквально несколько секунд!) и отправить файл с результатом серверу проекта. Подтверждение успеха – выходной файл, который должен лежать в каталоге upload вашего проекта: boincadm@boincserver:~/projects/myapp> more upload/ba/test_0_0 MY FIRST BOINC-PROJECT IS WORKING Сравните его с исходным файлом, хранящимся в каталоги download/. **Заключение** Возможно, вам неоднократно потребуется повторить описанные в статье этапы... В этом нет ничего страшного: спотыкаясь на каждом шаге, вы получаете требуемый бесценный опыт! Именно преодоление трудностей поможет вам лучше понять внутреннее устройство и логику работы сервера BOINC. Кроме того, вы всегда сможете задать вопрос и получить необходимую помощь. Эта статья является продолжением серии статей, посвященных высокопроизводительным распределенным вычислениям на базе платформы BOINC. Теперь вы можете не только участвовать в проектах типа ClimatePrediction@HOME, но и сами создать площадку для проектов BOINC! Однако успешная работа проекта невозможна без хорошего понимания принципов функционирования сервера BOINC. В следующей статье мы исследуем закоулки созданного в рамках этой статьи проекта myapp. ---- Статья взята с http://www.ibm.com