Яндекс.Облако
322

Китайский за ночь, или как платформа MAXIMUM заехала в облако с помощью Yandex Cloud Boost

Yandex Cloud Boost - программа платформы Яндекс.Облако для компаний, которые разрабатывают свои цифровые продукты. Каждый новый участник программы может получить грант 200 000₽, индивидуальные консультации архитекторов Облака и их помощь в миграции, доступ к тестированию новых сервисов и закрытому сообществу участников для обмена опытом и знаниями. О своем опыте участия в программе рассказывает компания MAXIMUM EDUCATION.

В закладки

Задачка для тех, кто задает задачи

MAXIMUM EDUCATION - образовательная компания полного цикла с технологичной онлайн-платформой, которая позволяет школьникам со всех регионов России и стран СНГ получать доступ к высококачественным образовательным продуктам: подготовка к стандартизированным экзаменам (ЕГЭ, ОГЭ), профориентация, изучение английского языка, digitalskills (цифровые навыки), школьные предметы.

Бизнес образовательной компании полного цикла предполагает, что все должно быть свое: от учебников и методистов до образовательной онлайн-платформы. И сервера тоже были своими, но это привело к трудностям.

На данный момент аудитория MAXIMUM охватывает более 50 тысяч учеников по всей России и в странах СНГ. При этом мы же все понимаем, что китайский для сдачи зачета учат за ночь. Это определяет специфику работы сервисов, для которой характерна волнообразная дневная и сезонная годовая нагрузка и скачки от 500 до 6 тысяч RPS. В такой ситуации любой бизнес задумается о повышении отказоустойчивости, оптимизации расходов и автомасштабировании.

Что вообще требуется доказать?

Еще несколько месяцев назад вся инфраструктура MAXIMUM находилась в нескольких крупных российских ЦОД в виде физических серверов. Чем это было неудобно:

  • Строить отказоустойчивость на своем железе - долго и дорого (процесс занял бы месяца три плюс еще до двух недель пришлось бы ждать дополнительное оборудование, так как добавлять нагрузку на старое железо было невозможно. Пришлось рассчитывать точное количество ресурсов, придумать как лучше кластеризировать БД, поднять k8s, придумать, как балансировать нагрузку между ЦОД).

  • Система требует много мощностей в пике и очень мало в остальное время (без облака платить приходится всегда за пик).

  • Временное увеличение мощностей превращается в приключение (например, в январе ожидается повышение нагрузки на 25%; чтобы с ней справиться приходится заказывать железо и ждать, пока оно дойдет, потом разворачивать ПО и т.д., что в общем может занять более двух недель).

  • Потенциальная капитализация превращается в ежегодные операционные расходы.

Тем не менее переезд в облака долго откладывался. Главный аргумент: безрадостный результат сравнения мощностей, которые можно получить за один и тот же бюджет по привычной схеме и у «большой тройки» облачных провайдеров. К последним еще присоединились риски, связанные с №152-ФЗ, и головная боль с трансграничной передачей персональных данных. Вдобавок, платформа не разрабатывалась как cloud-native, что тоже не улучшало ситуацию.

Тем не менее, при подготовке к старту очередного учебного года, увеличение вычислительных мощностей слишком затянулось, нагрузка постоянно продолжала расти.

Было проведено новое сравнение с облачными решениями, только в этот раз DevOps-инженер компании MAXIMUM EDUCATION Александр Затеев предложил расширить стандартный список провайдеров платформой Яндекс.Облако, и это стало поворотным моментом.

После недолгих подсчетов, к моему огромному удивлению, получилось, что мы можем развернуть все необходимые нам мощности практически за те же деньги. Помимо этого, мы получали управляемый кластер БД и очередей (а чуть позже и Kubernetes), «резиновые» мощности в пару кликов и кучу всего другого – в общем, все прелести облачной инфраструктуры, да еще и на территории РФ. После пары экспериментов было принято решение переезжать.

Станислав Закрацкий
CTO MAXIMUM Education

Ожидания от перехода на облачные технологии сводились к пяти пунктам:

  • быстрое увеличение ресурсов CPU в 2 раза и RAM в 4 раза

  • отказоустойчивость приложений на уровне ЦОД

  • уменьшение операционных затрат путем использования управляемых сервисов

  • получение возможности вертикального и горизонтального масштабирования

  • уменьшение затрат на ресурсы путем использования различных ВМ и за счет поминутной оплаты ресурсов

Логика решения

Основная платформа построена как web/multitenant, включает бэкэнд двух мобильных приложений, две маркетинговые площадки, ряд внутренних корпоративных сервисов (OSS, COTS). В стек входят PHP, Node.js, Go, PostgreSQL, Redis, RabbitMQ и другие технологии.

В Яндекс.Облаке было решено использовать несколько сервисов: Cloud Compute, VPC, Object Storage, Managed Service for PostgreSQL, Managed Service for Kubernetes.

Миграция основного стека заняла одну ночь, весь переезд длился примерно 4 месяца и закончился 6 декабря. Все работы проводили два специалиста: технический директор Станислав Закрацкий и DevOps-инженер Александр Затеев, с участием службы технической поддержки Яндекс.Облака.

Здесь было бы круто сказать, что мы не испытали никаких сложностей, переехали и больше не знали бед, но это было бы неинтересно. Естественно, в процессе переезда вылезло много нюансов: где-то нам не хватило опыта и внимательности, где-то обычные технические проблемы. Например, версия управляемого кластера PostgreSQL была выше нашего продакшена, что усложнило миграцию из старого кластера; настройку ограничения одновременных соединений мы тоже увидели не сразу, а после инициального релиза кластер упал из-за сбоя в одной из зон доступности. Никто не ожидал, что такой большой переезд пройдет без осложнений – мы были готовы, но отдельно хочется выразить благодарность команде поддержки Яндекс.Облака, которая была постоянно на связи и оперативно помогали нам всю «релизную» ночь».

Станислав Закрацкий
CTO MAXIMUM Education
{ "author_name": "Яндекс.Облако", "author_type": "editor", "tags": [], "comments": 0, "likes": 4, "favorites": 0, "is_advertisement": false, "subsite_label": "yandex.cloud", "id": 99201, "is_wide": false, "is_ugc": false, "date": "Wed, 15 Jan 2020 11:42:06 +0300", "is_special": false }
0
{ "id": 99201, "author_id": 341856, "diff_limit": 1000, "urls": {"diff":"\/comments\/99201\/get","add":"\/comments\/99201\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/99201"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 341856, "last_count_and_date": null }
Комментариев нет
Популярные
По порядку
{ "page_type": "article" }

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "Article Branding", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cfovx", "p2": "glug" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Баннер в ленте на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "disable": true, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } }, { "id": 20, "label": "Кнопка в сайдбаре", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cgxmr", "p2": "gnwc" } } } ] { "page_type": "default" }