Как мы помогли перейти школам на дистанционку и справились с нагрузкой

    Привет, Хабр! Меня зовут Алексей Вахов, я технический директор Учи.ру. В середине марта, когда школы начали переходить на дистанционное обучение, мы предоставили учителям и школьникам несколько сервисов для онлайн-занятий. По нашим расчётам, у нас был запас прочности, чтобы выдержать максимум в 1,5-2 раза больше нагрузки. В середине апреля наш трафик вырос в 8 раз. Пришлось сделать много, чтобы удержаться на плаву. Возможно, кому-то пригодится наш опыт, чтобы пережить этот или будущий кризис.

    Мы не ожидали таких сюрпризов и не были к ним готовы, к такому не была готова, наверное, ни одна компания в России, да и в мире. Обычно в марте активность на Учи.ру ниже относительно осени из-за весенних и приближающихся летних каникул, в это время мы уже готовимся к сентябрю: пилим фичи, делаем рефакторинг, проводим масштабные архитектурные изменения и занимаемся другой приятной рутиной. Однако в этот раз все было по-другому.

    Пиковое количество уникальных пользователей на сайте единовременно достигло 240 тысяч, предыдущий максимум текущего учебного года мы фиксировали на 30 тысячах человек. К этому моменту нагрузка росла каждый день, а мы круглосуточно работали над стабилизацией сайта.

    Когда на сайт обрушивается такая нагрузка, как правило, складываются приложения, сервисы, балансеры, базы, веб, каналы. Обнажаются все «‎бутылочные горлышки»‎ инфраструктуры. В таких условиях тяжело диагностировать проблемы — симптоматически глючит абсолютно всё. Чинить просто, когда трафик растет плавно и ломается что-то одно. Когда же нагрузка идет шквалом, одна из больших проблем — понять причины сбоев.

    Стратегия работы в таких условиях — устранять то, что бьет по сайту сильнее всего, затем находить следующую самую больную точку, одновременно искать потенциальные проблемы и исправлять их, и так далее. Вот некоторые наиболее заметные вещи, которые мы сделали, чтобы стабилизировать платформу.

    Положились на себя


    Во время кризиса перед трафиком вы как команда становитесь одни. Именно от ваших сотрудников и будет зависеть, найдете ли вы решения, справитесь с кризисом, или нет.

    В индустрии не существует людей, которые бы пришли, заглянули в вашу сложную систему, сходу что-то сделали и всё бы стало хорошо. Конечно, в мире есть достаточно специалистов, которые справятся с задачей при наличии времени. Но когда фундаментальное решение нужно прямо сейчас, можно рассчитывать только на свою команду, которая знает систему и ее специфику. Результат и ответственность перед бизнесом лежит на команде. Внешнюю экспертизу целесообразно подключать точечно.

    Быстро сориентироваться и выстроить работу нам в том числе помогла оперативная координация антикризисной команды в специальном чате в Slack — все вопросы решали здесь и сейчас. Мы разделили зоны ответственности между сотрудниками, чтобы не возникало пересечений и ребята не делали двойной работы. В самые сложные дни приходилось быть на связи буквально круглосуточно.

    Расширили облако


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

    Изначально мы увеличивали ресурсы под возросшую нагрузку, но в какой-то момент уперлись в квоты региона нашего облачного провайдера. Проблемы возникли и на его уровне: наши виртуальные сервера аффектили соседи, на которых трафик также вырос, из-за чего возникали сбои в работе наших приложений. Это было ожидаемо: мы зависим от провайдера и от его инфраструктуры, которая в свою очередь тоже испытывала высокую нагрузку. Часть ресурсов с неприоритетных виртуальных машин мы освободили для основного сайта. С провайдером мы договорились о выделенном ресурсе.

    Модернизировали инструменты мониторинга


    В кризис алертинг фактически перестал выполнять свою функцию. Все члены команды и так наблюдали за всеми системами круглосуточно, а инцидент-менеджмент сводился к постоянной работе по всем фронтам. Для полноценной диагностики проблем, с которыми мы столкнулись, у нас оказалось слишком мало данных. Например, для мониторинга виртуальных машин мы используем стандартный Node Exporter для Прометея. Он хорош, чтобы видеть общую картину, для более пристального изучения отдельной виртуальной машины стали использовать NetData.

    Оптимизировали кеш-хранилища


    Проблема возникла также и с хранилищами key-value. В одном из приложений Redis не справлялся — в единственном экземпляре он может работать только на одном ядре. Поэтому использовали форк Redis под названием KeyDB, который может работать в несколько потоков.

    Чтобы повысить пропускную способность в другом приложении, мы подняли 10 независимых Redis’ов. Их проксирует наш Service Mesh, который также шардирует по ключам. Даже если один или два Redis’а выйдут из строя, это не создаст проблем из-за консистентного хеширования. Плюс их практически не нужно администрировать.

    Расширили сеть


    Как вы знаете, 640 Кб хватит всем. Мы всегда использовали приватные подсети /24, но на фоне карантина пришлось экстренно расширять до /22. Теперь сеть вмещает в четыре раза больше серверов, надеемся, точно будет достаточно.

    Вынесли PgBouncer отдельно


    В качестве реляционной базы данных мы везде используем PostgreSQL, где-то небольшие инстансы-виртуалки, а где-то — установку из нескольких больших выделенных серверов под мастер и реплики. Очевидное узкое место такой архитектуры, это мастер, который в идеальном случае используется только для записи и не масштабируется горизонтально. С ростом трафика мы начали упираться в CPU.

    В то же время для управления соединениями мы используем PgBouncer, который был установлен на мастере и на каждой реплике. На одном порту он может использовать не больше одного ядра процессора, поэтому на каждом сервере у нас было по несколько баунсеров. В какой-то момент стало ясно, что сам по себе PgBouncer отнимает у базы ощутимую часть CPU, а при максимальной нагрузке мы испытывали стремительный рост load average и падение производительности системы.

    Мы вынесли баунсеры на отдельный сервер, что помогло нам сэкономить 20-25% CPU на каждом сервере баз данных.

    Столкнулись с сюрпризами


    Только одному инструменту нельзя доверять, особенно в кризис. Наоборот, избыточность инструментария помогает, потому что дает возможность увидеть более объективную картину. Привычные инструменты начинают отказывать по самым разным причинам. Например, обычно для оценки количества людей на сайте мы обычно используем real-time отчет Google Analytics, это чуткая и точная метрика. Но иногда он глючит и в этот раз нам пришлось смотреть на внутренние метрики вроде количества событий просмотра страницы и количества запросов в секунду.

    Для централизованного логирования используем ELK. Наш конвейер доставки логов основан на Apache Kafka и Elastic Filebeat. Под высокой нагрузкой конвейер доставки логов перестал справляться, логи стали теряться или отставать. Мы увеличили скорость передачи логов и индексации хранилища за счет манипуляций с индексами Elasticsearch, увеличения количества партиций в Kafka и Filebeat, тонко настроили сжатие на всех этапах. Благодаря тому, что пайплайн сбора логов отделен от продакшена, проблемы с возросшим трафиком логов не оказывали никакого влияния на функционирование сайта.

    Приняли правила игры


    Невозможно подготовиться к каждому кризису заранее, но можно изначально стараться построить гибкую систему. Стартапу или компаниям, которые постепенно перестают быть стартапами, в спокойное время не всегда рационально готовиться к аномальному росту трафика: ресурсы команды ограничены. Если отвести их подготовке к тому, чего, возможно, никогда не произойдет, не останется сил на основной продукт. Гораздо важнее правильно среагировать в моменте и не бояться смелых решений. Как правило, выход их кризиса — это выход на качественно новый уровень.

    Вот такая в этом году веселая весна. Когда кажется, что всё возможное сделано, порой оказывается, что это лишь начало.
    Учи.ру
    Крупнейший EdTech в школьном образовании

    Комментарии 30

      +1

      Какое облако используете?

        +1
        В России используем Селектел. Другие продакшены в амазоне и гугле.
          0

          вот как раз хотел уточнить, а можно ли хранить данные детей на зарубежных серверах. скажем, пусть эти данные анонимизированы?

            +1
            ФЗ говорит про персональные данные (а где заканчиваются ПД и начинаются не ПД грань очень тонкая), мы MVP пилили на Хероку в 2012, потом переехали на арендованные дедики и потом в Селектел. Чтобы было проще продакшены поднимаем в той стране, где работаем, юристы довольны. С Вашим вопросом лучше посоветоваться со специалистом, там своя атмосфера :)
        +1
        Не берусь говорить конкретно о Учи.ру,
        но сам так называемый «дистант» оказался таким отстоем,
        что даже отчаянные двоечники скучают по очной школе
          +1
          По очной школе и родители скучают!)
          +6
          Да, не утонули это вы сильно сказали. ) Сайт это время глючило и лихорадило постоянно. Сын на нем занимается.
          Да и вопрос: Как происходит так, что учителя в школе навязывают этот ваш сайт? Сами регистрируют учеников, просят решать бесплатные карточки каждый день.
            –1
            Педагоги сами выбирают платформу для работы, никто их ни к чему не принуждает.
              +1
              Ага ) сами, в приказном порядке. Учи ру ещё ничего, вот кого бы хотелось поставить в интересную позу, так это создателей Онлайн дневника, который конечно тоже, сами преподаватели выбирают. Да так, что потом директор школы накидывает на вентилятор угрожая учителям, а те в свою очередь ученикам и родителям. Мой сын во втором классе к слову.
                0
                Ничего они сами не выбирают в своем большинстве. Им что спустили сверху — то и втюхивают ...(((
                0
                Учи.ру — платформа для дополнительного образования, учитель может рекомендовать выполнение заданий для повторения пройденного материала
                +1
                Просто переползли в другие места вацап/вайбер эл.почта.
                Вспоминая как вы лежали по началу, это было эпично.
                Ну и проплата на месяц у многих заканчивается, как и деньги и все подзабили.
                Кстати, не буду читать мораль, но за месяц денег вы подняли хорошо: в рейтингах самый ленивый платник, кратно опережал активного бесплатника. Поэтому родители массово раскошеливались.
                  0
                  Да, нас тоже «порадовал» этот момент. Когда первое время ты мог посмотреть свои ошибки и по сути учиться благодаря сайту. А потом кончился период. И началось то, о чем вы пишете «ленивый платник, кратно опережал активного бесплатника».
                    0
                    Сразу озвучу, что я мимокрокодил и вообще не в курсе. Этот цирк с дистанционной школой ещё и платный что-ли?
                      0
                      В день можно сделать 20 заданий бесплатно. Хочешь больше — оформляй подписку. А там игровые моменты и детей затягивает и они начинают гонку кто больше яиц соберет, а потом расстраиваются, когда какой-нибудь «ленивый платник» кратно опережает по количеству очков.
                        0
                        Все сервисы Учи.ру для дистанционного образования бесплатны: виртуальный класс, онлайн-уроки, вебинары для учителей и родителей. Бесплатными остались также и основные курсы и задания во время занятий с учителем, а также 20 заданий в день. Оплата полной версии подписки снимает ограничение на количество заданий, которые можно сделать за день.
                          0
                          Бесплатно там с 9 утра, до половины пятого вечера. соответственно к обеду всё стояло и лежало.
                          Платно — круглосуточно, плюсом какие-то плюшки ещё.
                          Плюс — за активное бесплатное участие дают скидки на платные подписки, процентов 10-30.
                        0
                        Здравствуйте! А что за квоты «в квоты региона нашего облачного провайдера»? Селектел вас «рубил»?
                          0
                          Да, у них закончился один регион и пришлось перебрасывать часть серверов других проектов в другие регионы, чтобы расчистить место. Плюс там есть нюансы разные неочевидные, например большие и нагруженные машины (12 ядер) если попадут на один хост могут начать аффектить друг друга. Это видно по steal time виртуалки, у нас давно стоит алерт и по запросу машину мигрируют на другой хост.

                          Вообще каждая из проблем скейлирования была в целом не прямо супер сложная, но когда все навалилось одновременно, было очень тяжело :)
                          0
                          а стек hashicorp(nomad, consul, vault) до сих пор используете?
                            0
                            Ага, все еще используем их всех. И terraform :)
                            0
                            Ну что, для начала пожелаю проекту УЧИ.РУ удачи. Она ему лишней не будет.

                            По поводу статьи и комментариев выше. Да, господа. За ностальгию спасибо. Давненько я 502-ой ошибки не видел. Уже соскучиться успел. Сам факт возникновения ошибки в процессе выполнения задания учениками — это, безусловно, совсем не плюс в карму. Но за возможность в такой ситуации смело жать F5 (reload) — спасибо. Без этого было бы совсем грустно. Молодцы что хоть как-то справились с нагрузкой.

                            По своему классу могу сказать так — если бы проблем не было с самого начала, то, вполне возможно для вас и выхлоп был бы побогаче. Двое родителей из 30 оформили платную подписку. Я еще думаю. И дело даже не в том, что в учетом спец-предложений мне ребенку 5 тысяч в год на подписку жалко (хотя, для подавляющего большинства родителей и это сумма весьма не маленькая). Дело в том, что из-за того что решалось все в пожарном режиме нет никаких гарантий того, что после карантина все продолжит работать. А проблемы были и до массового наплыва пользователей. У сестры ребенок (Ленинградская область) занимается на этой платформе с осени. И 502 Bad gateway выскакивала регулярно. Потому простите, но… От подписки я пока воздержусь. Посмотрим что будет с порталом дальше.

                            И еще немного оффтопика. Т.е. о тех ваших конкурентах, с которыми довелось столкнуться. Яндекс.Учебник держался лучше. Хотя первые дни тоже падал. Видимо популярность порталов (и их фанансовые возможности, конечно) что-то да значат. Сложно сравнивать УЧИ и Яндекс. УЧИ однозначно богаче в плане программы и интереснее в плане обучения. С другой стороны, именно для дистанционного обучения он подходит хуже. Не получается с ним у ребенка рабочего настроя. Тут надо быть педагогом, но… я, как родитель, больше доволен форматом Яндекса. Третья платформа, с которой пришлось поработать на карантине — это Quizlet. У нас тут был только Английский. Но, черт возьми, именно она оказалась самой надежной (не спорю — возможно в силу сильно меньшей популярности) и самой образовательной. Вот ее ребенок никогда не воспринимал как игру. Там всегда было ощущение того, что на уроке.

                            Законцу, пожалуй, ровно тем с чего начал. Еще раз пожелаю удачи проекту УЧИ.РУ. Возможно, мы с вами еще поучимся. ;)
                              0
                              Здравствуйте! Спасибо за пожелания, будем работать на ошибками. 502 экранами мы сами, конечно, не довольны, назовем это, скажем, духом стартапа, который до сих пор с нами. Но если серьезно, то с трафиком карантина команда справилась отлично. Конечно, там было много вещей, которые можно было сделать было более толково, и несколько падений были уже из-за стресса и человеческого фактора. Однако ситуация была откровенно форс-мажорная, и так на нагруженную и оптимизированную много раз платформу пришло аномально много трафика.

                              По поводу конкурентов, думаю у IT-отделов всего edTech были сложные времена, так же как у сервисов видео-связи. Будем стараться быть на уровне даже в кризисные моменты. По поводу сравнения продуктов, спасибо за обратную связь! Переслал ваш комментарий в продуктовый чат. Наверное не смогу дать объективный ответ, у меня гигантская ошибка наблюдателя в пользу нашего продукта. Я помню первые 4 страницы проекта, они есть во внутреннем музее, Если не изменяет память, даже первый урок MVP учи.ру в реальной школе пришлось проводить мне, так как Иван-основатель компании, проспал :) Я уже 7 лет работаю в компании, поэтому для меня — учи.ру лучше всех :)) Постараемся пореже огорчать пользователей отказами и будем рады видеть вас на платформе!

                                0
                                Отлично. При таком настрое мы точно поучимся. У меня еще и младших подрастает.

                                Давайте я добавлю еще немного обратной связи для продуктового чата. Страница со статистикой для родителей сильно перегржена информацией. У меня при взляде на нее разбегаются глаза. Много цифр, среди которых не так просто найти нужную. Пнимаю — субьективно. Но дело в том, что я-то IT'шник. А как себя будет чувствовать в этом ворохе условный продавец из пятерочки? Следуя принципу «критикуешь — предлагай» предлагаю: сделайте сводную статистику. График практически бесполезен. Возможно он же в виде диаграмы, был бы более информативен. Сверху или снизу разбивка по периодами (день, неделя, месяц, четверть, год) и графики потраченного времени на предмты и праздное сидение на сайте. Ровно так же не очевидно что делать с информацией по темам. Потрачено времени, ладно. А заданий vs ошибок о чем мне должно сказать? Много ошибок это хорошо (учился, осваивал) или плохо (не понимает тему)? В итоге лично у меня остается ощущение, что продукт сделан либо для «любителей больших циферок», либо для преподавателей, которые как-то способны эти цифры интерпритировать. Но страница-то адресована родителям.

                                Дети, конечно, быстрее и веселее разбираются с функционалом. Мой учится в третьем. Возможно, тут есть какие-то возрастные моменты. Но ведь вы не заостряете на этом внимание? Быстро нашли чат класса и… Кто-то сомневался, что они будут использовать его не по назначению? Особенно если в нем есть смайлики. Особенно если уесть что дети нынче делятся на три части. Одним планшеты-компьютеры запрещены (ура — дорвались), другим разрешены и не ограничены (ух-ты что здесь есть? а если так?), и наконец у третьих их просто нет и они вообще не понимают как этим пользоваться. При чем все три группы вполне комфортно уживались в рамках класса, а тут на тебе. Если честно я не знаю что с этим делать. Наверное ничего. Потому как целевая аудитория включает только одну группу, а дистанционное обучение это вынужденная мера. Скорее сайт должен быть допонительным образовательным ресурсом. В этом смысле он вполне хорош.

                                Кнопка «онлайн уроки» эту мысль только подтверждает. Если я на нее нажимаю сейчас, то мне открывается целый список, разбитый на классы начальной школы. Зачем это мне? У меня третьекласник. В идеале я бы хотел видеть уроки, синхронизированные со школьной программой. Возможность повторить урок у другого преподавателя — это было бы интересно. Мне очень нравится то, что сделали в плане уроков Знайка.ру Нам эпизодически скидываю ссылки на их видеоуроки на YouTube (к слову отдельная тема — третьекласник, деткий аккаунт, закрытый «взрослый» youtube). В идеале что-то подобное должно быть и у вас в соответствующем разделе.

                                И под конец повторю свою предыдущую мысль. Мне кажется, что даже для третьего класса сайт слишком «мыльтяшный». Понятно, это стимулирует. Но мне почему-то кажется что такое количество анимации хорошо для первого, ну может быть второго класса. Тут уже вполне состоявшиеся школьники. Впрочем, не знаю. Как родитель я вижу одну простую вещь — ребенку нравится заниматься на УЧИ.РУ но при этом он в процессе занятий решает карточки методом тыка, а не методом обдумывания. И платформа именно такое его поведение всячески стимулирует.
                              0
                              ну, лихорадило вас пару дней точно. а в остальном интересно узнать как все это устроено. Сюда бы еще призвать разработчиков с дневника и узнать делают ли они там хоть что-то, этих до сих пор лихорадит и все троит.
                                0
                                Устроено на удивление штатно, но, конечно, уже масштабно, много логики и связей. NGINX, docker-кластер (nomad), Postgresql кластер, шардированный redis. Основная серверная терхнология — RoR. Будем потихоньку рассказывать, мы недавно блог завели на Хабре, учимся.
                                0
                                avakhov, VasilevaD здравствуйте! Простите за возможный оффтоп, но не знаю куда еще задать вопрос чтобы получит ответ.
                                Ребенок занимается в первом классе на вашей платформе. Так вот, когда учитель начинает урок, он выбирает задания (карточки) на этот урок. А как школьнику понять какие именно задания выполнять?? Ваша поддержка в ВК дала ответ: «Выполнять задания, на которые указывает динозавр Гриша». Т.е. пока идет урок (1час) сначала нужно отыскать задания и только потом их решать — за такой поиск тоже нужно баллы начислять) Разве не лучше было бы сделать отдельную карточку (кабинет), в которой собрать задания на урок по всем предметам? Это сильно облегчит жизнь и родителей и учителей. Сейчас учитель перед началом урока скидывает в группу whatsapp задания и родители начинают с поиска нужной темы и карточки.
                                  0
                                  Здравствуйте! У нас есть раздел «Задания от учителя», где учитель может назначить ребенку конкретные карточки для решения как до начала урока, так и после, в качестве домашнего задания. Они появятся в плашке с соответствующим названием. На время карантина за эти задания бусины не снимаются. Насколько мы поняли, ваш учитель включает занятие по кнопке «Начать урок». В этом случае ученик может выполнять любые карточки, например, рекомендованные самим учителем или динозавром Гришей. В этом случае, действительно, выбранные учителем карточки не собираются в одном месте. Передали ваши комментарии команде разработки, постараемся решить эту проблему в будущем
                                  0
                                  Утонуть не утонули, но булькали знатно. Мы с сыном наблюдали.
                                  Но у меня есть много сказать по поводу вашей платформы. Что я сейчас и сделаю.
                                  Больше всего нас огорчил невразумительный интерфейс заданий. Не всегда понятно, что именно нужно сделать — даже мне, не говоря о 7-летнем ребенке. Особенно весело, когда меняется только заголовок карточки с заданием. Ребенок не смотрит на него и не понимает, что же делать — он не видит, что после ответа карточка как бы обновилась. Неясно, на что можно нажимать, а на что нет. Непонятно, как вводить ответ — либо жать курсором, либо таскать им, либо вводить с клавиатуры.
                                  Это мы, взрослые, привыкли к тому, что современные интерфейсы невнятные и активным элементом может быть даже пустое место, а для детей лучше «материальный» дизайн с объемными элементами.
                                  Плюс прямо во время работы вылезали окна с сообщениями, что кто-то что-то получил или выиграл. Зачем?..
                                  А уж для детей с нарушениями зрения ваша платформа откровенно враждебна. Бледные пастельные цвета, мелкий (относительно) шрифт, озвучка заданий местечковая.
                                  Пару раз смотрели видеоуроки — это был ппц. В одном было одновременно два звука, в другом звук один, но очень тихий, и на заднем плане хор других уроков…
                                  Раз уж берете деньги за всё это, так поработайте над качеством и доступностью.
                                    0
                                    На платформе представлены задания разных лет, начиная с 2015 года. С того момента наш подход к разработке менялся. Мы проводили юзабили-тестирования с школьниками и устраняли недочёты интерфейса в новых заданиях: меняли вид элементов, добавляли микроанимации и подсказки. Тестируем новые задания в том числе на мониторах с плохой цветопередачей и следим, чтобы все элементы, необходимые для прохождения задания были контрастны относительно фона и друг друга. Надеемся, что сможем в обозримом будущем обновить и старые задания тоже.
                                    Мы знаем, как легко отвлечь и сбить с мысли, так что сообщения о полученных баллах появляются между заданиями, но никак не во время прохождения.
                                    Основной шрифт в заданиях для 0-4 класса 24pt при рекомендации СанПин не менее 16pt.

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

                                  Самое читаемое