Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CodeFest 2018. Алексей Акулович (ВКонтакте) — Разработка в ненадежной нагруженной среде

CodeFest
April 05, 2018

CodeFest 2018. Алексей Акулович (ВКонтакте) — Разработка в ненадежной нагруженной среде

Посмотрите выступление Алексея: https://2018.codefest.ru/lecture/1250/

Расскажу, как в ВК идет разработка при постоянных отказах и проблемах софта и железа, приправленных соусом высоких нагрузок. Как пишется код, как ведется автоматизированный мониторинг, про подходы к созданию функционала, немного про деплой. Много компромиссов и велосипедов, всё как мы любим :)

CodeFest

April 05, 2018
Tweet

More Decks by CodeFest

Other Decks in Programming

Transcript

  1. Соус • 97 млн MAU • 6.5 млрд сообщений в

    день • 9 млрд просмотров записей в день • 90 разработчиков
  2. Система конфигурирования - confdata • Персистентный a la memcached •

    Мастер-слейв • Слейв на каждом сервере
  3. Система конфигурирования - confdata • Персистентный a la memcached •

    Мастер-слейв • Слейв на каждом сервере • Fallback слейвов
  4. Система конфигурирования - confdata • Персистентный a la memcached •

    Мастер-слейв • Слейв на каждом сервере • Fallback слейвов • Изменение настроек на всех серверах за ~секунду
  5. Deploy - Ooops! Лето 2016… Warning: RpcMemcache::rpc_connect(): Can't connect to

    127.0.0.1:2394 (ip 127.0.0.1), Rpc handshake failed (0) in /home/redesign/sources/data/www/include-system.php on line 300 Основной ответ на запрос...
  6. Deploy - Ooops! У нас используется kphp, где php warning

    невозможны 15 минут ушло на поиск причины
  7. Deploy - Ooops! Причина: • предкомпиляция php перед запуском сборки

    kphp • одна из баз не ответила в момент предкомпиляции
  8. Deploy - Ooops! Причина: • предкомпиляция php перед запуском сборки

    kphp • одна из баз не ответила в момент предкомпиляции • warning сохранился в выдаче (display_errors = 1)
  9. Deploy - Ooops! Причина: • предкомпиляция php перед запуском сборки

    kphp • одна из баз не ответила в момент предкомпиляции • warning сохранился в выдаче (display_errors = 1) • kphp вкомпилил его как HTML перед открывающим тегом
  10. Deploy - Staging После тестов выкатываем master на <= 1%

    трафика Кто попадает на staging - в confdata
  11. Deploy - Staging После тестов выкатываем master на <= 1%

    трафика Кто попадает на staging - в confdata Катаем не менее 15 минут
  12. Deploy - “ручки” В confdata задаются рубильники на: • %

    запросов (случайно) • % пользователей (консистентно) • список пользователей
  13. Deploy - “ручки” Плюсы: • плавный контролируемый рост нагрузки •

    защита от выкатывания нескольких вещей разом • быстрое выключение
  14. Мониторинг - statlogs Сбор метрик: • продуктовые (количество показов, ошибки

    загрузки, ...) • инфраструктурные (cpu, нагрузка на движки, ...)
  15. Мониторинг - statlogs Сбор метрик: • продуктовые (количество показов, ошибки

    загрузки, ...) • инфраструктурные (cpu, нагрузка на движки, ...) Их очень много: одних запросов к движкам >100кк/сек
  16. Мониторинг - watchdogs Автоматизация поиска “аномалий” Только основные метрики (несколько

    сотен) Отсылает смс или сообщения в чаты Дежурные админы и ответственные за разделы разработчики
  17. Размазывание нагрузки - дублирование Фото котика в популярной группе -

    плохо даже мемкешу Для популярного кеша храним его более, чем в одной копии
  18. Размазывание нагрузки - дублирование Мажем ключи по схеме W:R (W

    > R, R >= 1) Случай W:1 - “highload keys” - список в confdata
  19. Размазывание нагрузки - перезапросы Движок не ответил, но нам очень

    надо? Перезапросить? Нет! *в 99.(9)% случаев Но если очень хочется - экспоненциальная задержка наше всё
  20. Размазывание нагрузки - debug ошибок Как дебажить проблему движков при

    миллионах qps? Realtime in-memory round-robin буферы для логов ошибок
  21. Размазывание нагрузки - debug ошибок Как дебажить проблему движков при

    миллионах qps? Realtime in-memory round-robin буферы для логов ошибок Логи на мемкеше?… Да :)
  22. Железо - сеть - rx Ломается или заканчивается в самый

    неподходящий момент Лучшее решение - максимальный stateless железок
  23. Железо - сеть - tx Решение - копить важное не

    отправленное локально Пример из жизни - KittenHouse: Важные логи сохраняются локально на диск И хранятся, пока не удастся отправить
  24. Железо - сеть Лучшая точка отказа - несуществующая Пример из

    жизни - DNS: Адреса всех внутренних машин - в /etc/hosts
  25. Внешний мир - shares Не ходим вовне с рабочих машин

    Зарезано на уровне iptables, не соглашений
  26. Внешний мир - shares Отдельная пачка серверов Без доступов (почти)

    к остальной части проекта Минимум кода и софта
  27. Внешний мир - image-engine Обработка фотографий и превьюшек документов fork

    на каждый запрос Урезано по правам и ресурсам
  28. Лучший deploy - плавный и независимый Лучший мониторинг - автоматика

    с минимумом false positive Размазывание нагрузки - must have Надежное железо - продублированное Внешний мир - жесток Итоги