69
Архитектура растущего проекта на примере ВКонтакте Алексей Акулович vk.com 161108#7

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

  • Upload
    ontico

  • View
    299

  • Download
    7

Embed Size (px)

Citation preview

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

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

Алексей Акуловичvk.com

161108#7

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

Развитие БД

Развитие PHP

Примеры из жизни

О чём поговорим?

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

Nginx

PHP + Apache

MySQL

Memcached

Всё начинается с малого

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

Nginxstateless, ставим еще

PHP + Apache

MySQL

Memcached

Как расти?

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

Nginxstateless, ставим еще

PHP + Apachestateless, ставим еще

MySQL

Memcached

Как расти?

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

Nginxstateless, ставим еще

PHP + Apachestateless, ставим еще

MySQLнужно решать

Memcachedнужно решать

Как расти?

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

Развитие БД

Развитие PHP

Примеры из жизни

О чём поговорим?

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

ВертикальноеПросто, но не долго

Масштабирование БД

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

ВертикальноеПросто, но не долго

ГоризонтальноеСложнее, но ограничено лишь реализацией

Масштабирование БД

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

Уменьшение связностиСкажем “нет” внешним ключам и join’ам

Горизонтальное масштабирование

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

Уменьшение связностиСкажем “нет” внешним ключам и join’ам

Разнос таблиц по разным серверамСначала можно логически

Горизонтальное масштабирование

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

Уменьшение связностиСкажем “нет” внешним ключам и join’ам

Разнос таблиц по разным серверамСначала можно логически

Шардирование самих таблицВиртуальные шарды

Горизонтальное масштабирование

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

Кэширование

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

Предварительное создание кэша

Кэширование

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

Предварительное создание кэша

Просроченный кэш

Кэширование

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

Предварительное создание кэша

Просроченный кэш

Великий рандом

Кэширование

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

Предварительное создание кэша

Просроченный кэш

Великий рандом

Негативное кэширование

Кэширование

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

There are only two hard things in Computer Science: cache invalidation and naming things.

Phil Karlton

Кэширование

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

БД в огне

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

Свои решения. Первая кровь

Самописные велосипеды узкозаточенные БД

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

audiofpfriendhintsimageletterslikeslistslogsmemcachedmeowdb

Свои решения. Первая кровь

newsphotopmemcachedsandboxsearchseqmapsetstatsxtasks...

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

Текстовый memcached протокол

Свои решения. Первая кровь

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

Текстовый memcached протокол

Кластеры

Свои решения. Первая кровь

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

Текстовый memcached протокол

Кластеры

Доступ к кластеру как единому целому

Свои решения. Первая кровь

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

Я разработчик, я не хочу думать,я хочу *-* и в продакшен!

$mc = chooseServer('cluster_name');$mc->get('fooBar');

Свои решения. Первая кровь

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

Обычный запрос

$mc->set("key", $value)

Свои решения. Первая кровь

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

Превращается в

$mc->set("letter[{$delay}[,{$task_id}]]",$letter

)

Свои решения. Первая кровь

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

А иногда и в

$mc->increment("counter$cnt_id[:$subcnt_id]#$uid[#$sex$age$status$polit$section;$city;$region;$country;$source]")

Свои решения. Первая кровь

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

Подключение к кластерам через прокси

Свои решения. Первая кровь

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

Выбор движков в кластере на основе запроса

$mc->set("prefix4tail", $val)

hash("prefix4tail") % N

"prefix4tail" % N

Свои решения. Первая кровь

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

twemproxy от Twitter

https://github.com/twitter/twemproxy

Подобное решение

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

Набор командget, set, delete, ...

Ограничения MC протокола

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

Набор командget, set, delete, ...

Размер ключей250 байт

Ограничения MC протокола

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

Набор командget, set, delete, ...

Размер ключей250 байт

Экранирование бинарных данных

Избыточность формата

Ограничения MC протокола

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

Ближайший аналог - protobufhttps://github.com/google/protobuf

Не путать с msgpack, bson - они schemaless

Свой бинарный протокол TL proto

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

Произвольный набор команд и параметров

Работа по TCP и UDP

Шифрование

Мультиплексирование и асинхронщина

Свой бинарный протокол TL proto

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

Еще есть, но мало

MySQL

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

Еще есть, но мало

video_files_icva_chestnoe_slovo_last

MySQL

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

Развитие БД

Развитие PHP

Примеры из жизни

О чём поговорим?

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

Медленный

PHP

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

Медленный

Со слабой динамической типизацией

PHP

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

Медленный

Со слабой динамической типизацией

Популярный

PHP

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

Как на PHP обработать миллион запросов в секунду?

PHP

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

Да никак *

PHP

* если у вас нет 100500 серверов

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

Транслятор PHP → C++

KPHP: Kitten PHP

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

Транслятор PHP → C++

Частичная реализация PHP 5

KPHP: Kitten PHP

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

Транслятор PHP → C++

Частичная реализация PHP 5

Выведение типов в нативные C++ типы

KPHP: Kitten PHP

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

Транслятор PHP → C++

Частичная реализация PHP 5

Выведение типов в нативные C++ типы

Проверки типов при компиляции

KPHP: Kitten PHP

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

Бинарник HTTP сервера

Однопоточный с epoll

Пачка процессов на машину

KPHP: Kitten PHP

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

Развитие БД

Развитие PHP

Примеры из жизни

О чём поговорим?

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

Где хранить и как обновлять?

0. Хранение конфигурации

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

Персистентный memcache

Master-slave репликация

Slave ноды на каждом сервере с кодомконтроль отставания от мастера

0. Хранение конфигурации

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

К чему может привести запрос?

$mc->set("key", $value)

1. Операция “Снежный ком”

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

К чему может привести запрос?

$mc->set("key", $value)

Ляжет весь сайт

1. Операция “Снежный ком”

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

Константный ключ → один движок

Движок не смог

Прокси начали копить очередь

Прокси не смогли

Сайт упал

1. Операция “Снежный ком”

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

Что делать?

Не писать такой код

Размазывать нагруженные ключи

Выполнять запросы с вероятностью

1. Операция “Снежный ком”

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

Проблема: сайт тормозит

2. Разделяй и властвуй

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

Проблема: сайт тормозит

Выяснили: выросла нагрузка на кластер общего кэша

Кто виноват?

2. Разделяй и властвуй

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

Проблема: сайт тормозит

Выяснили: выросла нагрузка на кластер общего кэша

Кто виноват?

А фиг его знает

2. Разделяй и властвуй

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

Скажем “нет” общим кластерам

Каждой задаче - свой кластер

Выросла нагрузка - знаем точно кто

Кластер упал - не упало остальное

2. Разделяй и властвуй

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

Проблема: массовые 50x от kphp

3. Разделяй и властвуй #2

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

Проблема: массовые 50x от kphp

Выяснили: новый функционал

Что делать?

3. Разделяй и властвуй #2

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

Группы kphp машинновости, профиль, api и т.п.

Проблема раздела другие разделы не волнует

3. Разделяй и властвуй #2

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

Группы kphp машинновости, профиль, api и т.п.

Проблема раздела другие разделы не волнует

Несколько попыток nginx → kphp

3. Разделяй и властвуй #2

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

Какие нагрузки, такие и решения

Выводы

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

Какие нагрузки, такие и решения

Нестандартные решения - нестандартная поддержка

Выводы

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

Какие нагрузки, такие и решения

Нестандартные решения - нестандартная поддержка

Как держать нагрузку? Размазывать

Выводы

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

Презентация:https://ater.me/conf/hl2016_arch.pdf

Для вопросов после:https://vk.com/ac

Вот и всё