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

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

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

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

16b6c87229eaf58768d25ed7b2bbbf52?s=128

CodeFest

April 05, 2018
Tweet

Transcript

  1. Разработка в ненадежной нагруженной среде Алексей Акулович Backend разработчик ВКонтакте

    2018.03.30#5
  2. Чего не будет? • Как писать правильный код • Как

    тестировать
  3. Что будет? • Deploy • Мониторинг • Размазывание нагрузки •

    Железо • Внешний мир
  4. Соус • 97 млн MAU • 6.5 млрд сообщений в

    день • 9 млрд просмотров записей в день • 90 разработчиков
  5. One Thing To Rule Them All

  6. Система конфигурирования Варианты: • Прямо в коде • Файл, читаемый

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

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

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

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

    Мастер-слейв • Слейв на каждом сервере • Fallback слейвов • Изменение настроек на всех серверах за ~секунду
  11. Система конфигурирования - confdata

  12. О докладе • Deploy • Мониторинг • Размазывание нагрузки •

    Железо • Внешний мир
  13. 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 Основной ответ на запрос...
  14. Deploy - Ooops! У нас используется kphp, где php warning

    невозможны
  15. Deploy - Ooops! У нас используется kphp, где php warning

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

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

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

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

    kphp • одна из баз не ответила в момент предкомпиляции • warning сохранился в выдаче (display_errors = 1) • kphp вкомпилил его как HTML перед открывающим тегом
  20. use the staging, Luke!

  21. Deploy - Staging master staging prod

  22. Deploy - Staging После тестов выкатываем master на <= 1%

    трафика
  23. Deploy - Staging После тестов выкатываем master на <= 1%

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

    трафика Кто попадает на staging - в confdata Катаем не менее 15 минут
  25. Deploy - Staging Очень быстрый откат

  26. Deploy - CodeFreeze Не обновляем прод в пик нагрузки и

    праздничные дни
  27. Deploy - CodeFreeze - hot fixes

  28. Deploy Катаемся 5+ раз в сутки

  29. Deploy - “ручки” Новый функционал всегда катится выключенным

  30. Deploy - “ручки” В confdata задаются рубильники на: • %

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

    защита от выкатывания нескольких вещей разом • быстрое выключение
  32. Deploy - со стороны админов Антон Кирюшкин “Системный администратор Vkontakte.

    Как?” http://www.highload.ru/2017/abstracts/2416.html
  33. Deploy Лучший deploy - плавный и независимый

  34. О докладе • Deploy • Мониторинг • Размазывание нагрузки •

    Железо • Внешний мир
  35. Мониторинг - statlogs Сбор метрик: • продуктовые (количество показов, ошибки

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

    загрузки, ...) • инфраструктурные (cpu, нагрузка на движки, ...) Их очень много: одних запросов к движкам >100кк/сек
  37. Мониторинг - statlogs По графикам строим dashboards

  38. Мониторинг - watchdogs Автоматизация поиска “аномалий”

  39. Мониторинг - watchdogs Автоматизация поиска “аномалий” Только основные метрики (несколько

    сотен)
  40. Мониторинг - watchdogs Автоматизация поиска “аномалий” Только основные метрики (несколько

    сотен) Отсылает смс или сообщения в чаты
  41. Мониторинг - watchdogs Автоматизация поиска “аномалий” Только основные метрики (несколько

    сотен) Отсылает смс или сообщения в чаты Дежурные админы и ответственные за разделы разработчики
  42. Мониторинг - for fun Мониторим: • число твитов с #вкживи

  43. Мониторинг - for fun Мониторим: • число твитов с #вкживи

    • нулевое число ошибок
  44. Мониторинг - предсказывание “Скоро произойдет ...” лучше, чем “Уже произошло

    ...”
  45. Мониторинг Лучший мониторинг - автоматика с минимумом false positive

  46. О докладе • Deploy • Мониторинг • Размазывание нагрузки •

    Железо • Внешний мир
  47. Размазывание нагрузки - kphp backends Разные части сайта независимы: api

    audio groups news staging_* ...
  48. Размазывание нагрузки - специализация Разделение общих баз на частные случаи

    Независимость и лучший мониторинг
  49. Размазывание нагрузки - дублирование Фото котика в популярной группе -

    плохо даже мемкешу
  50. Размазывание нагрузки - дублирование Фото котика в популярной группе -

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

    > R, R >= 1)
  52. Размазывание нагрузки - дублирование Мажем ключи по схеме W:R (W

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

  54. Размазывание нагрузки - перезапросы Движок не ответил, но нам очень

    надо? Перезапросить?
  55. Размазывание нагрузки - перезапросы Движок не ответил, но нам очень

    надо? Перезапросить? Нет! *в 99.(9)% случаев
  56. Размазывание нагрузки - перезапросы Движок не ответил, но нам очень

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

    миллионах qps?
  58. Размазывание нагрузки - debug ошибок Как дебажить проблему движков при

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

    миллионах qps? Realtime in-memory round-robin буферы для логов ошибок Логи на мемкеше?… Да :)
  60. Размазывание нагрузки - debug ошибок Главное не упороть мемкеш логами

    ошибок мемкеша
  61. Размазывание нагрузки “Архитектура растущего проекта на примере ВКонтакте” http://www.highload.ru/2016/abstracts/2414.html

  62. О докладе • Deploy • Мониторинг • Размазывание нагрузки •

    Железо • Внешний мир
  63. Железо - сеть - rx Ломается или заканчивается в самый

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

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

    жизни - DNS: Адреса всех внутренних машин - в /etc/hosts
  66. Железо - память Мемкеши подселяются на сервера Работаем с vm.overcommit_memory

    = 1 Задаем OOM Score повыше для мемкешей
  67. Железо - сеть Выдали ссылку на заливку файла А если

    сервер помер?
  68. Железо - сеть “Check upload” перед заливкой Blacklists серверов per

    user
  69. Железо Видео плееры используют hearthbeat для: • сбора статистики •

    обработки сбоев
  70. Железо Необходимо тестить работу системы извне

  71. Железо “Quis custodiet ipsos custodes?” Альтернативный способ связи

  72. Железо “Не держать все яйца в одной корзине” Надежное железо

    - продублированное
  73. О докладе • Deploy • Мониторинг • Размазывание нагрузки •

    Железо • Внешний мир
  74. Внешний мир - shares Не ходим вовне с рабочих машин

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

    к остальной части проекта Минимум кода и софта
  76. Внешний мир - image-engine Не обрабатываем фотки и документы встроенными

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

    на каждый запрос Урезано по правам и ресурсам
  78. Внешний мир 31 декабря 2017

  79. Внешний мир 31 декабря 2017

  80. Внешний мир Видео истории в новогоднюю ночь получили x4 нагрузки

    Сервера встали в CPU на blur обложек
  81. Внешний мир Мы не могли убрать blur Что делать?

  82. Внешний мир Убрать генерацию обложек!

  83. Внешний мир Складывали задачи на генерацию в очередь Очередь начали

    разгребать вечером 1 января
  84. Внешний мир Мир жесток и доверять ему нельзя

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

    с минимумом false positive Размазывание нагрузки - must have Надежное железо - продублированное Внешний мир - жесток Итоги
  86. Вопросы? vk.com/ac conf@ater.me