SlideShare a Scribd company logo
1 of 69
Высоконагруженные веб-
системы.
Коротко о главном.
Роман Ивлиев
roman@ontico.ru
2
СОБИРАЕМСЯ В ПОХОД
3
Функциональное разделение
4
Сервисно-ориентированная
архитектура
5
Вертикальное
масштабирование
6
Горизонтальное масштабирование
7
Отложенные вычисления
8
Асинхронная обработка
9
Использование толстого
клиента
10
Кеширование
11
Шардинг
12
Виртуальные шарды
13
Центральный диспетчер
14
Репликация
15
Партиционирование
16
Денормализация
17
Введение избыточности
18
Параллельное выполнение
19
АЛГОРИТМ ПРОЕКТИРОВАНИЯ
С какой стороны открывать бочку
20
ШАГ ПЕРВЫЙ. КОНЦЕПЦИЯ
21
ШАГ ВТОРОЙ. КАЛЬКУЛЯЦИЯ
22
АЛГОРИТМ, ШАГ ТРЕТИЙ
Определить допустимую деградацию функций системы
23
АЛГОРИТМ, ШАГ ЧЕТВЕРТЫЙ
Построим схему движения данных и примем решение, какие из
особенностей проектируемой системы мы будем использовать
24
АЛГОРИТМ, ШАГ ПЯТЫЙ
Проектируем схему хранения данных
25
АЛГОРИТМ, ШАГ ШЕСТОЙ
Ломаем систему и смотрим, что у нас получится
26
Примеры
ПРОФИЛИ НА САЙТЕ ЗНАКОМСТВ
Спроектируем систему хранения пользователей на сайте знакомств
28
Сайт знакомств, профили / #1
1. Пользователь заполняет анкету;
2. Получает логин пароль для доступа к
своему личному кабинету;
3. Пользователи могут смотреть профили
друг друга;
29
Сайт знакомств, профили / #2
1. Пользователей 200 миллионов;
2. Каждая анкета занимает 10 килобайт, то
есть всего 2 000 гигабайт;
3. Хитов в день 5 миллиардов;
30
Сайт знакомств, профили / #3
1. Деградация недопустима;
31
Сайт знакомств, профили / #4
1. Данные часто читаются, но редко
меняются;
2. Все анкеты примерно одного размера;
3. У анкеты есть уникальный идентификатор;
4. Нет ярко выраженных лидеров;
32
Сайт знакомств, профили / #5
Проектируем схему
хранения данных
33
Сайт знакомств, профили / #5
Репликация?
Вообще 140к чтений в секунду
34
Сайт знакомств, профили / #5
Шардирование?
По какому ключу? Диспетчер?
35
Сайт знакомств, профили / #6
Виртуальные шарды
36
Сайт знакомств, профили / #6
Сгорает диск?
37
Сайт знакомств, пользователи / #6
Репликация
38
Сайт знакомств, профили /
результат
• Разбиваем весь массив пользователей на
виртуальные шарды;
• Маппим виртуальные шарды на реальные
шарды;
• Внутри каждого шарда реплицируем
информацию для отказоустойчивости
39
НОВОСТНОЙ САЙТ
Большая и длинная лента новостей крупного СМИ
40
Новости / #1
• Пользователь читает свежие новости;
• Пользователь читает архивные новости;
• Редактор публикует новости;
41
Новости / #2
• Каждая новость примерно 10 килобайт;
• Мы вечно храним архив с даты основания
СМИ – 2000 год;
• В день публикуется около 10 тысяч различных
региональных и федеральных новостей;
• Итого в год 3 миллиона 500 тысяч новостей, в
год 35 гигабайт, за 20 лет – 700 гигабайт;
• Это крупнейшее СМИ, посещаемость – 10
миллионов человек в сутки;
42
Новости / #3
• Деградация недопустима;
43
Новости / #4
• Количество чтений на несколько порядков
превышает количество записей;
• 99% запросов касаются последнего дня;
• 99,99% запросов касаются последней
недели.
44
Новости / #5
Проектируем схему
хранения данных
45
Новости / #5
Партиционирование
По какому принципу?
46
Новости / #5
Как переносить данные из
горячей БД в архив?
47
Новости / #5
Не надо ничего переносить!
Вводим
избыточность!
48
Новости / #5
Очень много запросов
к горячим новостям!
Что делать?
49
Новости / #5
Кеширование!
50
Новости / результат
• Кеширование для горячих новостей;
• Партиционирование новостей по дате –
последние новости в быстрой таблице;
• Избыточное хранение новостей – новость
пишется сразу и в горячую таблицу и в
архивную, горячая раз в какое-то время
чистится;
51
ПРОСМОТР ФРЕНДЛЕНТЫ
Просмотр френдлента в блогах
52
Просмотр френдленты / #1
• У пользователя может быть сколько угодно
друзей;
• Френдленту храним бесконечно долго;
53
Просмотр френдленты / #2
• В среднем у пользователя 100 друзей;
• Каждый пользователь в среднем пишет 3
поста в день;
• Каждый пост занимаем около 1 килобайта;
• Пользователей – 10 миллионов в сутки, но
каждый пользователь делает 100 хитов. Итого
– миллиард запросов к френдленте в сутки;
• В сутки генерируется 30 миллионов постов, 10
миллиардов записей в год;
54
Просмотр френдленты / #3
• Допустимо, что пользователь увидит запись
своего друга не моментально, а с
небольшой задержкой;
• Допустимо, что порядок записей не будет
строго совпадать с хронологическим;
55
Просмотр френдленты / #4
• 99% запросов приходятся на голову
френдленты;
• У нас есть пользователи, которые в друзьях
у миллионов пользователей;
56
Просмотр френдленты / #5
Проектируем схему
хранения данных
57
Просмотр френдленты / #5
Избыточность?
Каждому пользователю свой список записей
в его френдленте? Это же очень много – один
триллион записей за год!
58
Просмотр френдленты / #5
Храним для каждого
пользователя ленту
идентификаторов постов!
59
Просмотр френдленты / #5
Шардирование?
Чего? По какому принципу?
60
Просмотр френдленты / #5
Пользователь и его
посты лежат рядом
Сделайте составной идентификатор поста,
пусть в него входит идентификатор
пользователя
61
Просмотр френдленты / #5
Достали список
идентификаторов
постов
Как собрать ленту?
62
Просмотр френдленты / #5
Толстый клиент!
63
Просмотр френдленты / #5
Если вы круты, то можете попробовать
Параллельные
вычисления
64
Просмотр френдленты / результаты
• Пользователи шардируются, рядом с
пользователями лежат его посты и его френдлента;
• В френдленте пользователя уже записаны
идентификаторы постов его друзей в порядке,
близком к хронологическому;
• В идентификатор поста зашит ID пользователя, по
которому мы быстро определяем шард и забираем
с него текст поста;
• За текстом поста у нас будет ходить JS-машина,
работающая на клиенте.
65
Запись френдленты / #5
А как посты попадают
в френдленту?
У нас ведь есть пользователи, которые в
друзьях у миллионов?
66
Запись френдленты / #5
Используем очереди!
67
И ДАЛЕЕ ПО АНАЛОГИИ
Алгоритм универсален!
68
Вопросы?
roman@ontico.ru

