170
Разработка и проектирование высоконагруженных систем Олег Бунин [email protected]

Учебный день конференции HighLoad++ 2013

  • Upload
    ontico

  • View
    599

  • Download
    2

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Учебный день конференции HighLoad++ 2013

Разработка и проектирование

высоконагруженных систем

Олег Бунин[email protected]

Page 2: Учебный день конференции HighLoad++ 2013

2

Структура лекцииПервый блок:

• Знакомство;• Цель обучения;• Принципы масштабируемости;• Архитектурные решения;• Виды масштабирования;• Трёхзвенная структура.

Второй блок:• Архитектурные паттерны;• Алгоритм проектирования высоконагруженных систем.

Третий блок:• Примеры: профили на сайте знакомств, новостной сайт, френдлента;

Если успеем:• Ошибки в разработке высоконагруженных систем;• Хаки;• Эксплуатация.

Page 3: Учебный день конференции HighLoad++ 2013

3

ЗнакомствоДавайте познакомимся!

Page 4: Учебный день конференции HighLoad++ 2013

4

Олег Бунин

• Председатель Программного комитета конференции разработчиков высоконагруженных систем HighLoad++ вот уже семь лет;

Page 5: Учебный день конференции HighLoad++ 2013

5

Олег Бунин

• Председатель Программного комитета конференции разработчиков высоконагруженных систем HighLoad++ вот уже семь лет;

• Руководитель компании по разработке и консалтингу в области высоконагруженных проектов;

Page 6: Учебный день конференции HighLoad++ 2013

6

Олег Бунин

• Председатель Программного комитета конференции разработчиков высоконагруженных систем HighLoad++ вот уже семь лет;

• Руководитель компании по разработке и консалтингу в области высоконагруженных проектов;

• Руководитель отдела веб-разработки компании Рамблер (ещё тогда, когда Рамблер был номером один);

Page 7: Учебный день конференции HighLoad++ 2013

7

Page 8: Учебный день конференции HighLoad++ 2013

8

Кто вы?

• У кого пользователей больше 10 тысяч в сутки?

Page 9: Учебный день конференции HighLoad++ 2013

9

Кто вы?

• У кого пользователей больше 10 тысяч в сутки? 100 тысяч в сутки?

Page 10: Учебный день конференции HighLoad++ 2013

10

Кто вы?

• У кого пользователей больше 10 тысяч в сутки? 100 тысяч в сутки? 500 тысяч в сутки?

Page 11: Учебный день конференции HighLoad++ 2013

11

Кто вы?

• У кого пользователей больше 10 тысяч в сутки? 100 тысяч в сутки? 500 тысяч в сутки? миллион в сутки?

Page 12: Учебный день конференции HighLoad++ 2013

12

Кто вы?

• У кого пользователей больше 10 тысяч в сутки? 100 тысяч в сутки? 500 тысяч в сутки? миллион в сутки? 10 миллионов в сутки?

Page 13: Учебный день конференции HighLoad++ 2013

13

Кто вы?

• У кого есть в управлении сайты, расположенные на выделенном сервере?

Page 14: Учебный день конференции HighLoad++ 2013

14

Кто вы?

• У кого есть в управлении сайты, расположенные на выделенном сервере?более, чем на двух выделенных серверах?

Page 15: Учебный день конференции HighLoad++ 2013

15

Кто вы?

• У кого есть в управлении сайты, расположенные на выделенном сервере?более, чем на двух выделенных серверах?более, чем на пяти выделенных серверах?

Page 16: Учебный день конференции HighLoad++ 2013

16

Кто вы?

• У кого есть в управлении сайты, расположенные на выделенном сервере?более, чем на двух выделенных серверах?более, чем на пяти выделенных серверах?более, чем на двадцати выделенных серверах?

Page 17: Учебный день конференции HighLoad++ 2013

17

Цель нашей встречи

Page 18: Учебный день конференции HighLoad++ 2013

18

Цель нашей встречи

• Состоит в том, чтобы вы глубоко начали понимать смысл происходящего в вашим программным кодом;

• Знание нескольких принципов заменяет знание множества фактов;

Page 19: Учебный день конференции HighLoad++ 2013

19

Репликация полезна?

Page 20: Учебный день конференции HighLoad++ 2013

20

В чём суть репликации?

Мастер Слейв

Слейв

Слейв

Запись

Репликация

Чтение

Page 21: Учебный день конференции HighLoad++ 2013

21

Репликация

• В чём суть репликации?• Что происходит на серверах физически?

Page 22: Учебный день конференции HighLoad++ 2013

22

Репликация

• В чём суть репликации?• Что происходит на серверах физически?• Решает ли репликация любую проблему и всегда ли она полезна?

Page 23: Учебный день конференции HighLoad++ 2013

23

Репликация

