О чём эта история

Компания Mindbox занимается автоматизацией маркетинга и помогает своим клиентам настраивать грамотную коммуникацию: разрабатывает программы лояльности, рассылок и удержания покупателей. Проект растёт в среднем на 30% в год по количеству клиентов и объёму выручки, также компания активно расширяет команду.

В 2019 году Mindbox перенёс в Yandex Cloud API Gateway и большую часть микросервисов и в результате обновил технологический стек, снизил капитальные затраты на железо и увеличил доступность сервиса за счёт геораспределённости инфраструктуры. Чтобы соответствовать высоким требованиям Mindbox, команда Yandex Cloud оперативно улучшала свой сервис. В результате Mindbox переехал в облако без простоев, сохранил бюджет на инфраструктуру и железо и уже четыре года стабильно работает в Yandex Cloud.

Задача компании

Компания Mindbox существует уже 17 лет — помогает клиентам строить полезный маркетинг. Продуктом пользуются более 800 клиентов, среди них «Перекресток.Впрок», «Связной», Burger King, «Делимобиль» и другие компании с огромными базами данных о покупателях. К 2019 году у Mindbox было около 400 000 RPM к API, примерно 50 ТБ данных в реляционных базах и около 80 серверов в московском ЦОДе. При этом платформа Mindbox должна соответствовать жёстким требованиям: например, сервис должен рассчитывать персональные скидки для покупателя в режиме реального времени, всего за 150 мс.

В 2019 году главными задачами компании стали возможность масштабироваться и повышение отказоустойчивости сервиса. Решить эти задачи не давала текущая инфраструктура. Она состояла из ВМ, развёрнутых на физических серверах с помощью системы виртуализации Hyper-V, ОС Windows Server и Internet Information Services (IIS). Такая система не позволяла изолированно управлять сервисами и внедрять новые инструменты надёжности, такие как Blue-Green Deployment, Сanary Deployment и Infrastructure as Code (IaC).

Переносить систему в новый стек самостоятельно очень затратно: нужно было писать код для проверки работоспособности проекта, увеличить количество серверов примерно в 1,5 раза и набрать команду экспертов для поддержки нового стека. Все эти инфраструктурные задачи решили передать облачному провайдеру.

Чтобы масштабироваться и повысить отказоустойчивость, Mindbox ставила перед собой такие задачи:

  • обновить технологический стек;
  • получить доступ к новым инструментам надёжности;
  • сохранить текущий уровень затрат на инфраструктуру.

Требования Mindbox к облачным сервисам включали:

  • высокую доступность облачных сервисов;
  • свободный сетевой доступ подов к бэкенду и оптическое соединение облака и ЦОДа Mindbox. Так как высоконагруженные базы данных находятся в ЦОДе Mindbox, а поды Kubernetes‎®‎ должны свободно взаимодействовать с ними — читать и обновлять данные;
  • возможность горизонтального масштабирования;
  • отказоустойчивость;
  • мониторинг для отслеживания метрик, которые влияют на SLA сервиса.

Решение

Компания начала миграцию в ноябре 2019 года.

Сервисы с пользовательскими данными оставили в ЦОДе Mindbox, чтобы иметь к ним оперативный доступ, а в Yandex Cloud перевезли такие критические сервисы, как:

  • «Сервис API» — c высокими требованиями к доступности и SLA. От него зависят проведение сложных бизнес-транзакций и работа касс у некоторых клиентов.
  • «Сервис JS-трекинг» — нагруженный сервис с 150 000 RPM, который собирает информацию о поведении покупателей на сайте.
  • «Сервис рекомендаций».
Общая схема решения

Для работы гибридной инфраструктуры нужен надёжный канал обмена данными. Также по запросу Mindbox эти сервисы должны быть доступны по «серому» IP-адресу через VPN и Yandex Cloud Interconnect. Чтобы уменьшить потерю данных, сервис и внутренний балансировщик интегрировали с Yandex Cloud Interconnect и распределили нагрузку по разным зонам доступности. Теперь трафик из ЦОДа Mindbox через балансировщик распределяется на три ЦОДа в Yandex Cloud.

Команда Mindbox развернула сервисы в кластерах Yandex Managed Service for Kubernetes®. Чтобы поды Kubernetes® свободно взаимодействовали с бэкендом в ЦОДе Mindbox, для них сделали Source Nat и разрешили обращаться к удалённым ресурсам без перенастройки маршрутизации. Плюс этого решения в том, что у всех новых подов кластера Kubernetes® автоматически появляется сетевой доступ к ресурсам в ЦОДе Mindbox.

Одной из задач Mindbox было получить возможность увеличивать количество сервисов. Мешало то, что при росте числа сервисов в продакшн-кластере Mindbox росло и количество запросов к кластерному сервису Core DNS. В результате узлы Kubernetes® превышали лимит на 50 000 сетевых соединений, и поды не могли обращаться к другим ресурсам. Чтобы снизить нагрузку на виртуальную сеть, команда Yandex Cloud научилась сжимать DNS- и TCP-трафик. Это снизило нагрузку на сеть в десятки раз.

