Перетяжка, Премия ТПрогер, 13.11
Перетяжка, Премия ТПрогер, 13.11
Перетяжка, Премия ТПрогер, 13.11

Как построить систему, которая не боится сбоев: опыт VK

Аватарка пользователя Татьяна Жукова
для
Логотип компании Tproger
Tproger
Отредактировано

Узнайте, как построить системы высокой доступности (HA), которые минимизируют сбои и обеспечивают бесперебойную работу. Вместе с экспертом VK разбираем ключевые элементы: архитектуру, культуру разработки и процессы для создания надежных систем.

379 открытий3К показов
Как построить систему, которая не боится сбоев: опыт VK

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

Для этого нужны системы высокой доступности (High Availability, HA). Речь не о полном исключении ошибок, а о способности системы продолжать работу даже при сбоях.

Высокая доступность основывается на трёх ключевых элементах: архитектуре, культуре разработки и процессах. Вместе с Борисом Кузоваткиным, директором облачной платформы One-cloud в VK, рассказываем, как создавать такие системы и что лежит в их основе.

Архитектура

Архитектура строится на принципах горизонтального масштабирования, изоляции компонентов, многоуровневого кэширования, автоматического восстановления и мониторинга на основе SLO.

Разберем на нашем кейсе: сегодня в VK активно развивается облачная платформа One-cloud. Вместо того чтобы привязываться к конкретным серверам, мы используем внутреннее облако. Это даёт гибкость: если в «классических» системах ночью сервера простаивают, то у нас эти ресурсы перераспределяются на другие задачи.

Ещё одна важная цель — обработка запроса в рамках одного ЦОД. Обычно, при сбое в одном ЦОД, часть трафика уходит на другой, и запускается эффект домино: узлы начинают падать один за другим. Обработка в рамках одного ЦОД позволяет избежать каскадных обращений между дата-центрами и минимизирует задержки. Такую стратегию применяют и другие крупные компании, разрабатывая свои сетевые решения вроде Minipack и FBOSS.

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

Культура разработки

Технологии сами по себе не обеспечивают надёжность. Важно то, как они применяются. Важно закладывать fallback-поведение: если, например, рекомендации не могут быть загружены, страница должна остаться рабочей.

Инженер должен уметь сам замечать, что «что-то идёт не так». Бывает, метрики показывают, что всё нормально, а пользователи уже начинают массово жаловаться. Или, наоборот, система присылает тревоги, но причина совсем в другом. Здесь решающим становится опыт команды и отлаженные on-call процессы.

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

Чтобы её поддерживать, необходимо регулярно проводить ретроспективы, обучающие сессии и внутренние симуляции сбоев (chaos drills).

Процессы и мониторинг

Надёжная система невозможна без процессов наблюдения и анализа. Центральное место здесь занимает мониторинг. Он должен уметь фиксировать отклонения раньше, чем это заметят пользователи. Важно отслеживать:

  • частоту ошибок,
  • квантили длительности запросов,
  • загрузку CPU, RAM и дисков,
  • бизнес-метрики (например, количество видео, просмотренных за минуту).

Для сбора метрик — Prometheus, VictoriaMetrics, Forge, а для визуализации использовать Grafana. Падение бизнес-метрик может быть вызвано не только сбоями в системе, но и внешними факторами — например, перебоями связи в праздничный день.

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

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

После любого серьёзного сбоя обязательно проводится анализ:

  • Что произошло?
  • Как это починили?
  • Что можно было сделать лучше?
  • Как предотвратить повторение?
  • Как система переживает сбои

Самое очевидное решение при перегрузке — выделить дополнительные серверы. Это работает, если система масштабируется горизонтально. Но если перегрузка остаётся или возникают новые проблемы — вступает в силу подход graceful degradation. Это стратегия, при которой отключаются второстепенные функции, чтобы сохранить основную работоспособность. Например:

  • Пропадают рекомендации со страницы, но остаётся доступ к основному контенту;
  • Увеличивается срок доставки, чтобы пользователи перестали совершать слишком много заказов;
  • На стриминговых сервисах пользователь может слушать только предзагруженные треки — никаких новых загрузок и поисков.

На некоторых видеосервисах применяется load shedding: часть запросов сбрасывается, чтобы сохранить качество видео.

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

Уроки надёжности для любой команды

Кажется, что высокая доступность — задача только больших компаний. Но устойчивость начинается с малого. Всё начинается с понимания, как работает система и что с ней может случиться. Потом важно заранее продумать, как она будет вести себя при сбоях, наладить автоматизацию и внимательно относиться к качеству релизов. И только затем начинать считать «девятки» — стремиться к высокой доступности.

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