More Related Content

Similar to Про построение нагруженных систем

Random 091110032013-phpapp02
Random 091110032013-phpapp02Random 091110032013-phpapp02
Random 091110032013-phpapp02DmitryMalko
 
Микросервисный фронтенд
Микросервисный фронтендМикросервисный фронтенд
Микросервисный фронтендViacheslav Slinko
 
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)Ontico
 
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Coit-people
 
Історія декількох проектів та що в них пішло не так - UA Mobile 2019
Історія декількох проектів та що в них пішло не так - UA Mobile 2019Історія декількох проектів та що в них пішло не так - UA Mobile 2019
Історія декількох проектів та що в них пішло не так - UA Mobile 2019UA Mobile
 
Как мы делаем Banki.ru
Как мы делаем Banki.ruКак мы делаем Banki.ru
Как мы делаем Banki.ruRoman Ivliev
 
Новая почта Рамблера (Андрей Шетухин)
Новая почта Рамблера (Андрей Шетухин)Новая почта Рамблера (Андрей Шетухин)
Новая почта Рамблера (Андрей Шетухин)Ontico
 
Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)
Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)
Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)Ontico
 
«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндекс«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндексit-people
 
Как упростить жизнь системному администратору с помощью Python – Андрей Васил...
Как упростить жизнь системному администратору с помощью Python – Андрей Васил...Как упростить жизнь системному администратору с помощью Python – Андрей Васил...
Как упростить жизнь системному администратору с помощью Python – Андрей Васил...Yandex
 
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...Ontico
 
