🚀 Предрелизная проверка

Архитектура будущего решения: Docker Swarm + Selectel

Масштабируемая и отказоустойчивая инфраструктура

← Назад в студию

📋 Обзор решения

🙏 Благодарность Артем Инвест
За возможность реализовать это масштабное решение и доверие в разработке архитектуры будущего!
3
Сервера с GPU
1
Manager Node
75%
Экономия
24ч
Макс. время работы
Цель: Масштабируемая и отказоустойчивая инфраструктура с балансировкой нагрузки на Ollama между GPU нодами и автовозобновлением прерываемых серверов.

Ключевые компоненты

🖥️ Сервера с GPU

  • 3x NVIDIA RTX 4090
  • Прерываемые инстансы
  • 24GB VRAM каждый
  • Автовозобновление

🎯 Manager Node

  • Обычный сервер
  • Не прерываемый
  • Swarm Manager
  • Мониторинг

🐳 Docker Swarm

  • Оркестрация
  • Балансировка
  • Health checks
  • Auto-recovery

🏗️ Архитектура кластера

┌─────────────────────────────────────────────────────────────────────┐ │ DOCKER SWARM CLUSTER │ │ │ │ ┌───────────────────────────────────────────────────────────────┐ │ │ │ MANAGER NODE (Observer) │ │ │ │ IP: 192.168.1.190 (предположительно) │ │ │ │ Role: Manager (Leader) │ │ │ │ Labels: node.role=manager │ │ │ │ │ │ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ │ │ Swarm Services (Non-GPU): │ │ │ │ │ │ • nginx (reverse proxy) │ │ │ │ │ │ • rag-chat-api (Flask) │ │ │ │ │ │ • analytics (Flask) │ │ │ │ │ │ • chromadb (vector DB) │ │ │ │ │ │ • monitoring (Prometheus/Grafana) │ │ │ │ │ └──────────────────────────────────────────────────────────┘ │ │ │ │ │ │ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ │ │ Swarm Control Services: │ │ │ │ │ │ • swarm-autoscaler (автовозобновление GPU) │ │ │ │ │ │ • swarm-monitor (мониторинг нод) │ │ │ │ │ └──────────────────────────────────────────────────────────┘ │ │ │ └───────────────────────────────────────────────────────────────┘ │ │ │ │ ┌───────────────────────────────────────────────────────────────┐ │ │ │ GPU WORKER NODE 1 (Preemptible Server) │ │ │ │ IP: GPU-NODE-1-IP │ │ │ │ GPU: NVIDIA RTX 4090 (24GB VRAM) │ │ │ │ Role: Worker │ │ │ │ Labels: node.gpu=true, node.gpu.model=rtx4090 │ │ │ │ ⚠️ Прерывается весь сервер (не только GPU) │ │ │ │ │ │ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ │ │ GPU Services: │ │ │ │ │ │ • ollama-1 (Ollama LLM) │ │ │ │ │ │ - Port: 11434 │ │ │ │ │ │ - Models: qwen3:30b, embeddings │ │ │ │ │ │ - Constraints: node.gpu=true │ │ │ │ │ └──────────────────────────────────────────────────────────┘ │ │ │ └───────────────────────────────────────────────────────────────┘ │ │ │ │ ┌───────────────────────────────────────────────────────────────┐ │ │ │ GPU WORKER NODE 2 (Preemptible Server) │ │ │ │ IP: GPU-NODE-2-IP │ │ │ │ GPU: NVIDIA RTX 4090 (24GB VRAM) │ │ │ │ Role: Worker │ │ │ │ Labels: node.gpu=true, node.gpu.model=rtx4090 │ │ │ │ ⚠️ Прерывается весь сервер (не только GPU) │ │ │ │ │ │ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ │ │ GPU Services: │ │ │ │ │ │ • ollama-2 (Ollama LLM) │ │ │ │ │ │ - Port: 11434 │ │ │ │ │ │ - Models: qwen3:30b, embeddings │ │ │ │ │ │ - Constraints: node.gpu=true │ │ │ │ │ └──────────────────────────────────────────────────────────┘ │ │ │ └───────────────────────────────────────────────────────────────┘ │ │ │ │ ┌───────────────────────────────────────────────────────────────┐ │ │ │ GPU WORKER NODE 3 (Preemptible Server) │ │ │ │ IP: GPU-NODE-3-IP │ │ │ │ GPU: NVIDIA RTX 4090 (24GB VRAM) │ │ │ │ Role: Worker │ │ │ │ Labels: node.gpu=true, node.gpu.model=rtx4090 │ │ │ │ ⚠️ Прерывается весь сервер (не только GPU) │ │ │ │ │ │ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ │ │ GPU Services: │ │ │ │ │ │ • ollama-3 (Ollama LLM) │ │ │ │ │ │ - Port: 11434 │ │ │ │ │ │ - Models: qwen3:30b, embeddings │ │ │ │ │ │ - Constraints: node.gpu=true │ │ │ │ │ └──────────────────────────────────────────────────────────┘ │ │ │ └───────────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────┘

