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

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

Существует много различных вариантов создания кластеров под 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-атак. Узнать подробнее и записаться можно по ссылке.

Комментарии (6)


  1. Uint32
    29.06.2023 13:52
    +1

    Не хватает какогонить примера, как со всем этим теперь взлететь


  1. ivankudryavtsev
    29.06.2023 13:52
    +3

    Я не понял о чем статья.

    Вы ничего не настроили абсолютно. Мотивация плясок не ясна. Что "это" может делать? Даже если бы вы Docker Swarm подняли на этих двух нодах и то пользы больше было бы. Да и сплит-брейн никто не отменял.

    MPI - это вообще про HPC, а не про бизнес-приложения. Типа, там сортировку Хоара распределенную запустить или гены расшифоровывать. Что вы пытаетесь достичь?

    Ну и NFS? Взялись за MPI - монтируйте Lustre или Gluster. Какая уж тут отказоустойчивость. В общем, статья бессмысленна и беспощадна, как и вся наша жизнь.


  1. martin74ua
    29.06.2023 13:52

    странная установка dev пакета - заголовки и библиотеки для разработки - для того, чтобы mpi поставить... Главный вопрос - зачем все это?


  1. DustCn
    29.06.2023 13:52
    +1

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

    Наверное "устанавливаем библиотеку". А то прям взять и засетапить протокол звучит странно. Протокол - это определенные правила и структуры данных, их нельзя установить.

    Дальше вы поставили OpenMPI и без объявления войны запустили его. На одном узле. А их у вас два (из примера дальше). Как показывает практика SHM работает практически всегда, а вот настроить MPI для работы на более одном узле несколько сложнее.

    Вердикт - недоделано.


  1. vadimr
    29.06.2023 13:52

    Автору надо разобраться с отличием кластера высокой производительности от кластера высокой готовности. MPI – это из темы высокой производительности. А про обеспечение высокой готовности (механизм мажоритарного голосования, распределённая файловая система, средства миграции приложений между узлами, дублирование аппаратуры и соединений) в статье вообще ничего нет.

    В статье создан (наполовину настроенный) кластер высокой производительности из двух узлов. Надёжность работы приложений такой кластер не увеличивает, а скорее понижает в два раза. Хотя может увеличить производительность специальным образом написанных программ (ориентированных на исполнение в среде MPI) по сравнению с одним компьютером.


  1. vitaly_il1
    29.06.2023 13:52

    Если цель - запутать новичков, то она выполнена. (почему - уже объяснено в других комментах)