• В чём суть репликации?• Что происходит на серверах физически?• Решает ли репликация любую проблему и всегда ли она полезна?

Page 24: Учебный день конференции HighLoad++ 2013

24

Репликация

• В чём суть репликации?• Что происходит на серверах физически?• Решает ли репликация любую проблему и всегда ли она полезна?

• Записей больше, чем чтения;

Page 25: Учебный день конференции HighLoad++ 2013

25

Репликация

• В чём суть репликации?• Что происходит на серверах физически?• Решает ли репликация любую проблему и всегда ли она полезна?

• Записей больше, чем чтения;• Отсутствие консистентности данных;

Page 26: Учебный день конференции HighLoad++ 2013

26

Репликация

• В чём суть репликации?• Что происходит на серверах физически?• Решает ли репликация любую проблему и всегда ли она полезна?

• Записей больше, чем чтения;• Отсутствие консистентности данных;• Слишком много слейвов;

Page 27: Учебный день конференции HighLoad++ 2013

27

Репликация

• В чём суть репликации?• Что происходит на серверах физически?• Решает ли репликация любую проблему и всегда ли она полезна?

• Записей больше, чем чтения;• Отсутствие консистентности данных;• Слишком много слейвов;• Слишком много данных;

Page 28: Учебный день конференции HighLoad++ 2013

28

Кеширование полезно?

Page 29: Учебный день конференции HighLoad++ 2013

29

Кеширование

• Поход в кеш занимает 20 миллисекунд;• Поход к базе данных занимает 100 миллисекунд;

Page 30: Учебный день конференции HighLoad++ 2013

30

Кеширование

• Поход в кеш занимает 20 миллисекунд;• Поход к базе данных занимает 100 миллисекунд;• Попадание в кеш = 20 миллисекунд, промах = 120 миллисекунд;

Page 31: Учебный день конференции HighLoad++ 2013

31

Кеширование

• Поход в кеш занимает 20 миллисекунд;• Поход к базе данных занимает 100 миллисекунд;• Попадание в кеш = 20 миллисекунд, промах = 120 миллисекунд;

• Если количество промахов составляет:• 10% -> кеш ускоряет выполнение приложения в 3.3 раза;• 40% -> кеш ускоряет выполнение приложения в 1.7 раз;• 80% -> кеш не приносит пользы;• 90% -> кеш замедляет выполнение приложения.

Page 32: Учебный день конференции HighLoad++ 2013

32

Кеширование

• Поход в кеш занимает 20 миллисекунд;• Поход к базе данных занимает 100 миллисекунд;• Попадание в кеш = 20 миллисекунд, промах = 120 миллисекунд;

• Если количество промахов составляет:• 10% -> кеш ускоряет выполнение приложения в 3.3 раза;• 40% -> кеш ускоряет выполнение приложения в 1.7 раз;• 80% -> кеш не приносит пользы;• 90% -> кеш замедляет выполнение приложения.

• Вы знаете своё соотношение hit/miss?

Page 33: Учебный день конференции HighLoad++ 2013

33

Индексы полезны?

Page 34: Учебный день конференции HighLoad++ 2013

34

Индексы полезны?

• Индекс – это возможность по значению столбца или группы столбцов быстро найти весь кортеж, всю строку в базе данных;

Page 35: Учебный день конференции HighLoad++ 2013

35

Индексы полезны?

• Индекс – это возможность по значению столбца или группы столбцов быстро найти весь кортеж, всю строку в базе данных;

• Каждый индекс:• замедляет выполнение операции вставки строки;• увеличивает количество требуемой оперативной памяти;• усложняет работу планировщика запросов.

Page 36: Учебный день конференции HighLoad++ 2013

36

Индексы полезны?

• Нужно учитывать селективность индекса;• Индексы с низкой селективностью, не просто бесполезны, они

вредны;

Page 37: Учебный день конференции HighLoad++ 2013

37

Принципы построения высоконагруженных

систем

Page 38: Учебный день конференции HighLoad++ 2013

38

Основная логика масштабируемости• Рано или поздно в процессе оптимизации мы упираемся в

производительность аппаратного обеспечения;• Значит надо сделать так, чтобы задачу можно было выполнять

одновременно на нескольких машинах;• Это легко сделать в парадигме запрос-ответ, в которой работает

веб;

Как нужно учитывать будущее масштабирование?

Page 39: Учебный день конференции HighLoad++ 2013

39

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

• Максимальная независимость компонент• Отсутствие единой точки отказа:

• По функциональности;• По данным;

Page 40: Учебный день конференции HighLoad++ 2013

40

Выбор архитектурного решения

Page 41: Учебный день конференции HighLoad++ 2013

41

Выбор архитектурного решения

Сервисно-ориентированная архитектура

Page 42: Учебный день конференции HighLoad++ 2013

