Архитектура растущего проекта
на примере ВКонтакте
Алексей Акулович
vk.com
161108#7
Развитие БД
Развитие PHP
Примеры из жизни
О чём поговорим?
Nginx
PHP + Apache
MySQL
Memcached
Всё начинается с малого
Nginx
stateless, ставим еще
PHP + Apache
MySQL
Memcached
Как расти?
Nginx
stateless, ставим еще
PHP + Apache
stateless, ставим еще
MySQL
Memcached
Как расти?
Nginx
stateless, ставим еще
PHP + Apache
stateless, ставим еще
MySQL
нужно решать
Memcached
нужно решать
Как расти?
Развитие БД
Развитие PHP
Примеры из жизни
О чём поговорим?
Вертикальное
Просто, но не долго
Масштабирование БД
Вертикальное
Просто, но не долго
Горизонтальное
Сложнее, но ограничено лишь реализацией
Масштабирование БД
Уменьшение связности
Скажем “нет” внешним ключам и join’ам
Горизонтальное масштабирование
Уменьшение связности
Скажем “нет” внешним ключам и join’ам
Разнос таблиц по разным серверам
Сначала можно логически
Горизонтальное масштабирование
Уменьшение связности
Скажем “нет” внешним ключам и join’ам
Разнос таблиц по разным серверам
Сначала можно логически
Шардирование самих таблиц
Виртуальные шарды
Горизонтальное масштабирование
Кэширование
Предварительное создание кэша
Кэширование
Предварительное создание кэша
Просроченный кэш
Кэширование
Предварительное создание кэша
Просроченный кэш
Великий рандом
Кэширование
Предварительное создание кэша
Просроченный кэш
Великий рандом
Негативное кэширование
Кэширование
There are only two hard things in Computer
Science: cache invalidation and naming things.
Phil Karlton
Кэширование
БД в огне
Свои решения. Первая кровь
Самописные велосипеды узкозаточенные БД
audiofp
friend
hints
image
letters
likes
lists
logs
memcached
meowdb
Свои решения. Первая кровь
news
photo
pmemcached
sandbox
search
seqmap
set
statsx
tasks
...
Текстовый memcached протокол
Свои решения. Первая кровь
Текстовый memcached протокол
Кластеры
Свои решения. Первая кровь
Текстовый memcached протокол
Кластеры
Доступ к кластеру как единому целому
Свои решения. Первая кровь
Я разработчик, я не хочу думать,
я хочу *-* и в продакшен!
$mc = chooseServer('cluster_name');
$mc->get('fooBar');
Свои решения. Первая кровь
Обычный запрос
$mc->set("key", $value)
Свои решения. Первая кровь
Превращается в
$mc->set(
"letter[{$delay}[,{$task_id}]]",
$letter
)
Свои решения. Первая кровь
А иногда и в
$mc->increment("counter$cnt_id
[:$subcnt_id]#$uid[#$sex$age
$status$polit$section;$city;
$region;$country;$source]")
Свои решения. Первая кровь
Подключение к кластерам через прокси
Свои решения. Первая кровь
Выбор движков в кластере на основе запроса
$mc->set("prefix4tail", $val)
hash("prefix4tail") % N
"prefix4tail" % N
Свои решения. Первая кровь
twemproxy от Twitter
https://github.com/twitter/twemproxy
Подобное решение
Набор команд
get, set, delete, ...
Ограничения MC протокола
Набор команд
get, set, delete, ...
Размер ключей
250 байт
Ограничения MC протокола
Набор команд
get, set, delete, ...
Размер ключей
250 байт
Экранирование бинарных данных
Избыточность формата
Ограничения MC протокола
Ближайший аналог - protobuf
https://github.com/google/protobuf
Не путать с msgpack, bson - они schemaless
Свой бинарный протокол TL proto
Произвольный набор команд и параметров
Работа по TCP и UDP
Шифрование
Мультиплексирование и асинхронщина
Свой бинарный протокол TL proto
Еще есть, но мало
MySQL
Еще есть, но мало
video_files_icva_chestnoe_slovo_last
MySQL
Развитие БД
Развитие PHP
Примеры из жизни
О чём поговорим?
Медленный
PHP
Медленный
Со слабой динамической типизацией
PHP
Медленный
Со слабой динамической типизацией
Популярный
PHP
Как на PHP обработать
миллион запросов в секунду?
PHP
Да никак *
PHP
*
если у вас нет 100500 серверов
Транслятор PHP → C++
KPHP: Kitten PHP
Транслятор PHP → C++
Частичная реализация PHP 5
KPHP: Kitten PHP
Транслятор PHP → C++
Частичная реализация PHP 5
Выведение типов в нативные C++ типы
KPHP: Kitten PHP
Транслятор PHP → C++
Частичная реализация PHP 5
Выведение типов в нативные C++ типы
Проверки типов при компиляции
KPHP: Kitten PHP
Бинарник HTTP сервера
Однопоточный с epoll
Пачка процессов на машину
KPHP: Kitten PHP
Развитие БД
Развитие PHP
Примеры из жизни
О чём поговорим?
Где хранить и как обновлять?
0. Хранение конфигурации
Персистентный memcache
Master-slave репликация
Slave ноды на каждом сервере с кодом
контроль отставания от мастера
0. Хранение конфигурации
К чему может привести запрос?
$mc->set("key", $value)
1. Операция “Снежный ком”
К чему может привести запрос?
$mc->set("key", $value)
Ляжет весь сайт
1. Операция “Снежный ком”
Константный ключ → один движок
Движок не смог
Прокси начали копить очередь
Прокси не смогли
Сайт упал
1. Операция “Снежный ком”
Что делать?
Не писать такой код
Размазывать нагруженные ключи
Выполнять запросы с вероятностью
1. Операция “Снежный ком”
Проблема: сайт тормозит
2. Разделяй и властвуй
Проблема: сайт тормозит
Выяснили: выросла нагрузка на кластер
общего кэша
Кто виноват?
2. Разделяй и властвуй
Проблема: сайт тормозит
Выяснили: выросла нагрузка на кластер
общего кэша
Кто виноват?
А фиг его знает
2. Разделяй и властвуй
Скажем “нет” общим кластерам
Каждой задаче - свой кластер
Выросла нагрузка - знаем точно кто
Кластер упал - не упало остальное
2. Разделяй и властвуй
Проблема: массовые 50x от kphp
3. Разделяй и властвуй #2
Проблема: массовые 50x от kphp
Выяснили: новый функционал
Что делать?
3. Разделяй и властвуй #2
Группы kphp машин
новости, профиль, api и т.п.
Проблема раздела другие разделы не волнует
3. Разделяй и властвуй #2
Группы kphp машин
новости, профиль, api и т.п.
Проблема раздела другие разделы не волнует
Несколько попыток nginx → kphp
3. Разделяй и властвуй #2
Какие нагрузки, такие и решения
Выводы
Какие нагрузки, такие и решения
Нестандартные решения - нестандартная
поддержка
Выводы
Какие нагрузки, такие и решения
Нестандартные решения - нестандартная
поддержка
Как держать нагрузку? Размазывать
Выводы
Презентация:
https://ater.me/conf/hl2016_arch.pdf
Для вопросов после:
https://vk.com/ac
Вот и всё

Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонтакте)