Raspberry Pi кластер своими руками: строим мини-суперкомпьютер из 4 плат

Пошаговое руководство по сборке кластера Raspberry Pi своими руками. Настройка сети, MPI, тестирование производительности. DIY проект для распределённых вычислений.
Привет всем, кто любит ковыряться в железе и софте! Сегодня мы займёмся проектом, который одновременно и серьёзный, и невероятно увлекательный. Мы соберём собственный кластер из четырёх одноплатных компьютеров Raspberry Pi. Зачем? Чтобы на собственном опыте понять принципы распределённых вычислений, поэкспериментировать с балансировкой нагрузки или просто похвастаться перед друзьями своим «мини-суперкомпьютером» на столе. Это не просто игрушка, а полноценный полигон для обучения, который можно использовать для тестирования веб-приложений, запуска распределённых задач или даже в качестве домашней облачной платформы.
В этой статье я проведу вас через все этапы: от выбора железа и сборки «стопки» малинок до настройки сети, установки ПО и запуска первого распределённого задания. Будет много команд в терминале, немного магии конфигурационных файлов и, конечно, мои личные советы, как избежать типичных граблей, на которые я сам когда-то наступал.
Что нам понадобится: железо и софт
Прежде чем что-то паять и скручивать, давайте убедимся, что всё необходимое лежит на столе.
«Железная» часть: * 4 одноплатных компьютера Raspberry Pi. Идеально подойдут модели 4B или 5 с 4/8 ГБ оперативной памяти. Можно использовать и Pi 3, но производительность будет скромнее. Важно, чтобы все платы в кластере были одной модели — это избавит от головной боли с драйверами и совместимостью. * 4 карты microSD (рекомендуется от 16 ГБ, класс скорости 10). По одной на каждую плату. * 4 блока питания. Критически важно! Каждой плате, особенно Pi 4/5, нужен свой качественный блок питания (5V/3A для Pi 4, 5V/5A для Pi 5). Попытка запитать всё через один порт USB-хаба гарантированно приведёт к нестабильной работе и внезапным перезагрузкам узлов. * Сетевой коммутатор (switch). Желательно гигабитный (Gigabit Ethernet) и с 5+ портами. Один порт пойдёт на подключение к вашей домашней сети, остальные — на «малинки». * 5 патч-кордов (Ethernet-кабелей). Один для связи коммутатора с роутером, четыре — для подключения каждой Pi. * Корпус или стойка. Можно купить готовый кластерный корпус (например, от Turing Pi) или собрать простую стойку из пластика или алюминия своими руками. Главное — обеспечить хорошее охлаждение. Я использовал набор алюминиевых стоек с вентиляторами.
Программное обеспечение: * Raspberry Pi OS Lite (64-bit). Без графической оболочки, чтобы не тратить ресурсы. Скачать можно с официального сайта. * BalenaEtcher или Raspberry Pi Imager для записи образа на карты. * SSH-клиент (встроен в Linux/macOS, для Windows подойдёт PuTTY или встроенный клиент в Windows 10/11).
Шаг 1: Подготовка и начальная настройка узлов
Начнём с подготовки каждой отдельной платы. Мы настроим их по идентичному шаблону, чтобы потом было проще управлять всем кластером.
-
Записываем ОС. Используем Raspberry Pi Imager. Его главное преимущество — возможность предварительной настройки (gear icon) перед записью. Задаём:
- Имя пользователя (
piили своё) и пароль. - Имя хоста (
node1,node2,node3,node4). - Включаем SSH.
- Настраиваем Wi-Fi (или оставляем только Ethernet).
- Устанавливаем локаль (часовой пояс, раскладку).
Записываем этот предварительно сконфигурированный образ на все четыре карты памяти. Это сэкономит массу времени.
- Имя пользователя (
-
Первичный запуск и обновление. Подключаем к каждой Pi питание, Ethernet и монитор с клавиатурой (только к первой для удобства). После загрузки логинимся и обновляем систему:
bash sudo apt update && sudo apt full-upgrade -y sudo apt install -y vim git net-toolsКомандаfull-upgradeобновит все пакеты, включая ядро.net-toolsустановит утилиты вродеifconfig. -
Настраиваем статические IP-адреса (ключевой момент!). Чтобы узлы всегда находили друг друга, зафиксируем за ними адреса в локальной сети. Отредактируем конфиг DHCP-клиента:
bash sudo vim /etc/dhcpcd.confВ конец файла для каждого узла добавим свои настройки. Например, дляnode1:ini # Node1 static configuration interface eth0 static ip_address=192.168.1.101/24 static routers=192.168.1.1 static domain_name_servers=192.168.1.1 8.8.8.8Дляnode2будет...102, дляnode3—...103, и так далее. Маска/24соответствует привычной255.255.255.0. Шлюз (routers) и DNS укажите свои (чаще всего это IP-адрес вашего домашнего роутера).Типичная ошибка: Неправильно указанная маска или конфликт IP-адресов. Убедитесь, что выбранные вами адреса (101-104) не входят в пул раздаваемых вашим роутером по DHCP.
После настройки на всех узлах выполните перезагрузку:
bash sudo reboot
Шаг 2: Организация сети и настройка беспарольного доступа SSH
Теперь наши узлы живут в сети. Самое время научить их доверять друг другу.
-
Проверяем связь. С основного компьютера или с
node1пингуем остальные узлы:bash ping -c 4 192.168.1.102 ping -c 4 192.168.1.103 ping -c 4 192.168.1.104Успешные ответы означают, что сеть работает. -
Создаём пару SSH-ключей на главном узле. Допустим,
node1будет нашим управляющим (master) узлом. Сгенерируем на нём ключ:bash ssh-keygen -t ed25519 -C "pi@node1"Просто нажимаем Enter на все вопросы, чтобы создать ключи без парольной фразы (для автоматизации внутри кластера это допустимо). -
Копируем публичный ключ на все узлы, включая самого себя. Используем утилиту
ssh-copy-id:bash ssh-copy-id pi@192.168.1.101 ssh-copy-id pi@192.168.1.102 ssh-copy-id pi@192.168.1.103 ssh-copy-id pi@192.168.1.104Вам нужно будет ввести пароль для каждого узла. После этого попробуйте зайти сnode1на, например,node2:ssh pi@192.168.1.102. Пароль запрашиваться не должен.Типичная ошибка: Проблемы с правами доступа к файлам
~/.ssh. Если что-то пошло не так, проверьте:chmod 700 ~/.sshиchmod 600 ~/.ssh/authorized_keys.
Шаг 3: Установка и настройка MPI (Message Passing Interface)
MPI — это стандарт для обмена сообщениями между процессами в распределённых вычислениях. Именно он позволит нам запускать одну задачу на всех четырёх ядрах (и более) нашего кластера.
-
Устанавливаем MPI на все узлы. Подключаемся к каждому узлу (или используем параллельное выполнение, но пока сделаем последовательно) и выполняем:
bash sudo apt install -y openmpi-bin openmpi-common libopenmpi-devЭта команда установит исполняемые файлы, библиотеки и заголовочные файлы OpenMPI. -
Создаём конфигурационный файл для MPI. На управляющем узле (
node1) создадим файлhostfileв домашней директории:bash vim ~/hostfileСодержимое файла:ini 192.168.1.101 slots=4 192.168.1.102 slots=4 192.168.1.103 slots=4 192.168.1.104 slots=4Здесьslots=4указывает, сколько процессов может быть запущено на каждом узле (по числу ядер у Raspberry Pi 4). Для Pi 5 можно указать больше. -
Тестируем MPI простой программой. Создадим на
node1тестовый файлhello_mpi.c: ```c #include #includeint main(int argc, char** argv) { int rank, size; char processor_name[MPI_MAX_PROCESSOR_NAME]; int name_len;
MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Get_processor_name(processor_name, &name_len); printf("Hello from processor %s, rank %d out of %d processorsn", processor_name, rank, size); MPI_Finalize(); return 0;} ```
-
Компилируем и запускаем на кластере. ```bash # Компилируем программу mpicc -o hello_mpi hello_mpi.c
Запускаем на всех узлах, указанных в hostfile
mpirun --hostfile ~/hostfile -np 16 ./hello_mpi
`` Ключ-np 16` говорит MPI запустить 16 процессов (4 узла * 4 слота). Если всё настроено верно, вы увидите 16 приветственных строк от всех ядер кластера, с указанием их ранга и имени хоста (IP-адреса).
Шаг 4: Тестирование производительности и запуск реальной задачи
Давайте проверим, что наш кластер действительно даёт прирост производительности.
Проверка результата: Тест скорости сети
Самый простой тест — проверить пропускную способность между узлами с помощью iperf3.
1. На узле node2 запустим сервер: iperf3 -s.
2. На узле node1 запустим клиент: iperf3 -c 192.168.1.102 -t 30.
3. В выводе смотрите на строку [ ID] Interval Transfer Bitrate. Для гигабитной сети реальная скорость должна быть около 900+ Мбит/с. Если скорость низкая (100 Мбит/с), проверьте кабели и коммутатор.
Запуск параллельных вычислений: расчёт числа π
Для демонстрации используем стандартный пример cpi, который часто идёт в комплекте с OpenMPI. Найдём и скомпилируем его:
# Находим пример (путь может немного отличаться)
find /usr -name "cpi.c" 2>/dev/null
# Допустим, он нашёлся в /usr/share/doc/openmpi/examples/
cd /usr/share/doc/openmpi/examples/
mpicc -o cpi cpi.c
Теперь запустим расчёт на разном количестве процессов и сравним время:
# Запуск на 1 процессе (фактически на одном ядре node1)
time mpirun -np 1 ./cpi
# Запуск на 4 процессах (на всех ядрах node1)
time mpirun -np 4 ./cpi
# Запуск на 16 процессах (на всём кластере)
time mpirun --hostfile ~/hostfile -np 16 ./cpi
Обратите внимание на время выполнения (real в выводе time). В идеале, увеличение числа процессов должно сокращать время расчёта. Однако накладные расходы на коммуникацию между узлами (по сети) всегда больше, чем между процессами на одной плате. Это наглядно демонстрирует разницу между многопоточностью на одном компьютере и распределёнными вычислениями.
Заключение: что дальше?
Поздравляю! Вы только что собрали и запустили свой первый мини-суперкомпьютер. Это фундамент для множества экспериментов. Куда можно двигаться дальше?
- Docker Swarm / Kubernetes (K3s): Превратите кластер в контейнерную платформу. K3s от Rancher — идеальный облегчённый Kubernetes для Raspberry Pi.
- Распределённый веб-сервер: Настройте nginx в качестве балансировщика нагрузки на несколько backend-нод с Apache или Python-приложениями.
- Hadoop/Spark: Установите экосистему для работы с большими данями и попробуйте обработать какой-нибудь крупный набор данных.
- Свои расчётные задачи: Напишите на C/C++ или Python с использованием MPI (библиотека
mpi4py) свою задачу, которую можно распараллелить.
Главное, что вы получили, — это практический опыт и понимание, как устроены большие вычислительные системы. И всё это — на столе, за относительно небольшие деньги.
Для вдохновения другими проектами на одноплатниках загляните в мои статьи: про установку минималистичной ОС DietPi на одноплатниках для экономии ресурсов, или как собрать мощный домашний NAS на NanoPi M4V2. А если захотите добавить кластеру «умных» функций, присмотритесь к Node-RED для визуальной автоматизации.
Удачи в экспериментах! Не бойтесь ломать и пересобирать конфигурации — это лучший способ научиться.
Понравилась статья?
Поставьте лайк и сохраните полезный материал в закладки.
Headless Raspberry Pi: Настройка без монитора через SSH — Полное руководство
Pi-hole на Raspberry Pi: Как я избавил всю домашнюю сеть от рекламы раз и навсегда
Nextcloud на Raspberry Pi: строим личное облако вместо Google Drive
Ретро-игровая консоль на Raspberry Pi: Полное руководство по установке и настройке RetroPie
Raspberry Pi как домашний сервер: что на нём можно запустить в 2024
Raspberry Pi в роли VPN-сервера: настраиваем WireGuard для всей домашней сети