Сервис-ориентированная архитектураКаждый сервис решает строго определенную задачу. Основной минус этого подхода заключается в наличии оверхеда на интеркоммуникацию сервисов между собой и на обработку API взаимодействия между слоями.

Page 43: Учебный день конференции HighLoad++ 2013

43

Выбор архитектурного решения

Монолитное приложение

Page 44: Учебный день конференции HighLoad++ 2013

Монолитное приложение

Приложение представляет из себя монолитный программный код.

Плюсы:• Отсутствие какого-либо оверхеда на интеркоммуникацию сервисов;

Минусы:• Высокая сложность разработки;• В случае проблемы встает все;• Невозможность вести распределенную разработку.

Page 45: Учебный день конференции HighLoad++ 2013

45

Выбор архитектурного решения

Ремесленный подход

Page 46: Учебный день конференции HighLoad++ 2013

Ремесленный подходБизнес-логика проекта и инструменты для масштабирования разрабатываются одновременно, учитывая особенности бизнес-логики именно этого проекта.

Приложение Приложение Приложение

Система хранения

Кеш

Видео хранилище СУБД

Масштабируемая архитектура

Масштабируемая архитектура

Масштабируемая архитектура

MySQL

Page 47: Учебный день конференции HighLoad++ 2013

Ремесленный подход• Быстрая разработка любых новых решений;

• Высокие требования к квалификации разработчиков – низкая масштабируемость разработки;

• Максимально эффективное использование технологий и аппаратного обеспечения;

Page 48: Учебный день конференции HighLoad++ 2013

48

Выбор архитектурного решения

Промышленный подход

Page 49: Учебный день конференции HighLoad++ 2013

Промышленный подходРазработка инструментов для масштабирования происходит отдельно от разработки бизнес-логики прикладных проектов.

Страница Страница Приложение Мобильная версия

API для обмена данными

Хранилище Хранилище Хранилище Хранилище

Слой веб-сервисов

Page 50: Учебный день конференции HighLoad++ 2013

Промышленный подход• Очень долгая разработка общих инструментов;

• Очень быстрая разработка приложений – происходит сборка страниц как в конструкторе Lego;

• Возможность использовать для разработки приложений программистов средней и низкой квалификации – высокая масштабируемость разработки;

• Повышенные требования к аппаратному обеспечению;

Page 51: Учебный день конференции HighLoad++ 2013

51

Что такое масштабирование?

Page 52: Учебный день конференции HighLoad++ 2013

52

Что такое масштабирование?

Вертикальное масштабирование

Page 53: Учебный день конференции HighLoad++ 2013

Вертикальное масштабированиеУвеличение производительности системы за счет увеличения мощности сервера.

В какой-то момент мы все равно достигнем предела по процессору, памяти или жесткому диску.

Page 54: Учебный день конференции HighLoad++ 2013

54

Что такое масштабирование?

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

Page 55: Учебный день конференции HighLoad++ 2013

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

Увеличение производительности системы за счет подключения дополнительных cерверов

Page 56: Учебный день конференции HighLoad++ 2013

56

Что такое масштабирование?

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

Page 57: Учебный день конференции HighLoad++ 2013

Масштабирование “во времени”

Различные данные имеют различные требования к обновлению. Это позволяет нам отложить часть обработки данных до более удобного случая.

Page 58: Учебный день конференции HighLoad++ 2013

58

Трёхзвенная структура

Page 59: Учебный день конференции HighLoad++ 2013

Трехзвенная структура

Фронтенды Бекенды Хранение данных

Быстрая обработка легких данных Вычисление Хранение данных

Page 60: Учебный день конференции HighLoad++ 2013

60

Для чего нужен фронтенд?

Page 61: Учебный день конференции HighLoad++ 2013

61

Фронтенд

• Отдача статического контента;• Буферизация запросов;• Масштабирование бекендов;• Обслуживание медленных клиентов.

Page 62: Учебный день конференции HighLoad++ 2013

Балансировка фронтендов

ПользователиПользователи

DNS-балансировкаDNS-балансировка

Round-Robin

IP1 IP1 IP2 IP2

Heart Beat Или CARP. Идея в том, что одна машинка не работает и наблюдает за другой. Если первая ломается, то она включается. У обеих машин один IP-адрес на двоих.

Page 63: Учебный день конференции HighLoad++ 2013

Балансировка бекендов

ПользователиПользователи

DNS-балансировкаDNS-балансировка

Round-Robin

IP1 IP1 IP2 IP2

Бекенд Бекенд Бекенд Бекенд

Page 64: Учебный день конференции HighLoad++ 2013

Дублирование фронтендов

Основной сервер

Вспомогательный сервер

CARP

Поток запросов

Page 65: Учебный день конференции HighLoad++ 2013

65

КофебрейкПаттерны масштабирования сразу после перерыва в 30 минут

