Архитектура растущего проекта на примере ВКонтакте /...

Preview:

Citation preview

Архитектура растущего проекта на примере ВКонтакте

Алексей Акулович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

Вот и всё

Recommended