Балансировка нагрузки

┌─────────────────────────────────────────────────────────────┐ │ Client Request │ │ POST /api/generate │ └──────────┬───────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ Nginx Load Balancer │ │ (Swarm Service, режим: Global или 3 replicas) │ │ │ │ upstream ollama_backend { │ │ least_conn; # Least Connections или round_robin │ │ server ollama-1:11434; │ │ server ollama-2:11434; │ │ server ollama-3:11434; │ │ │ │ # Health checks │ │ health_check interval=10s fails=3 passes=2; │ │ } │ │ │ │ location /api/generate { │ │ proxy_pass http://ollama_backend; │ │ proxy_read_timeout 600s; │ │ proxy_connect_timeout 10s; │ │ proxy_send_timeout 600s; │ │ } │ └──────────┬───────────────────────────────────────────────────┘ │ ├──────────────────┬──────────────────┐ │ │ │ ▼ ▼ ▼ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ Ollama-1 │ │ Ollama-2 │ │ Ollama-3 │ │ GPU Node 1 │ │ GPU Node 2 │ │ GPU Node 3 │ │ │ │ │ │ │ │ qwen3:30b │ │ qwen3:30b │ │ qwen3:30b │ │ (22GB VRAM) │ │ (22GB VRAM) │ │ (22GB VRAM) │ └──────────────┘ └──────────────┘ └──────────────┘

Распределение сервисов

Service Replication Strategy: ┌─────────────────────────────────────────────────────────────┐ │ Service │ Replicas │ Constraints │ ├─────────────────────────────────────────────────────────────┤ │ nginx │ 3 │ - (любая нода) │ │ rag-chat-api │ 3 │ - (любая нода) │ │ analytics │ 2 │ - (любая нода) │ │ chromadb │ 1 │ node.role=manager │ │ ollama │ 3 │ node.gpu=true │ │ swarm-autoscaler │ 1 │ node.role=manager │ │ swarm-monitor │ 1 │ node.role=manager │ └─────────────────────────────────────────────────────────────┘

Health Checks и Auto-recovery

┌─────────────────────────────────────────────────────────────┐ │ Health Check Strategy │ │ │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ Ollama Service │ │ │ │ ───────────────────────────────────────────────────── │ │ │ │ Health Check: │ │ │ │ test: curl -f http://localhost:11434/api/tags │ │ │ │ interval: 30s │ │ │ │ timeout: 10s │ │ │ │ retries: 3 │ │ │ │ start_period: 60s │ │ │ │ │ │ │ │ Auto-recovery: │ │ │ │ • Если health check failed → перезапуск контейнера │ │ │ │ • Если нода недоступна → перенос на другую ноду │ │ │ └────────────────────────────────────────────────────────┘ │ │ │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ RAG Chat API │ │ │ │ ───────────────────────────────────────────────────── │ │ │ │ Health Check: │ │ │ │ test: curl -f http://localhost:9004/api/status │ │ │ │ interval: 15s │ │ │ │ timeout: 5s │ │ │ │ retries: 2 │ │ │ │ │ │ │ │ Auto-recovery: │ │ │ │ • Если health check failed → перезапуск контейнера │ │ │ │ • Swarm автоматически перезапускает на другой ноде │ │ │ └────────────────────────────────────────────────────────┘ │ │ │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ Nginx │ │ │ │ ───────────────────────────────────────────────────── │ │ │ │ Health Check: │ │ │ │ test: curl -f http://localhost:80/health │ │ │ │ interval: 10s │ │ │ │ timeout: 3s │ │ │ │ retries: 2 │ │ │ └────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘

☁️ Selectel Cloud - Специфика провайдера

🙏 Благодарность Артем Инвест
За выбор Selectel как провайдера и возможность реализовать экономичное решение с прерываемыми серверами!
⚠️ Важно: Прерываются серверы с GPU (весь сервер), а не только GPU устройства.

Особенности прерываемых серверов

⏱️ Время жизни

  • Максимум: 24 часа
  • Может прерваться в любой момент
  • Без предупреждения
  • Автовосстановление через API

💾 Типы дисков

  • Сетевой диск: данные сохраняются
  • Локальный диск: данные теряются
  • Рекомендация: сетевой диск

🌍 Регионы

  • ru-1 (СПб) ✅
  • ru-3 (СПб) ✅
  • ru-7 (Москва) ✅
  • ru-8 (Новосибирск) ✅

API Selectel

# Базовый URL
https://api.selvpc.ru

# Аутентификация
X-Token: your_api_token

# Создание прерываемого сервера
POST /servers
{
  "name": "gpu-worker-1",
  "flavor": "gpu.rtx4090",
  "region": "ru-7",
  "preemptible": true,
  "boot_disk_type": "network"
}

# Восстановление сервера
POST /servers/{id}/actions/restore

Механизм автовозобновления

┌─────────────────────────────────────────────────────────────┐ │ Workflow: GPU Node Recovery │ │ │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ Phase 1: Detection │ │ │ │ ───────────────────────────────────────────────────── │ │ │ │ • swarm-autoscaler проверяет серверы через Swarm API │ │ │ │ • Обнаруживает отсутствие сервера с GPU │ │ │ │ • Проверяет, не восстанавливается ли уже сервер │ │ │ │ • Логирует событие │ │ │ └────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ Phase 2: Instance Creation │ │ │ │ ───────────────────────────────────────────────────── │ │ │ │ • Вызывает Cloud Provider API │ │ │ │ (AWS Spot, GCP Preemptible, Azure Spot) │ │ │ │ • Создает новый сервер с GPU │ │ │ │ • Ждет готовности сервера (обычно 2-5 минут) │ │ │ │ • Получает IP адрес нового сервера │ │ │ └────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ Phase 3: Server Setup │ │ │ │ ───────────────────────────────────────────────────── │ │ │ │ • Подключается по SSH к новому серверу с GPU │ │ │ │ • Устанавливает Docker (если нужно) │ │ │ │ • Устанавливает nvidia-docker (если нужно) │ │ │ │ • Настраивает Docker daemon на сервере │ │ │ │ • Устанавливает Swarm worker token │ │ │ └────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ Phase 4: Swarm Join │ │ │ │ ───────────────────────────────────────────────────── │ │ │ │ • Выполняет: docker swarm join на новом сервере с GPU│ │ │ • Сервер присоединяется как worker │ │ │ │ • Manager назначает labels (node.gpu=true) │ │ │ │ • Swarm автоматически перебалансирует сервисы │ │ │ └────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ Phase 5: Service Recovery │ │ │ │ ───────────────────────────────────────────────────── │ │ │ │ • Swarm автоматически запускает ollama на сервере │ │ │ • Health checks начинают проходить │ │ │ │ • Nginx автоматически добавляет в upstream │ │ │ │ • Балансировка восстановлена │ │ │ └────────────────────────────────────────────────────────┘ │ │ │ │ Общее время восстановления: 3-8 минут │ │ (время создания нового сервера с GPU) │ └─────────────────────────────────────────────────────────────┘

Сценарий восстановления при прерывании

График восстановления: ┌─────────────────────────────────────────────────────────────┐ │ T+0s: Сервер с GPU (Node 2) прерван │ │ • Весь сервер останавливается (не только GPU) │ │ • Swarm обнаруживает недоступность ноды │ │ • Контейнер ollama-2 помечен как down │ │ • Nginx исключает ollama-2 из upstream │ │ │ │ T+30s: swarm-autoscaler обнаруживает отсутствие сервера с GPU│ │ • Запускает скрипт создания нового сервера с GPU │ │ • Ждет готовности нового сервера │ │ │ │ T+2m: Новый сервер с GPU готов │ │ • Swarm обнаруживает новую ноду │ │ • Присоединяет к кластеру как worker │ │ • Запускает ollama-2 на новом сервере │ │ │ │ T+3m: ollama-2 health check проходит │ │ • Nginx добавляет ollama-2 обратно в upstream │ │ • Балансировка восстановлена │ └─────────────────────────────────────────────────────────────┘

🔧 Компоненты системы

Сервисы Swarm

Ollama (3 реплики)

  • LLM для генерации
  • Модель: qwen3:30b
  • Embeddings модели
  • Constraints: node.gpu=true

Nginx (3 реплики)

  • Reverse proxy
  • Load balancing
  • Health checks
  • SSL termination

RAG Chat API (3 реплики)

  • Flask приложение
  • REST API
  • SSE streaming
  • Widget generation

ChromaDB (1 реплика)

  • Векторная БД
  • Семантический поиск
  • Constraints: manager

Swarm Autoscaler (1 реплика)

  • Selectel API интеграция
  • Мониторинг серверов
  • Автовосстановление
  • Constraints: manager

Monitoring (1 реплика)

  • Prometheus
  • Grafana
  • Метрики и алерты

Отказоустойчивость

✅ Стратегия репликации:
  • Ollama: 3 реплики на разных GPU нодах
  • Nginx: 3 реплики для балансировки
  • RAG Chat API: 3 реплики
  • Автоматическое перераспределение при падении
  • Health checks каждые 30 секунд

💰 Оценка стоимости

🙏 Благодарность Артем Инвест
За возможность реализовать экономичное решение с экономией до 75% благодаря прерываемым серверам!
$0.75
Прерываемый GPU сервер / час
$0.15
Manager сервер / час
$2,400
В месяц (3 GPU + 1 Manager)
75%
Экономия vs обычные серверы
Сравнение:
  • Обычные серверы с GPU: $3-5/час = $8,640-14,400/месяц
  • Прерываемые серверы: $0.75-1.25/час = $1,620-2,700/месяц
  • Экономия: $7,020-11,700/месяц
⚠️ Важно: При прерывании сервера теряется только время на восстановление (3-8 минут), но не данные, если используются persistent volumes вне прерываемых серверов.

🚀 План миграции

Этап 1: Подготовка инфраструктуры

  • Создать 3 сервера с GPU (прерываемые инстансы)
  • Создать 1 обычный сервер (manager)
  • Установить Docker на все серверы
  • Установить nvidia-docker на серверы с GPU

Этап 2: Настройка Swarm

  • Инициализировать Swarm на manager сервере
  • Присоединить серверы с GPU как workers
  • Назначить labels на серверы с GPU (node.gpu=true)
  • Создать overlay network

Этап 3: Деплой сервисов

  • Создать docker-compose.swarm.yml
  • Настроить Nginx балансировку
  • Настроить persistent volumes (вне прерываемых серверов)
  • Деплой всех сервисов
  • Проверка health checks

Этап 4: Настройка автовозобновления

  • Разработка swarm-autoscaler
  • Интеграция с Selectel Cloud API
  • Тестирование восстановления после прерывания сервера
  • Мониторинг и алертинг

Этап 5: Миграция данных

  • Экспорт данных из текущей системы
  • Импорт в новую инфраструктуру
  • Проверка целостности данных
  • Переключение трафика

⚠️ Важные нюансы и ограничения

Прерываемые серверы

  • Прерывается весь сервер
  • Максимум 24 часа работы
  • Может прерваться в любой момент
  • Восстановление: 3-8 минут

Распределение моделей

  • Модели ~22GB на сервер
  • Shared volume (NFS) рекомендуется
  • Или репликация при старте
  • Кэширование в Docker volumes

Балансировка

  • Least connections стратегия
  • Health checks каждые 10s
  • Автоматическое исключение
  • Long polling для streaming

Мониторинг

  • Доступность серверов
  • Загрузка GPU (VRAM, utilization)
  • Время ответа Ollama
  • Количество прерываний

✅ Заключение

🙏 Огромная благодарность Артем Инвест!
За доверие, возможность реализовать это масштабное решение и поддержку на всех этапах разработки архитектуры будущего!

Преимущества решения:

  • Масштабируемость: Легко добавлять новые GPU ноды
  • Отказоустойчивость: Автоматическое восстановление при прерывании
  • Экономия: До 75% по сравнению с обычными серверами
  • Балансировка: Равномерное распределение нагрузки
  • Мониторинг: Полный контроль над инфраструктурой
  • Гибкость: Легко масштабировать и изменять конфигурацию
📚 Документация:
← Назад в студию