Page 66: Учебный день конференции HighLoad++ 2013

66

Паттерны масштабированияВспомним инструменты, которые мы будем использовать

Page 67: Учебный день конференции HighLoad++ 2013

67

Инструмент #1

Сервисно-ориентированная архитектура

Page 68: Учебный день конференции HighLoad++ 2013

68

Инструмент #2

Вертикальное масштабирование

Page 69: Учебный день конференции HighLoad++ 2013

69

Инструмент #3

Горизонтальное масштабирование:• Не храним состояние;• Отсутствие общих узлов;

Page 70: Учебный день конференции HighLoad++ 2013

70

Инструмент #4

Отложенные вычисления

Page 71: Учебный день конференции HighLoad++ 2013

71

Инструмент #5

Асинхронная обработка

Page 72: Учебный день конференции HighLoad++ 2013

Очереди

Структура данных с дисциплиной доступа к элементам FIFO (First In First Out).

Применения:1. Отложенная обработка (рассылки, обновления лент новостей);2. Межсервисная коммуникация;

Page 73: Учебный день конференции HighLoad++ 2013

Очереди: модерация

Исходящий Rabbit MQ

Приложение, обновляющее SQL и считающая кучу

статистики

Erang-фронтенд Erlang-фронтенд Erlang-фроненд

БД БД БД

SQL

Копии всех обновлений

Этот сервер очередей должен стоять на стороне кластера фронтендов для того, чтобы в случае пропадания связи с резервным ДЦ информация никуда не потерялась.

SQL

SQL

Резервный датацентр

Входящий Rabbit MQ

Удаление сообщений

Очередь на удаление отмодерированных комментариев

Фронтенд для модератора

Заявки на удалениесообщений

Page 74: Учебный день конференции HighLoad++ 2013

Интеркоммуникация сервисов

Задача: необходимо уведомлять одни части системы о событиях, которые происходят в других частях:• размещение информации в пользовательских лентах (feeds) о

событиях, произошедних в сообществах;• лайки;• комментарии;• рассылка писем;

Page 75: Учебный день конференции HighLoad++ 2013

Интеркоммуникация: решение с очередью

ПользователиПользователи

Постинг поста

Сервис постов Очередь

Репликация очереди

Разборщик очереди

Постоянная база данных

Синхронная запись в базу данных

Синхронная постановка в

очередь

Репликация или Heart beat

Всегда быть готовым к дублированию задач в очереди

Если очередь сломалась –

переставляем задачи по

постоянной базе

сообщений

Page 76: Учебный день конференции HighLoad++ 2013

Интеркоммуникация: решение с очередью

Сервис A

Сервис A

Внутренняя очередь

сервиса А

Раздающий демон сервиса А

Входящие Http-сервера сервиса Б

Входящие Http-сервера сервиса Б

Входящие Http-сервера сервиса Б

Это могут быть те же сервера, что и обрабатывают запросы от фронтендами

Внутренняя очередь

сервиса Б

Сервис Б

Сервис Б

Сервис Б

Прием задач для сервиса Б

Обработка задач сервиса Б

Push сообщений из сервиса А во все

остальные сервисы

Обработка задач сервиса А

Забираем задачи

Page 77: Учебный день конференции HighLoad++ 2013

77

Инструмент #6

Использование толстого клиента

Page 78: Учебный день конференции HighLoad++ 2013

АнтишквалРяд серверов-бекендов, выполняющих однотипные задачи. Запрос приходит на первый бекенд, начинает выполняться, но не успевает за время таймаута. Фронтенд или толстый клиент перебрасывает запрос на новый бекенд, тот тоже не успевает. Таким образом очень быстро вся сеть бекендов будет положена.

Фронтенд

Сервис Сервис

Первый запрос

Первый бекенд не ответил, переходим ко второму

Page 79: Учебный день конференции HighLoad++ 2013

Антишквал: умные запросыУмные запросы от фронтенда:

• Первый запрос к первому бекенду идет с таймаутом 1 секунду. Второй запрос идет с таймаутом 2 секунды, третий - 3 секунды, а четвертого уже нет. То есть ограничиваем количество запросов;

• Бекенд может принимать решение о том, что он перегружен (раз в секунду спрашивать LA и кэшировать его). При начале обработке запроса происходит проверка и если LA слишком высокий - отдаем фронту Gone Away (штатная ситуация - перейди к другому бекенду).

Фронтенд Фронтенд Фронтенд Фронтенд

Сервис Сервис Сервис Сервис

Первый запрос, Timeout = 1с

Второй запрос,Timeout = 2с

Третий запрос,Timeout = 3с Четвертого запроса

просто нет.

Page 80: Учебный день конференции HighLoad++ 2013

80

Инструмент #7

Кеширование

