Содержание
Представьте: ваш личный блог, портфолио или домашний медиа-сервер — всё это работает на маленьком, тихом, энергоэффективном устройстве размером с кредитную карту. Звучит как фантастика? В 2025 году это реальность благодаря Raspberry Pi — микрокомпьютеру, который изначально создавался для обучения программированию, но стал настоящим хитом среди энтузиастов, системных администраторов и тех, кто ценит контроль над своей инфраструктурой.
Однако есть проблема: одно устройство — одна точка отказа. Отключение электричества, сбой на плате, перегрев — и ваш сайт лежит. Решение — кластеризация: объединение двух (или более) Raspberry Pi в единую отказоустойчивую систему, где при падении одного узла второй мгновенно берёт на себя нагрузку без потери доступности.
В этой статье подробно разбирается процесс создания отказоустойчивого веб-сервера на базе двух Raspberry Pi 4. Рассмотрены все этапы: от выбора комплектующих до настройки автоматического переключения и получения бесплатных SSL-сертификатов. Всё — с примерами кода, конфигурационными файлами и пояснением каждого шага.
Зачем нужен отказоустойчивый кластер на домашнем уровне
Многие считают, что высокая доступность (High Availability, HA) — это прерогатива крупных компаний с дата-центрами и миллионными бюджетами. Однако реальность такова, что даже личный проект может критически зависеть от uptime:
- Портфолио для поиска работы — недоступность сайта в момент просмотра работодателем может стоить вакансии;
- Домашний медиа-сервер — семья не сможет смотреть фильмы при сбое;
- Блог с уникальным контентом — потеря трафика и доверия аудитории;
- IoT-проекты — умный дом, камеры наблюдения, датчики — всё это требует постоянного доступа к серверу.
Кластер из двух устройств решает эту проблему: если один узел падает, второй продолжает работать. Пользователи даже не заметят переключения.
Аппаратные требования: что нужно для построения кластера
Для создания отказоустойчивого веб-сервера потребуется следующее «железо»:
Raspberry Pi 4 (2 шт.)
Рекомендуется модель с 4 ГБ или 8 ГБ оперативной памяти. Почему именно Pi 4?
- Гигабитный Ethernet — обеспечивает быструю синхронизацию между узлами;
- USB 3.0 — для подключения SSD-накопителей;
- Четырёхъядерный процессор Cortex-A72 — достаточно мощный для веб-сервера с умеренной нагрузкой;
- Поддержка 64-битных ОС — важно для современного ПО.
SSD-накопители (2 шт., минимум 128 ГБ)
SD-карты — прошлый век. Они медленные, ненадёжные и быстро выходят из строя при интенсивной записи. Вместо них используйте:
- SSD-диск на 2.5" SATA;
- Корпус с питанием USB-C;
- Кабель SATA to USB 3.0.
Пример сборки:
- SSD Samsung 870 EVO 250 ГБ
- Корпус ORICO 2.5" USB 3.0
- Кабель SATA to USB 3.0
Блоки питания и ИБП
Стандартные блоки питания (5В/3А) подойдут для обычной работы. Но для отказоустойчивости нужен источник бесперебойного питания (ИБП). Варианты:
- Power Bank с функцией ИБП — например, Anker PowerCore+ с поддержкой passthrough;
- DIY-решение на базе 18650 аккумуляторов — для энтузиастов;
- Промышленный ИБП — если кластер размещён в серверной.
Минимальное время автономной работы — 2–3 часа. Этого достаточно для большинства кратковременных отключений электричества.
Сетевое оборудование
- Гигабитный коммутатор — для соединения Pi между собой и с роутером;
- Патч-корды — категории 5e или выше;
- Статический внешний IP — или DynDNS для доступа из интернета.
Установка операционной системы и базовая настройка
Для кластера рекомендуется использовать Ubuntu Server 22.04 LTS (64-bit). Почему не Raspberry Pi OS?
- Лучшая поддержка серверного ПО;
- Долгосрочная поддержка (5 лет);
- Стабильные репозитории и пакеты.
Шаг 1: Запись образа на SSD
Скачайте образ с официального сайта:
wget https://cdimage.ubuntu.com/ubuntu/releases/22.04/release/ubuntu-22.04.4-live-server-arm64.iso
Запишите его на SSD с помощью Raspberry Pi Imager или balenaEtcher. При первом запуске система автоматически расширится на весь объём диска.
Шаг 2: Настройка сети
Отредактируйте файл /etc/netplan/00-installer-config.yaml:
network: version: 2 ethernets: eth0: addresses: - 192.168.1.101/24 # Для первого узла - 192.168.1.102/24 # Для второго узла routes: - to: default via: 192.168.1.1 nameservers: addresses: [8.8.8.8, 8.8.4.4]
Примените настройки:
sudo netplan apply
Шаг 3: Обновление системы и установка базовых пакетов
sudo apt update && sudo apt upgrade -y sudo apt install -y vim htop curl wget git ntp openssh-server
Настройка виртуального плавающего IP-адреса с Keepalived
Keepalived — это демон, который управляет виртуальным IP-адресом (VIP), переключая его между узлами в зависимости от их состояния. Для пользователя сайт всегда доступен по одному и тому же адресу, даже если физически он работает на разных серверах.
Установка Keepalived
sudo apt install -y keepalived
Конфигурация первого узла (мастер)
Создайте файл /etc/keepalived/keepalived.conf:
vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass raspberry2025 } virtual_ipaddress { 192.168.1.110/24 } # Проверка доступности веб-сервера track_script { chk_nginx } } vrrp_script chk_nginx { script "/usr/bin/pgrep nginx" interval 2 weight 2 fall 2 rise 1 }
Конфигурация второго узла (бэкап)
vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass raspberry2025 } virtual_ipaddress { 192.168.1.110/24 } track_script { chk_nginx } } vrrp_script chk_nginx { script "/usr/bin/pgrep nginx" interval 2 weight 2 fall 2 rise 1 }
Запуск службы
sudo systemctl enable --now keepalived
После этого виртуальный IP 192.168.1.110 будет назначен первому узлу. При его падении — автоматически переключится на второй.
Установка и настройка балансировщика нагрузки HAProxy
HAProxy (High Availability Proxy) — это мощный балансировщик нагрузки, который распределяет входящие запросы между несколькими серверами. В нашем случае он будет работать на том же виртуальном IP, обеспечивая прозрачное переключение.
Установка
sudo apt install -y haproxy
Конфигурация
Отредактируйте файл /etc/haproxy/haproxy.cfg:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
frontend http_front
bind 192.168.1.110:80
bind 192.168.1.110:443 ssl crt /etc/ssl/certs/raspberrypi.pem
stats uri /haproxy?stats
default_backend http_back
backend http_back
balance roundrobin
server pi1 192.168.1.101:80 check
server pi2 192.168.1.102:80 check
Перезапуск службы
sudo systemctl restart haproxy
sudo systemctl enable haproxy
Теперь все запросы на 192.168.1.110 будут распределяться между двумя узлами.

