Что такое Blue-Green Deployment (сине-зелёное развёртывание)?

«Что такое Blue-Green Deployment (сине-зелёное развёртывание)?» — вопрос из категории DevOps, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Blue-Green Deployment — это стратегия непрерывного развёртывания, направленная на исключение простоя (downtime) и минимизацию рисков при обновлении приложения. Суть заключается в поддержании двух идентичных производственных сред:

  • Blue (Синяя): Текущая активная версия приложения, обслуживающая весь пользовательский трафик.
  • Green (Зелёная): Новая версия приложения, развёрнутая параллельно в изоляции.

Типичный процесс для Node.js-приложения:

  1. Развернуть новую версию приложения в среде Green (например, на другом наборе серверов или в новых контейнерах).
  2. Провести все необходимые тесты (интеграционные, нагрузочные) на среде Green.
  3. После успешного тестирования перенаправить весь входящий трафик с окружения Blue на Green. Это делается мгновенно, обновляя конфигурацию балансировщика нагрузки (Nginx, AWS ALB, Kubernetes Ingress).
  4. Среда Blue остаётся «на подхвате» для мгновенного отката в случае проблем.

Пример конфигурации маршрутизации в Nginx:

# Исходное состояние: трафик идёт на Blue
upstream backend {
    server blue-app-1:3000;
    server blue-app-2:3000;
}

server {
    listen 80;
    location / {
        proxy_pass http://backend;
    }
}

# После переключения: трафик идёт на Green
upstream backend {
    server green-app-1:3000;
    server green-app-2:3000;
}

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

  • Нулевой downtime: Переключение трафика происходит мгновенно.
  • Быстрый и безопасный откат: При обнаружении критической ошибки в Green можно моментально вернуть трафик на проверенную Blue.
  • Упрощённое тестирование: Новая версия тестируется в реальной производственной среде, но без нагрузки.

Сложности:

  • Удвоение ресурсов: Требует поддержки двух полноценных сред.
  • Миграция состояния: Необходимо обеспечить согласованность данных (сессии, кэш, загрузки файлов) между средами или использовать общие для них сервисы (внешняя БД, Redis, S3).