Page 81: Учебный день конференции HighLoad++ 2013

81

Кеширование

• Кеширование в браузере;• Кеширование HTML-блоков;• Кеширование данных;• Кеширование HTML-страниц.

Page 82: Учебный день конференции HighLoad++ 2013

Кеширование на бекенде;

• Единый кеш для всех бекендов;• Проблема инвалидации кеша;• Проблема старта с непрогретым кешем;• Целесообразность применения кеша;

Бекенд

Бекенд

Бекенд

Кеш

Page 83: Учебный день конференции HighLoad++ 2013

Проблема инвалидации кеша

• Обновление по запросу (проблема race condition для нагруженных страниц);

• Фоновое обновление;

Update(Обновление

элемента кеша)

Select(Запрос

элемента кеша)

Кеш Memcached

Да

Есть значениев кеше?

База данных

Очередь

Класс для вычисления

элемента кеша

Маленький демон

Пишем задачу в очередь

Нет

Возвращаем результат и пишем в кеш

Используем одни модули дляонлайна и оффлайна

Читаем и обнуляемочередь

Пишем в кеш

Программный код

Page 84: Учебный день конференции HighLoad++ 2013

84

Инструмент #8

Функциональное разделение

Page 85: Учебный день конференции HighLoad++ 2013

85

Инструмент #9

Шардинг

Page 86: Учебный день конференции HighLoad++ 2013

ШардингБазовый принцип: те данные, которые в дальнейшем потребуются вместе, так же должны храниться вместе.

Примеры:1. Пользователи;2. Посты в сообществах;3. Блоги;

Принципы разбиения данных на шарды:4. Центральный диспетчер, знающий, что где лежит;5. Хэш-функция, по ключу вычисляющая шард;6. Хэш-функция, по ключу вычисляющая виртуальный шард + таблица соответствий

виртуальных шардов реальным.

Page 87: Учебный день конференции HighLoad++ 2013

87

Инструмент #10

Виртуальные шарды

Page 88: Учебный день конференции HighLoad++ 2013

Виртуальные шардыШард 1 Шард 2 Шард 3 Шард 4 Шард 5 Шард 6 Шард 7 Шард 8

Шард 1 Шард 2 Шард 3 Шард 4 Шард 5 Шард 6 Шард 7 Шард 8

Шард 1 Шард 2 Шард 3 Шард 4 Шард 5 Шард 6 Шард 7 Шард 8

Шард 1 Шард 2 Шард 3 Шард 4 Шард 5 Шард 6 Шард 7 Шард 8

Сервер 1

Сервер 1 Сервер 2

Сервер 1 Сервер 3 Сервер 2 Сервер 4

Сервер 1 Сервер 3 Сервер 2 Сервер 4Сервер 5 Сервер 6 Сервер 7 Сервер 8

Page 89: Учебный день конференции HighLoad++ 2013

89

Инструмент #11

Центральный диспетчер

Page 90: Учебный день конференции HighLoad++ 2013

90

Инструмент #12

Репликация

Page 91: Учебный день конференции HighLoad++ 2013

Репликация

Бекенд

Лог обновлений MongoDB

Обновления слушаются содной из реплик

Мастер MongoDB

Запись поста в блог

Базы данных MongoDB

Реплики MongoDB

Реплики MongoDB

Реплики MongoDB

Репликация

Репликация

Репликация

Push-сервер

Бекенд

Бекенд

Бекенд

Читаем с реплики

Публикация поста

Чтение блога

AJAX-Соообщение об обновлении

Page 92: Учебный день конференции HighLoad++ 2013

92

Инструмент #13

Партиционирование

Page 93: Учебный день конференции HighLoad++ 2013

93

Партиционирование

• Разбиение больших таблиц на логические части по выбранным критериям;

Page 94: Учебный день конференции HighLoad++ 2013

Функциональное разделение базы данныхРазные данные хранятся в разных таблицахили

Разные данные хранятся в разных СУБДили

Разные данные хранятся в разных типах СУБД

Page 95: Учебный день конференции HighLoad++ 2013

95

Инструмент #14

Денормализация

Page 96: Учебный день конференции HighLoad++ 2013

Денормализация данных

Денормализация — намеренное приведение структуры базы данных в состояние, не соответствующее критериям нормализации, обычно проводимое с целью ускорения операций чтения из базы за счет добавления избыточных данных.

Page 97: Учебный день конференции HighLoad++ 2013

97

Инструмент #15

Введение избыточности

Page 98: Учебный день конференции HighLoad++ 2013

98

Инструмент #16

Параллельное выполнение

Page 99: Учебный день конференции HighLoad++ 2013

99

Алгоритм проектирования высоконагруженной системы

Page 100: Учебный день конференции HighLoad++ 2013

100