Установка веб-сервера Nginx на оба узла
На каждом Raspberry Pi установите веб-сервер:
sudo apt install -y nginx
Базовая конфигурация
Отредактируйте файл /etc/nginx/sites-available/default:
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; index index.html index.htm index.nginx-debian.html; server_name _; location / { try_files $uri $uri/ =404; } # Health check endpoint location /health { return 200 "OK\n"; add_header Content-Type text/plain; } }
Создание уникальной страницы для каждого узла
Это поможет визуально определить, на каком узле сейчас работает сайт.
# На первом узле echo "<h1>Raspberry Pi Cluster - Node 1</h1><p>This is the primary server.</p>" | sudo tee /var/www/html/index.html # На втором узле echo "<h1>Raspberry Pi Cluster - Node 2</h1><p>This is the backup server.</p>" | sudo tee /var/www/html/index.html
Запуск Nginx
sudo systemctl enable --now nginx
Синхронизация файлов между узлами с rsync и inotify
Если вы обновляете контент на одном узле, он должен автоматически появиться на другом. Для этого используется связка rsync + inotify-tools.
Установка необходимых пакетов
sudo apt install -y rsync inotify-tools
Настройка SSH-ключа для беспрепятственной синхронизации
На первом узле сгенерируйте ключ:
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N "" ssh-copy-idАдрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.
Создание скрипта синхронизации
Создайте файл /usr/local/bin/sync_web.sh:
#!/bin/bash SOURCE_DIR="/var/www/html" DEST_DIR="Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. :/var/www/html" LOG_FILE="/var/log/web_sync.log" inotifywait -m -r -e modify,create,delete,move "$SOURCE_DIR" | while read path action file; do echo "$(date): $action on $file" >> $LOG_FILE rsync -avz --delete "$SOURCE_DIR/" "$DEST_DIR/" >> $LOG_FILE 2>&1 done
Сделайте скрипт исполняемым
sudo chmod +x /usr/local/bin/sync_web.sh
Запуск в фоновом режиме
Создайте systemd-юнит /etc/systemd/system/web-sync.service:
[Unit]
Description=Web Content Sync Service
After=network.target
[Service]
Type=simple
User=pi
ExecStart=/usr/local/bin/sync_web.sh
Restart=always
[Install]
WantedBy=multi-user.target
Запустите службу:
sudo systemctl enable --now web-sync
Теперь любое изменение в /var/www/html на первом узле будет мгновенно синхронизироваться со вторым.
Получение бесплатных SSL-сертификатов Let's Encrypt
Для обеспечения безопасности и доверия пользователей необходимо использовать HTTPS. Let's Encrypt предоставляет бесплатные сертификаты, которые автоматически обновляются.
Установка Certbot
sudo apt install -y certbot python3-certbot-nginx
Получение сертификата
Выполните на активном узле:
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
Сертификат будет автоматически добавлен в конфигурацию Nginx.
Синхронизация сертификатов между узлами
Добавьте в скрипт синхронизации:
rsync -avz /etc/letsencrypt/Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. :/etc/letsencrypt/
Автоматическое обновление
Certbot уже настроен на автоматическое обновление через systemd-таймер. Проверьте:
sudo systemctl list-timers | grep certbot
Тестирование отказоустойчивости: реальный сценарий переключения
Теперь пришло время проверить, работает ли кластер так, как задумано.
Тест 1: Проверка виртуального IP
ping 192.168.1.110
Вы должны получить ответ. Затем проверьте, на каком узле сейчас активен VIP:
ip addr show eth0 | grep 192.168.1.110
Тест 2: Имитация сбоя первого узла
На первом узле остановите Nginx:
sudo systemctl stop nginx
Keepalived обнаружит это через 2–3 секунды и переключит виртуальный IP на второй узел. Проверьте:
curl http://192.168.1.110
Вы должны увидеть страницу второго узла. В логах Keepalived:
tail -f /var/log/syslog | grep keepalived
Тест 3: Восстановление первого узла
Запустите Nginx снова:
sudo systemctl start nginx
Если приоритет выше, виртуальный IP может вернуться на первый узел (в зависимости от настроек).
Тест 4: Отключение питания
Физически отключите питание первого узла. Второй должен принять нагрузку за 3–5 секунд. Подключите питание обратно — кластер восстановится автоматически.