Настроили работу с метриками. Создали метрику network_connectiond.quota.utilization — с показателем расхода квоты на число сетевых соединений — и добавили метрики услуги Cloud Interconnect. А чтобы разработчикам Mindbox не нужно было переучиваться под новый формат работы с метриками, настроили экспорт данных в формат Prometheus®.

Миграция проходила не без проблем. Часть запросов к DNS в зоне доступности А в подсети Mindbox совершалась с ошибкой, и поды CoreDNS в этой зоне не могли обращаться к некоторым внешним ресурсам. Задача не решалась на стороне Kubernetes®, и её решили на стороне сети — через настройки DHCP сервиса Yandex Virtual Private Cloud. Теперь сервисы Mindbox будут работать стабильно, даже если DNS откажет сразу в двух зонах.

Во время миграции сервисов увеличивалось количество балансировщиков нагрузки в виртуальной сети Mindbox. Из-за этого объём запроса от VPC API облака к API Tungsten Fabric для создания правил балансировки достиг предела в 1 MB, и это не давало возможности создавать новые балансировщики. Команда Yandex Cloud внесла изменения в API самой сети — увеличила допустимый размер сообщения и сделала этот параметр настраиваемым. Это позволило снизить объём запроса до 600 КБ и оставить существенный запас для создания новых сервисов.

Миграция прошла без сбоев, сервисы Mindbox были доступны круглосуточно и стабильно. Удалось уложиться в бюджет.

За год с ноября 2019 года в Yandex Cloud перенесли ключевые и высоконагруженные сервисы Mindbox: API, «JS-трекинг» и «Сервис рекомендаций Mindbox».

После основного этапа миграции команда продолжила перенос оставшихся сервисов, практически весь проект перенесли в облако. Сейчас в собственной инфраструктуре компании остаются два сервиса: платформа клиентских данных, для которой компания использует быстрые SSD с доступом по протоколу NVMe, и сервис email-рассылки с собственными диапазонами IP-адресов.

Перенос платформы в облако позволил Mindbox сосредоточиться на архитектуре проекта. За три года команда полностью отказалась от релиза новых функций в монолите и перешла к рефакторингу кода с созданием микросервисов, эта работа продолжается.

Компания увеличила штат разработчиков в три раза. Это решение и новая облачная инфраструктура позволяют быстро разрабатывать и разворачивать новые сервисы. Сейчас запущено уже более 70 микросервисов. Одна из обновлённых функций — «Сценарии» — полностью заменила старую функциональность триггеров. Также на базе Object Storage команда Mindbox создала хранилище с архитектурой Data mesh.

Результаты

Компания обновила технологический стек. Теперь большинство микросервисов развёртываются по паттерну Service Per Team и работают под Linux в кластере Kubernetes®. Также используется модульная платформа для разработки .NET Core и кроссплатформенный веб-сервер Kestrel.

Подключили новые инструменты надёжности:

  • Health Checks в приложении. Если наблюдаются проблемы с работоспособностью одного из приложений, его останавливают без потери трафика, а с точки зрения клиента всё продолжает работать без сбоев.
  • Выкладка происходит через Graceful rollout и Canary — поды вводятся и выводятся по одному. Если что-то идёт не так, то выкладка останавливается автоматически.
  • При переезде сильно инвестировали в отказоустойчивость приложения: начали переход на микросервисную архитектуру и рефакторинг кода с использованием более актуального ПО, пересмотрели процессы и автотесты, увеличили объём тестовых окружений.
  • Инфраструктурные изменения тестируются с помощью Pull Request, как обычный код.

Платформа Yandex Cloud гибко и оперативно менялась, в том числе удовлетворяя запросы Mindbox. Команда Yandex Cloud научила балансировщик работать с Cloud Interconnect, создала сервис Настройки DHCP, улучшила масштабируемость API облака и мониторинг сетевых сервисов и метрик, добавила новые функции в сервисы платформы данных и Managed Kubernetes®.

За три года с момента миграции Mindbox обновила и нарастила вычислительные мощности. Например, команда перешла к использованию современных производительных CPU Intel Ice Lake. Сейчас в проекте задействовано более 10 тысяч таких vCPU в месяц. Параллельно растёт и объём используемых облачных сервисов, с момента переезда количество кластеров Kubernetes‎®‎ выросло с 2 до 30 и более.

Количество клиентов и объём выручки Mindbox растёт в среднем на 30% в год.

Мнение

Игорь Кудрин
CIO Mindbox
Игорь Кудрин
CIO Mindbox

Наши требования к надёжности и экономической эффективности долгое время не позволяли использовать облака. На российском рынке до Yandex Cloud просто не было провайдеров с полной поддержкой Terraform, гибким управлением правами и необходимым набором инфраструктурных компонентов. Одним из ключевых факторов успеха миграции стало тесное взаимодействие с командой Yandex Cloud, в частности с архитекторами сети и командой сервиса Managed Service for Kubernetes®. В результате миграции мы получили геораспределённую инсталляцию, сохранили экономическую эффективность нашего решения и смогли направить ресурсы на обновление кодовой базы, а не на поддержку инфраструктуры.