Алгоритм, ШАГ ПЕРВЫЙОпишем бизнес-логику будущей системы, включая потенциальные пути развития системы

Page 101: Учебный день конференции HighLoad++ 2013

101

Алгоритм, ШАГ ВТОРОЙПосчитаем объёмы хранимых данных и скорость их приращения. Выбираем критический путь – хранение, запись или чтение данных?

Page 102: Учебный день конференции HighLoad++ 2013

102

Алгоритм, ШАГ ТРЕТИЙОпределить допустимую деградацию функций системы

Page 103: Учебный день конференции HighLoad++ 2013

103

Алгоритм, ШАГ ЧЕТВЕРТЫЙПостроим схему движения данных и примем решение, какие из особенностей проектируемой системы мы будем использовать

Page 104: Учебный день конференции HighLoad++ 2013

104

Алгоритм, ШАГ ПЯТЫЙПроектируем схему хранения данных

Page 105: Учебный день конференции HighLoad++ 2013

105

АЛГОРИТМ, ШАГ ШЕСТОЙЛомаем систему и смотрим, что у нас получится

Page 106: Учебный день конференции HighLoad++ 2013

106

Не пора ли кофебрейк?Алгоритм проектирования сразу после перерыва в 30 минут

Page 107: Учебный день конференции HighLoad++ 2013

Примеры

Page 108: Учебный день конференции HighLoad++ 2013

108

ПРОФИЛИ НА САЙТЕ ЗНАКОМСТВСпроектируем систему хранения пользователей на сайте знакомств

Page 109: Учебный день конференции HighLoad++ 2013

109

Сайт знакомств, профили / #1

1. Пользователь заполняет анкету;2. Получает логин пароль для доступа к своему личному кабинету;3. Пользователи могут смотреть профили друг друга;

Page 110: Учебный день конференции HighLoad++ 2013

110

Сайт знакомств, профили / #2

1. Пользователей 200 миллионов;2. Каждая анкета занимает 10 килобайт, то есть всего 2 000

гигабайт;3. Хитов в день 5 миллиардов;

Page 111: Учебный день конференции HighLoad++ 2013

111

Сайт знакомств, профили / #3

1. Деградация недопустима;

Page 112: Учебный день конференции HighLoad++ 2013

112

Сайт знакомств, профили / #4

1. Данные часто читаются, но редко меняются;2. Все анкеты примерно одного размера;3. У анкеты есть уникальный идентификатор;4. Нет ярко выраженных лидеров;

Page 113: Учебный день конференции HighLoad++ 2013

113

Сайт знакомств, профили / #5

Проектируем схему хранения данных

Page 114: Учебный день конференции HighLoad++ 2013

114

Сайт знакомств, профили / #5

Репликация?Вообще 140к чтений в секунду

Page 115: Учебный день конференции HighLoad++ 2013

115

Сайт знакомств, профили / #5

Шардирование?По какому ключу? Диспетчер?

Page 116: Учебный день конференции HighLoad++ 2013

116

Сайт знакомств, профили / #6

Виртуальные шарды

Page 117: Учебный день конференции HighLoad++ 2013

117

Сайт знакомств, профили / #6

Сгорает диск?

Page 118: Учебный день конференции HighLoad++ 2013

118

Сайт знакомств, пользователи / #6

Репликация

Page 119: Учебный день конференции HighLoad++ 2013

119

Сайт знакомств, профили / результат• Разбиваем весь массив пользователей на виртуальные шарды;

• Маппим виртуальные шарды на реальные шарды;

• Внутри каждого шарда реплицируем информацию для отказоустойчивости

Page 120: Учебный день конференции HighLoad++ 2013

Стажировка[email protected]

Page 121: Учебный день конференции HighLoad++ 2013

121

Задания на стажировку

• В двух абзацах и одной схеме описать различия в СУБД MySQL и PostgreSQL;

• Предположить, какие особенности в оптимизации и архитектуре накладывают из-за этого различия возникают;

• Результаты прислать на [email protected]

Page 122: Учебный день конференции HighLoad++ 2013

122

НОВОСТНОЙ САЙТБольшая и длинная лента новостей крупного СМИ

Page 123: Учебный день конференции HighLoad++ 2013

123

Новости / #1

• Пользователь читает свежие новости;• Пользователь читает архивные новости;• Редактор публикует новости;

Page 124: Учебный день конференции HighLoad++ 2013

124

Новости / #2

• Каждая новость примерно 10 килобайт;• Мы вечно храним архив с даты основания СМИ – 2000 год;• В день публикуется около 10 тысяч различных региональных и

федеральных новостей;• Итого в год 3 миллиона 500 тысяч новостей, в год 35 гигабайт, за

20 лет – 700 гигабайт; • Это крупнейшее СМИ, посещаемость – 10 миллионов человек в

сутки;

Page 125: Учебный день конференции HighLoad++ 2013

