← Назад в студию
📋 Обзор решения
🙏 Благодарность Артем Инвест
За возможность реализовать это масштабное решение и доверие в разработке архитектуры будущего!
Цель: Масштабируемая и отказоустойчивая инфраструктура с балансировкой нагрузки на 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% по сравнению с обычными серверами
- ✅ Балансировка: Равномерное распределение нагрузки
- ✅ Мониторинг: Полный контроль над инфраструктурой
- ✅ Гибкость: Легко масштабировать и изменять конфигурацию
← Назад в студию