Как жить в согласии с SOLID?
Как жить в согласии с SOLID?Как жить в согласии с SOLID?
Как жить в согласии с SOLID?DotNetConf
 
Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...
Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...
Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...Ontico
 
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потеряхМониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потеряхSveta Smirnova
 
Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»DevDay
 
Учебный день конференции HighLoad++ 2013
Учебный день конференции HighLoad++ 2013Учебный день конференции HighLoad++ 2013
Учебный день конференции HighLoad++ 2013Ontico
 
Cистема внутренней статистики Odnoklassniki.ru
Cистема внутренней статистики Odnoklassniki.ruCистема внутренней статистики Odnoklassniki.ru
Cистема внутренней статистики Odnoklassniki.ruodnoklassniki.ru
 
Учебный день конференции HighLoad++ 2013
Учебный день конференции HighLoad++ 2013Учебный день конференции HighLoad++ 2013
Учебный день конференции HighLoad++ 2013Ontico
 

Similar to Про построение нагруженных систем (20)

Scrum Wars
Scrum WarsScrum Wars
Scrum Wars
 
Random 091110032013-phpapp02
Random 091110032013-phpapp02Random 091110032013-phpapp02
Random 091110032013-phpapp02
 
Микросервисный фронтенд
Микросервисный фронтендМикросервисный фронтенд
Микросервисный фронтенд
 
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
 
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
 
Історія декількох проектів та що в них пішло не так - UA Mobile 2019
Історія декількох проектів та що в них пішло не так - UA Mobile 2019Історія декількох проектів та що в них пішло не так - UA Mobile 2019
Історія декількох проектів та що в них пішло не так - UA Mobile 2019
 
Как мы делаем Banki.ru
Как мы делаем Banki.ruКак мы делаем Banki.ru
Как мы делаем Banki.ru
 
Новая почта Рамблера (Андрей Шетухин)
Новая почта Рамблера (Андрей Шетухин)Новая почта Рамблера (Андрей Шетухин)
Новая почта Рамблера (Андрей Шетухин)
 
Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)
Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)
Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)
 
«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндекс«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндекс
 
Как упростить жизнь системному администратору с помощью Python – Андрей Васил...
Как упростить жизнь системному администратору с помощью Python – Андрей Васил...Как упростить жизнь системному администратору с помощью Python – Андрей Васил...
Как упростить жизнь системному администратору с помощью Python – Андрей Васил...
 
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
 
Как жить в согласии с SOLID?
Как жить в согласии с SOLID?Как жить в согласии с SOLID?
Как жить в согласии с SOLID?
 
Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...
Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...
Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...
 
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потеряхМониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
 
Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»Алексей Романчук «Реактивное программирование»
Алексей Романчук «Реактивное программирование»
 
Учебный день конференции HighLoad++ 2013
Учебный день конференции HighLoad++ 2013Учебный день конференции HighLoad++ 2013
Учебный день конференции HighLoad++ 2013
 
Cистема внутренней статистики Odnoklassniki.ru
Cистема внутренней статистики Odnoklassniki.ruCистема внутренней статистики Odnoklassniki.ru
Cистема внутренней статистики Odnoklassniki.ru
 
Учебный день конференции HighLoad++ 2013
Учебный день конференции HighLoad++ 2013Учебный день конференции HighLoad++ 2013
Учебный день конференции HighLoad++ 2013
 
Async Python
Async PythonAsync Python
Async Python
 

More from Roman Ivliev

Точка кипения: проектирование крупных веб-систем
Точка кипения:  проектирование крупных веб-системТочка кипения:  проектирование крупных веб-систем
Точка кипения: проектирование крупных веб-системRoman Ivliev
 
О фреймворках Backend conf 2016
О фреймворках Backend conf 2016О фреймворках Backend conf 2016
О фреймворках Backend conf 2016Roman Ivliev
 
Всему своё время Highload Junior 2016
Всему своё время   Highload Junior  2016Всему своё время   Highload Junior  2016
Всему своё время Highload Junior 2016Roman Ivliev
 
Как мы помогаем тестировщикам делать их работу лучше
Как мы помогаем тестировщикам делать их работу лучшеКак мы помогаем тестировщикам делать их работу лучше
Как мы помогаем тестировщикам делать их работу лучшеRoman Ivliev
 
Темная сторона метрик
Темная сторона метрикТемная сторона метрик
Темная сторона метрикRoman Ivliev
 
Мой рассказ на Codefest 2015 о том, как мы пережили рост нагрузки
Мой рассказ на Codefest 2015 о том, как мы пережили рост нагрузкиМой рассказ на Codefest 2015 о том, как мы пережили рост нагрузки
Мой рассказ на Codefest 2015 о том, как мы пережили рост нагрузкиRoman Ivliev
 