125

Новости / #3

• Деградация недопустима;

Page 126: Учебный день конференции HighLoad++ 2013

126

Новости / #4

• Количество чтений на несколько порядков превышает количество записей;

• 99% запросов касаются последнего дня;• 99,99% запросов касаются последней недели.

Page 127: Учебный день конференции HighLoad++ 2013

127

Новости / #5

Проектируем схему хранения данных

Page 128: Учебный день конференции HighLoad++ 2013

128

Новости / #5

ПартиционированиеПо какому принципу?

Page 129: Учебный день конференции HighLoad++ 2013

129

Новости / #5

Как переносить данные из горячей БД в архив?

Page 130: Учебный день конференции HighLoad++ 2013

130

Новости / #5

Не надо ничего переносить! Вводим избыточность!

Page 131: Учебный день конференции HighLoad++ 2013

131

Новости / #5

Очень много запросов к горячим новостям!

Что делать?

Page 132: Учебный день конференции HighLoad++ 2013

132

Новости / #5

Кеширование!

Page 133: Учебный день конференции HighLoad++ 2013

133

Новости / результат

• Кеширование для горячих новостей;• Партиционирование новостей по дате – последние новости в

быстрой таблице;• Избыточное хранение новостей – новость пишется сразу и в

горячую таблицу и в архивную, горячая раз в какое-то время чистится;

Page 134: Учебный день конференции HighLoad++ 2013

134

ПРОСМОТР ФРЕНДЛЕНТЫПросмотр френдлента в блогах

Page 135: Учебный день конференции HighLoad++ 2013

135

Просмотр френдленты / #1

• У пользователя может быть сколько угодно друзей;• Френдленту храним бесконечно долго;

Page 136: Учебный день конференции HighLoad++ 2013

136

Просмотр френдленты / #2

• В среднем у пользователя 100 друзей;• Каждый пользователь в среднем пишет 3 поста в день;• Каждый пост занимаем около 1 килобайта;• Пользователей – 10 миллионов в сутки, но каждый пользователь

делает 100 хитов. Итого – миллиард запросов к френдленте в сутки;

• В сутки генерируется 30 миллионов постов, 10 миллиардов записей в год;

Page 137: Учебный день конференции HighLoad++ 2013

137

Просмотр френдленты / #3

• Допустимо, что пользователь увидит запись своего друга не моментально, а с небольшой задержкой;

• Допустимо, что порядок записей не будет строго совпадать с хронологическим;

Page 138: Учебный день конференции HighLoad++ 2013

138

Просмотр френдленты / #4

• 99% запросов приходятся на голову френдленты;• У нас есть пользователи, которые в друзьях у миллионов

пользователей;

Page 139: Учебный день конференции HighLoad++ 2013

139

Просмотр френдленты / #5

Проектируем схему хранения данных

Page 140: Учебный день конференции HighLoad++ 2013

140

Просмотр френдленты / #5

Избыточность?Каждому пользователю свой список записей в его френдленте? Это

же очень много – один триллион записей за год!

Page 141: Учебный день конференции HighLoad++ 2013

141

Просмотр френдленты / #5

Храним для каждого пользователя ленту идентификаторов постов!

Page 142: Учебный день конференции HighLoad++ 2013

142

Просмотр френдленты / #5

Шардирование?Чего? По какому принципу?

Page 143: Учебный день конференции HighLoad++ 2013

143

Просмотр френдленты / #5

Пользователь и его посты лежат рядом

Сделайте составной идентификатор поста, пусть в него входит идентификатор пользователя

Page 144: Учебный день конференции HighLoad++ 2013

144

Просмотр френдленты / #5

Достали список идентификаторов постов

Как собрать ленту?

Page 145: Учебный день конференции HighLoad++ 2013

145

Просмотр френдленты / #5

Толстый клиент!

Page 146: Учебный день конференции HighLoad++ 2013

146

Просмотр френдленты / #5

Если вы круты, то можете попробовать

Параллельные вычисления

Page 147: Учебный день конференции HighLoad++ 2013

147

Просмотр френдленты / результаты• Пользователи шардируются, рядом с пользователями лежат его

посты и его френдлента;

• В френдленте пользователя уже записаны идентификаторы постов его друзей в порядке, близком к хронологическому;

• В идентификатор поста зашит ID пользователя, по которому мы быстро определяем шард и забираем с него текст поста;

• За текстом поста у нас будет ходить JS-машина, работающая на клиенте.

Page 148: Учебный день конференции HighLoad++ 2013

148

Запись френдленты / #5

А как посты попадают в френдленту?

У нас ведь есть пользователи, которые в друзьях у миллионов?

Page 149: Учебный день конференции HighLoad++ 2013

149

Запись френдленты / #5

Используем очереди!