Мониторинг состояния кластера
Для постоянного контроля над состоянием кластера настройте мониторинг.
HAProxy Stats
Добавьте в конфигурацию HAProxy:
listen stats bind 192.168.1.110:8888 stats enable stats uri / stats auth admin:yourpassword
Теперь статистика доступна по адресу http://192.168.1.110:8888.
Telegram-бот для уведомлений
Создайте простой скрипт, который будет отправлять уведомления при переключении:
#!/bin/bash # /usr/local/bin/notify_failover.sh BOT_TOKEN="your_bot_token" CHAT_ID="your_chat_id" MESSAGE="⚠️ Failover detected! Virtual IP switched to $(hostname)" curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \ -d chat_id=$CHAT_ID \ -d text="$MESSAGE" > /dev/null
Добавьте вызов этого скрипта в секцию notify_master Keepalived.
Оптимизация производительности и энергопотребления
Настройка ZRAM
Raspberry Pi имеет ограниченную оперативную память. ZRAM создаёт сжатый swap в RAM:
sudo apt install -y zram-tools echo "ALGO=zstd" | sudo tee -a /etc/default/zramswap echo "PERCENT=50" | sudo tee -a /etc/default/zramswap sudo systemctl restart zramswap
Ограничение частоты CPU
Для снижения энергопотребления и нагрева:
sudo apt install -y cpufrequtils echo 'GOVERNOR="powersave"' | sudo tee /etc/default/cpufrequtils
Мониторинг температуры
vcgencmd measure_temp
Рекомендуется установить радиаторы или активное охлаждение при температуре выше 70°C.
Заключение: кластер Raspberry Pi как основа для обучения и продакшена
Построение отказоустойчивого веб-сервера на двух Raspberry Pi — это не просто техническое упражнение. Это практический способ понять принципы работы распределённых систем, балансировки нагрузки, синхронизации данных и автоматического восстановления.
Такой кластер подходит для:
- Обучения — отличная площадка для изучения DevOps-практик;
- Личных проектов — блог, портфолио, медиа-сервер;
- Тестирования — развёртывание новых технологий без риска для продакшена;
- IoT-инфраструктуры — умный дом, камеры, датчики.
При этом стоимость всего решения — менее 543 BYN, а энергопотребление — около 10–15 Вт на устройство. Это делает его экономически выгодной альтернативой облачным VPS для небольших проектов.
