Разворачиваем MPI кластер на Linux

0d96d427f7690ce31cb5d5f7f365ed8f.png

Сейчас любое серьезное приложение, работающее в продуктивной среде, требует обеспечение высокого уровня надежности функционирования. Обеспечение такой надежности требует использования ряда средств, таких как отказоустойчивые каналы связи, наличие дублирования источников питания и т. д. Но наиболее важным элементом обеспечения надежности является создание отказоустойчивой конфигурации серверов, на которых работает данное приложение.   

Совершенно очевидно, что если приложение запущено на одном сервере, то в случае его отказа приложение будет недоступно до тех пор, пока не будет исправлен сбой сервера. Основная задача кластеризации это устранение данной ситуации с помощью своевременного, обнаружения аппаратных и программных сбоев и немедленно переключение на другой узел кластера — это процесс, известный как отработка отказа.

Существует много различных вариантов создания кластеров под Linux. Мы будем использовать MPI (Message Passing Interface) для обеспечения взаимодействия между узлами нашего кластера.

Установка на Ubuntu Linux

Перед началом создания собственного двухузлового кластера нам потребуются два сервера с установленной ОС Ubuntu 22.04. Между этими узлами нам необходимо установить прямое соединение для обмена heartbeat. Каждому из этих сетевых интерфейсов необходимо назначить статический IP адрес. У нас это будут 10.0.0.1 (node_1) и 10.0.0.2 (node_2).

Далее я буду предполагать, что у вас уже установлен SSH сервер. Если это по какой-то причине не так, то установите SSH на оба узла с помощью команды:

sudo apt install openssh-server

Первое, что нам потребуется сделать это настроить беспарольный доступ по SSH с помощью сертификатов. Выполним следующую команду:

sudo ssh-keygen -t rsa -b 4096

После ее запуска вам будут заданы несколько вопросов, на которые можно ответить предлагаемыми значениями по умолчанию. В результате будут созданы два файла ~/.ssh: id_rsa и id_rsa.pub. Последний является открытым ключом. Содержимое этого файла необходимо скопировать в файл ~/.ssh/authorized-keys на удаленном компьютере. Это можно сделать к примеру с помощью утилиты scp.

scp ~/.ssh/authorized_keys 10.0.0.2:~/.ssh/

Аналогичные действия необходимо проделать на втором узле и скопировать сгенерированный ключ в настройки SSH на первом сервере.

Устанавливаем протокол коммуникаций

Далее для работы нашего кластера нам потребуется установить средство для обмена сообщениями. Мы будем использовать MPI (Message Passing Interface) — стандартный коммуникационный протокол для распределенных вычислений. Не вдаваясь в технические особенности и версии данного протокола установим на обоих узлах одну из реализаций MPI с помощью команды:

sudo apt install libopenmpi-dev

После этого нам необходимо проверить возможность выполнять команды на удаленном узле. Для этого выполним следующее на узле 10.0.0.1:

mpirun -np 2 -host 10.0.0.2:2 hostname

В результате нам должен быть выведен на экран результат выполнения данной команды, то есть имя второго узла.

Для удобства работы с узлами кластера рекомендуется прописать в файле /etc/hosts соответствие IP адресов каждого из узлов и их имен:

10.0.0.2               node_2

10.0.0.1               node_1

Есть причина, по которой мы до сих пор использовали команду hostname: она доступна по умолчанию во всех системах. При использовании MPI важно помнить, что мы, по сути, используем сетевое подключение только для того, чтобы позволить нескольким запущенным заданиям взаимодействовать друг с другом. Однако каждое задание выполняется на своем собственном компьютере, имеющем доступ к своему собственному жесткому диску. Это, в частности, означает, что команда для запуска должна существовать на всех компьютерах и в одном и том же расположении.

Таким образом, для совместного выполнения задач и обмена результатом нам необходим общий ресурс. В данном случае мы будем использовать файловую систему NFS.  

Для установки ее компонентов на узле node_1 выполним следующую команду:

sudo apt install nfs-kernel-server nfs-common

Далее вам нужно создать точку монтирования для общего каталога. Будем расшаривать домашний каталог пользователя user на node_1.

 sudo ln -s /nfs /home/user

Далее на том же node_1 добавим в файл /etc/exports  строку для доступа со второй ноды:

nano /etc/exports

 ...

/home/user        node_2(rw)

На узле node_2 создадим каталог /nfs

sudo mkdir /nfs

И добавим в fstab следующую запись:

nano /etc/fstab

...

10.0.0.1:/home/user       /nfs      nfs defaults 0 0

Далее выполним монтирование:

sudo mount -a

Если монтирование завершилось успешно, то мы можем перейти в папку nfs и увидеть содержимое, реально находящееся на node_1.

cd /nfs

user@node_2:/nfs$ ls -la

total 60084

drwxr-xr-x 80 user user    12288 Sep  7 14:17 .

drwxr-xr-x 25 root root    4096 Aug 27 06:19 ..

Таким образом мы получили кластерную конфигурацию в которой мы можем выполнять команды на каждом из узлов и использовать общую файловую шару для взаимодействия между нодами.

Заключение

В этой статье мы рассмотрели один из вариантов создания кластера на Ubuntu, с помощью которого затем можно реализовать выполнение различных вычислительных задач.

В завершение порекомендую открытый урок, посвященный настройке Nginx для высоких нагрузок и защиты от DoS-атак. Узнать подробнее и записаться можно по ссылке.

© Habrahabr.ru