Page 150: Учебный день конференции HighLoad++ 2013

150

И далее по аналогииАлгоритм универсален!

Page 151: Учебный день конференции HighLoad++ 2013

151

Блок “Если успеем”На этот раз уже без перерыва!

Page 152: Учебный день конференции HighLoad++ 2013

152

Надежность высоконагруженной веб-системы

Page 153: Учебный день конференции HighLoad++ 2013

Принципы надежности

• Взаимозаменяемость серверов;• Избыточность данных, дублирование узлов:

• Фронтенд: DNS-балансировка, CARP, heartbeat;• Бекенд: гомогенные взаимозаменяемые бекенды;• База данных: дублирование данных, репликации, кластера;

Page 154: Учебный день конференции HighLoad++ 2013

154

Мониторинг

Page 155: Учебный день конференции HighLoad++ 2013

Мониторинг

Вы должны с абсолютной точностью знать, что происходит в системе.

• Мониторинг серверов;• Мониторинг приложений;• Мониторинг элементов приложений;• Мониторинг показателей базы данных;

Page 156: Учебный день конференции HighLoad++ 2013

Мониторинг: pinba

Page 157: Учебный день конференции HighLoad++ 2013

Мониторинг: pinba

Page 158: Учебный день конференции HighLoad++ 2013

Деплоймент

Регулярный быстрый автоматический деплоймент с возможностью сплит-тестирования и возможностью быстрого отката.

Page 159: Учебный день конференции HighLoad++ 2013

159

Лайфхаки

Page 160: Учебный день конференции HighLoad++ 2013

160

Различное строение СУБД

Page 161: Учебный день конференции HighLoad++ 2013

161

Буферизация в операционной системе

Электрический сигнал Сетевая карта

Операционная система, Сетевая подсистема

nginx

apache PHP

Операционная система, дисковая подсистема

Диск

ПамятьБаза данных

Page 162: Учебный день конференции HighLoad++ 2013

162

Синхронная обработка, синхронные запросы

Page 163: Учебный день конференции HighLoad++ 2013

163

Бездумное использование ORM

Page 164: Учебный день конференции HighLoad++ 2013

Стажировка[email protected]

Page 165: Учебный день конференции HighLoad++ 2013

165

Задания на стажировку

• В двух абзацах и одной схеме описать различия в СУБД MySQL и PostgreSQL;

• Предположить, какие особенности в оптимизации и архитектуре накладывают из-за этого различия возникают;

• Результаты прислать на [email protected]

Page 166: Учебный день конференции HighLoad++ 2013

Вопросы[email protected]

Page 167: Учебный день конференции HighLoad++ 2013

167

Дополнительные примеры

Page 168: Учебный день конференции HighLoad++ 2013

Event-driven чат

Основной сервер (PHP-бекенд)

Основная базаMySQL

Быстрая база MongoDB

Быстрый серверNode.JS или phpDaemon

Клиенты

AJAX Long polling

POST-запрос с сообщением

Пишем постоянную версию

Поток репликации

Page 169: Учебный день конференции HighLoad++ 2013

Лента новостейПользователь А

публикует запись

Сохраняем запись в статичном постоянном

хранилище

Удачны обе операции?

Ставим в очередь З задачу обновить ленты

подписчиков пользователя А

Например, RabbitMQ

Публикация произошла успешно

Удачно?

Удаляем (или не коммитим) запись в

статичное хранилище.

Сервер очередей

Пул процессов, обслуживающих

очередь

Обновляем соответствующие

списки идентификаторов

Постоянное хранилище

Пользователь B, подписанный на

пользователя А, читает свою ленту

Запрашиваем список идентификаторов

записей из ленты B

Обрабатываем идентификаторы и для

каждого из них запрашиваем данные из постоянного хранилища

Этот процесс тоже можно оптимизировать, группировать.

Сначала можно запросить подробности по двум записям,

потом по четырем, потом по всем оставшимся.

Да

Запись не сохранилась

Нет

Нет Да

Хранилище лент, каждая лента =

список идентификаторов

записей

Страница построена

Page 170: Учебный день конференции HighLoad++ 2013

Хранение бинарных данных

Frontend / 1

nginx

Design images

memcached

Frontend / 2

Design images

nginx memcached

Пользователи

DNS-БалансингDNS-Балансинг

Image Server / 1

User images

nginx

Image Server / 3

User images

nginx

Image Server / 2

User images

nginx

Backend / 1

PHP + Limb

Backend / 2

PHP + Limb

Backend / 3

PHP + Limb

Демоны

Database / 1

MySQL

Закачивание фотографии

После того, как nginx полностью принялфотографию, он отправляет ее в

php-бекенд

Пишем в базуданных метаинформацию

о фотографии

По scp заливаем фотку (все варианты)на один из серверов

Отдачафотографии напрямую

с хоста