Внедрение изменений: рефакторинг Vs реинжиниринг
Внедрение изменений: рефакторинг Vs реинжинирингВнедрение изменений: рефакторинг Vs реинжиниринг
Внедрение изменений: рефакторинг Vs реинжинирингRoman Ivliev
 
Почему почта плохо работает
Почему почта плохо работаетПочему почта плохо работает
Почему почта плохо работаетRoman Ivliev
 
Тренеры и тренинги.
Тренеры и тренинги.Тренеры и тренинги.
Тренеры и тренинги.Roman Ivliev
 
Аквариум своими руками
Аквариум своими рукамиАквариум своими руками
Аквариум своими рукамиRoman Ivliev
 
Про тестирование миграций
Про тестирование миграцийПро тестирование миграций
Про тестирование миграцийRoman Ivliev
 
Тестирование для программистов
Тестирование для программистовТестирование для программистов
Тестирование для программистовRoman Ivliev
 
Бывает так, что вас нет рядом
Бывает так, что вас нет рядомБывает так, что вас нет рядом
Бывает так, что вас нет рядомRoman Ivliev
 
Qualitative battle for the quantity final
Qualitative battle for the quantity finalQualitative battle for the quantity final
Qualitative battle for the quantity finalRoman Ivliev
 
Heavy metal testing Part 3
Heavy metal testing Part 3Heavy metal testing Part 3
Heavy metal testing Part 3Roman Ivliev
 
Heavy metal testing Part 1 and 2
Heavy metal testing Part 1 and 2Heavy metal testing Part 1 and 2
Heavy metal testing Part 1 and 2Roman Ivliev
 

More from Roman Ivliev (17)

Точка кипения: проектирование крупных веб-систем
Точка кипения:  проектирование крупных веб-системТочка кипения:  проектирование крупных веб-систем
Точка кипения: проектирование крупных веб-систем
 
О фреймворках Backend conf 2016
О фреймворках Backend conf 2016О фреймворках Backend conf 2016
О фреймворках Backend conf 2016
 
Всему своё время Highload Junior 2016
Всему своё время   Highload Junior  2016Всему своё время   Highload Junior  2016
Всему своё время Highload Junior 2016
 
Как мы помогаем тестировщикам делать их работу лучше
Как мы помогаем тестировщикам делать их работу лучшеКак мы помогаем тестировщикам делать их работу лучше
Как мы помогаем тестировщикам делать их работу лучше
 
Темная сторона метрик
Темная сторона метрикТемная сторона метрик
Темная сторона метрик
 
Мой рассказ на Codefest 2015 о том, как мы пережили рост нагрузки
Мой рассказ на Codefest 2015 о том, как мы пережили рост нагрузкиМой рассказ на Codefest 2015 о том, как мы пережили рост нагрузки
Мой рассказ на Codefest 2015 о том, как мы пережили рост нагрузки
 
Внедрение изменений: рефакторинг Vs реинжиниринг
Внедрение изменений: рефакторинг Vs реинжинирингВнедрение изменений: рефакторинг Vs реинжиниринг
Внедрение изменений: рефакторинг Vs реинжиниринг
 
Почему почта плохо работает
Почему почта плохо работаетПочему почта плохо работает
Почему почта плохо работает
 
Soa tester view
Soa tester viewSoa tester view
Soa tester view
 
Тренеры и тренинги.
Тренеры и тренинги.Тренеры и тренинги.
Тренеры и тренинги.
 
Аквариум своими руками
Аквариум своими рукамиАквариум своими руками
Аквариум своими руками
 
Про тестирование миграций
Про тестирование миграцийПро тестирование миграций
Про тестирование миграций
 
Тестирование для программистов
Тестирование для программистовТестирование для программистов
Тестирование для программистов
 
Бывает так, что вас нет рядом
Бывает так, что вас нет рядомБывает так, что вас нет рядом
Бывает так, что вас нет рядом
 
Qualitative battle for the quantity final
Qualitative battle for the quantity finalQualitative battle for the quantity final
Qualitative battle for the quantity final
 
Heavy metal testing Part 3
Heavy metal testing Part 3Heavy metal testing Part 3
Heavy metal testing Part 3
 
Heavy metal testing Part 1 and 2
Heavy metal testing Part 1 and 2Heavy metal testing Part 1 and 2
Heavy metal testing Part 1 and 2
 

Про построение нагруженных систем