Архитектура растущего проекта на примере ВКонтакте /...
-
Upload
ontico -
Category
Engineering
-
view
299 -
download
7
Transcript of Архитектура растущего проекта на примере ВКонтакте /...
Архитектура растущего проекта на примере ВКонтакте
Алексей Акуловичvk.com
161108#7
Развитие БД
Развитие PHP
Примеры из жизни
О чём поговорим?
Nginx
PHP + Apache
MySQL
Memcached
Всё начинается с малого
Nginxstateless, ставим еще
PHP + Apache
MySQL
Memcached
Как расти?
Nginxstateless, ставим еще
PHP + Apachestateless, ставим еще
MySQL
Memcached
Как расти?
Nginxstateless, ставим еще
PHP + Apachestateless, ставим еще
MySQLнужно решать
Memcachedнужно решать
Как расти?
Развитие БД
Развитие PHP
Примеры из жизни
О чём поговорим?
ВертикальноеПросто, но не долго
Масштабирование БД
ВертикальноеПросто, но не долго
ГоризонтальноеСложнее, но ограничено лишь реализацией
Масштабирование БД
Уменьшение связностиСкажем “нет” внешним ключам и join’ам
Горизонтальное масштабирование
Уменьшение связностиСкажем “нет” внешним ключам и join’ам
Разнос таблиц по разным серверамСначала можно логически
Горизонтальное масштабирование
Уменьшение связностиСкажем “нет” внешним ключам и join’ам
Разнос таблиц по разным серверамСначала можно логически
Шардирование самих таблицВиртуальные шарды
Горизонтальное масштабирование
Кэширование
Предварительное создание кэша
Кэширование
Предварительное создание кэша
Просроченный кэш
Кэширование
Предварительное создание кэша
Просроченный кэш
Великий рандом
Кэширование
Предварительное создание кэша
Просроченный кэш
Великий рандом
Негативное кэширование
Кэширование
There are only two hard things in Computer Science: cache invalidation and naming things.
Phil Karlton
Кэширование
БД в огне
Свои решения. Первая кровь
Самописные велосипеды узкозаточенные БД
audiofpfriendhintsimageletterslikeslistslogsmemcachedmeowdb
Свои решения. Первая кровь
newsphotopmemcachedsandboxsearchseqmapsetstatsxtasks...
Текстовый 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 протокола
Ближайший аналог - protobufhttps://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
Вот и всё