Арсен Мукучян, AdRiver

52
Как мы храним 60000 событий в секунду Арсен Мукучян ведущий разработчик

description

HighLoad++ 2013

Transcript of Арсен Мукучян, AdRiver

Page 1: Арсен Мукучян, AdRiver

Как мы храним 60000 событий в секунду

Арсен Мукучянведущий разработчик

Page 2: Арсен Мукучян, AdRiver

Вопросы, на которые отвечу

● Кто мы и что делаем?● Зачем нам события?● Что было не так?● Почему велосипед?● Как же он едет?

Page 3: Арсен Мукучян, AdRiver

Кто мы?

● 16 лет → рост трафика х2000раз● 60К (~40К) в секунду● 2012год → 1.011.958.233.880 запросов● comScore: май2013: U.S. - 20млрд. ↔ AdRiver - 60млрд.● 200Тб данных

Page 4: Арсен Мукучян, AdRiver

Кто мы?

Сайт AdRiver

Page 5: Арсен Мукучян, AdRiver

Как это работает?

Интернет

Запросы

AdRiver

Подсистема выбора рекламных материалов

1Тб

Базы информации о пользователях

Базы настроек кампаний

База информации о пользователяхБазы-справочники

Рекламные материалы

?

Page 6: Арсен Мукучян, AdRiver

Что такое событие?

0.1 - 2Кб

Page 7: Арсен Мукучян, AdRiver

Сколько их?

Page 8: Арсен Мукучян, AdRiver

Зачем нам события?

AdRiver

Подсистема выбора рекламных материалов

Подсистема хранения событий

Запросы-ответы

Подсистемы анализа событий

Интернет

Page 9: Арсен Мукучян, AdRiver

Зачем нам события?

AdRiver

Подсистема выбора рекламных материалов

Подсистема хранения событий

Запросы-ответы

Подсистемы анализа событий

Интернет

Заказчики

Отчетность по факту оказания услуг

Page 10: Арсен Мукучян, AdRiver

Зачем нам события?

AdRiver

Подсистема выбора рекламных материалов

Подсистема хранения событий

Запросы-ответы

Подсистемы анализа событий

Интернет

Оценка эффективности кампанийОтчетность по факту оказания услуг

Заказчики

Page 11: Арсен Мукучян, AdRiver

Зачем нам события?

AdRiver

Подсистема выбора рекламных материалов

Подсистема хранения событий

Запросы-ответы

Подсистемы анализа событий

Интернет

Прочая интересная аналитика

Оценка эффективности кампанийОтчетность по факту оказания услуг

Заказчики

Page 12: Арсен Мукучян, AdRiver

Зачем нам события?

AdRiver

Подсистема выбора рекламных материалов

Подсистема хранения событий

Запросы-ответы

Подсистемы анализа событий

Интернет

Прочая интересная аналитика

Оценка эффективности кампанийОтчетность по факту оказания услуг

Изменение настроек выбора

рекламных материалов

Заказчики

Page 13: Арсен Мукучян, AdRiver

Зачем нам события?

● Типовая отчетность● Управление эффективностью● Аналитика онлайн:

действия пользователя → критерии выбора● Прочая интересная аналитика

Page 14: Арсен Мукучян, AdRiver

Аналитика: эффективная частота

1 2 3 4 5 6 7 8 9 100

2000

4000

6000

8000

10000

12000

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

Page 15: Арсен Мукучян, AdRiver

Аналитика: пост-клик анализ

Кликнулпо

баннеру

Купить Nexus5в магазине нексусов

Перешел в магазин

Купил Nexus5 в магазине

понедельник среда суббота t

Искал дату

выхода Nexus5

Увидел баннер

Page 16: Арсен Мукучян, AdRiver

Аналитика: наведение на баннер

Люди, которые «водили» по баннеру

t

Искал дату

выхода Nexus5

Увидел баннер

«Водил» по

баннеру

Кликнулпо

баннеру

Анализ наведений

Анализ наведений

Увидел баннер

Настройкакампании

Люди, которые видели баннер

Увидел настроенный

баннер

Page 17: Арсен Мукучян, AdRiver

Аналитика: ядро аудитории

Заполняют survey

Смотрят интересную рекламу

Page 18: Арсен Мукучян, AdRiver

Аналитика: предсказание вероятности взаимодействия

Каждый конкретный пользователь

P = 3.8%

P = 0.72%

P = 24%

Page 19: Арсен Мукучян, AdRiver

Аналитика: «поисковая строка»

15:04:28.829 15:04:29.114 15:04:42.067 t

Бронетанковый чебурашка Бронетанковый чебурашка:альтернативные

результаты поискаПерешел

на целевой

сайт

15:04:39.114

Перешел на сайт из выдачи

Увидел баннер

Ввел поисковый

запрос

Page 20: Арсен Мукучян, AdRiver

Выводы

● События нужно хранить● Аналитика нужна для основных услуг● Аналитика — фундамент новых продуктов● Нужно качество

Page 21: Арсен Мукучян, AdRiver

Как это раньше работало?

Инструмент получениятиповых отчетов

Инструмент минимальнойоценки эффективности

Инструмент анализа аудиторий

Syslog

События

Page 22: Арсен Мукучян, AdRiver

Что было не так?

Инструмент получениятиповых отчетов

Инструмент минимальнойоценки эффективности

Инструмент анализа аудиторий

Syslog

События

X

X

X

X

X

Page 23: Арсен Мукучян, AdRiver

Когда перестало работать?

2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 20150

1000000000

2000000000

3000000000

4000000000

5000000000

6000000000

7000000000

8000000000

9000000000

Год

Собы

тий

в су

тки

Syslog

Page 24: Арсен Мукучян, AdRiver

Что требуется?

● Успеть записать — 400Тб за год, 100K в сек

● Консистентность — непротиворечивость

● Обеспечить чтение — ~1К клиентов к ~1трлн событий, 500К в сек

● Надежность — 100%

● Масштабируемость — объем, скорость

● Отказоустойчивость — self recovery

● Стоимость — 1 x 42u, 32А

Page 25: Арсен Мукучян, AdRiver

На чем поедем?

vs

Page 26: Арсен Мукучян, AdRiver

Что попробовали?MySQL+InnoDB Hadoop+HBase Disco

Последние версия и год 5.5.30, 2013 1.0.3, 0.94.5, 2012 0.2.1, 2009

Объем данных 2Тб 2Тб 500Гб

Железо 2x16ядер 8x12ядер 8x12ядер

Объем хранилища 16Тб 16Тб 2Тб

Запись в кластер 100K в сек 100К в сек 60К в сек

Чтение с кластера 100К в сек 800К в сек 5К в сек

Железа в итоге 6u >42u >42u

Что еще Партиционирование руками, один мастер,мало параллельных запросов

Дорого Дорого, нужна разработка

Page 27: Арсен Мукучян, AdRiver

Нужен велик!

Page 28: Арсен Мукучян, AdRiver

Количество серверов 10

Характеристики серверной единицы SuperMicro XEON X5450 8core, 16Гб RAM, 25Тб RAID-SATA

Объем данных 400Тб (200Тб пакованных)

Количество параллельных клиентов До 2000

Запись/Чтение с ноды 100К в сек / 400К в сек

Исходящий трафик До 20Гбит/сек

Время разработки Меньше года

Платформа x86_64, Gentoo/Debian Linux

Язык разработки с++

Интерфейсы с++, python, shell

Забегая вперед...

Page 29: Арсен Мукучян, AdRiver

Как же он ездит?

● Взгляд сверху● Запись — что пишем?● Консистентность — как синхронизируем?● Чтение — как читаем?● Подходы, проблемы и решения● Итог

Page 30: Арсен Мукучян, AdRiver

Взгляд сверху

Подсистема выборарекламных материалов

Кластерное хранилище History

MUX

Сгенерированные событияПодтверждения

Подсистема выборарекламных материалов

Подсистемы аналитики иподсчета статистики

Запросы к данным

Данные

Синхронизация

нод кластера

Нода 1 Нода 2

Нода 9 Нода 10

...

Page 31: Арсен Мукучян, AdRiver

Событие — единица информации

Вре м

я

0 1 2 3 4 5 6 7 8И

с то ч

ник

Ид е

нти ф

и кат

орТи

п со

б ыти

яСа

й тКа

тего

р ия

Стра

н иц а

сай

таЗо

н а с

т ра н

ицы

Сеть

Тип

сет и

Камп

а ния

Банн

е р

Тип

б ан н

ера

Кука

Груп

п а к

у ки

9 10 11 12 13 14

...94

Став

к а R

T B

Мета информация

Данные

Page 32: Арсен Мукучян, AdRiver

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

Источник 1

Источник N

Подсистема History

Нода XСобытия 1 - 1000

События 1 - 1000

Источник 1

Источник N [1,1000]

[1,1000]

Часданных

Индекс данныхподтверждения

подтверждения

Page 33: Арсен Мукучян, AdRiver

Синхронизация событий

Нода 1 Нода 2

t

События 1 События 2

Индекс событий: 2

Индекс событий: 1 / 2

Состояние данных

Доступные мощности

Запрос данных: 1 / 2

Данные: 1 / 2

Page 34: Арсен Мукучян, AdRiver

Как это выглядит в реальности?

Подсистема выборарекламных материалов

Подсистема History

Нода 1 Нода 2 Нода 3

Нода 4 Нода 5 Нода 6

Нода 7 Нода 8

Нода 9

КлиентыКлиенты

Page 35: Арсен Мукучян, AdRiver

Чтение событий

Нода 1

Клиент

t

События 1События K

Индекс событий: K

Индекс событий: 1 / K

Состояние данных

Доступные мощности

Запрос данных: 1 / K

Данные: 1 / K

Подсистема History

Page 36: Арсен Мукучян, AdRiver

Подход:

Один компонент ↔ Одна функция

Page 37: Арсен Мукучян, AdRiver

Подход: один компонент → одна функция

History Writer

Нода К

Файл Writer'а

History Manager History Server

Файл Server'а

Подсистема выборарекламныхматериалов

Другие ноды History Клиенты

Page 38: Арсен Мукучян, AdRiver

Подход: уменьшение объема данных

Один компонент ↔ Одна функция

Лучшая оптимизация →→ Алгоритмическая оптимизация

Объем данных

Скорость обработки

Page 39: Арсен Мукучян, AdRiver

Подход: уменьшение объема данных

HistoryWriter

Нода К

Диск

HistoryManager

HistoryServer

Дисковыйкеш

Процессор

Память

Intranet

Page 40: Арсен Мукучян, AdRiver

Проблема: мало памяти

Page 41: Арсен Мукучян, AdRiver

Проблема: мало памяти

Решение: потоковая схема хранения и последовательная логика обработки

45ГбПамять

Очередное событие

Page 42: Арсен Мукучян, AdRiver

Подход: страничная файловая организация и сжатие страниц

History Writer

Событие

Страница данных

Пакованная страница

Паковка:lzo, zip, bzip

Файл Пакованная страница

Клиент

History Server

Page 43: Арсен Мукучян, AdRiver

Подход: представление данных

● Собственный протокол● Напоминает Google protobuf● Перед записью её размер →

→ можно их пропускать при чтении● Более богатый выбор типов данных● Тонкая оптимизация под конкретную задачу

Page 44: Арсен Мукучян, AdRiver

Подход: горизонтальное масштабирование данных

Нода 2Группанод 2Нода 1

Группанод 1 Нода 2

Группанод 3

Нода 2Группанод 5 Нода 2

Группанод 6

Группанод 4

Группанод 4

Подсистема выбора рекламных материалов

Подмножествособытий 1

Подмножествособытий 2

Подмножествособытий 3

History

Page 45: Арсен Мукучян, AdRiver

Задача: увеличить скорость получения событий

Page 46: Арсен Мукучян, AdRiver

Задача: увеличить скорость получения событий

History

Клиент

Считаетаналитикудля сайта N

Запрос одного часа данных

Обработка событийсайта N

Все события запрошенного часа

Page 47: Арсен Мукучян, AdRiver

Задача: увеличить скорость получения событий

Вре м

я

0 1 2 3 4 5 6 7 8И

с то ч

ник

Ид е

нти ф

и кат

орТи

п со

б ыти

яСа

й тКа

тего

р ия

Стра

н иц а

сай

таЗо

н а с

т ра н

ицы

Сеть

Тип

сет и

Камп

а ния

Банн

е р

Тип

б ан н

ера

Кука

Груп

п а к

у ки

9 10 11 12 13 14

...94

Став

к а R

T B

Мета информация

Данные

Дополнительный ключ данных

Page 48: Арсен Мукучян, AdRiver

Задача: увеличить скорость получения событий

Запрос одного часа данных,передача дополнительного ключа — сайт N

Объем данных Скорость чтения на 2-5 порядков

History

Клиент

Считаетаналитикудля сайта N

Обработка событийсайта N

Все события запрошенного часаВсе события сайта N за час

Page 49: Арсен Мукучян, AdRiver

Задача: уменьшить latencyПодсистема выбора

рекламныхматериалов

Нода

ДискПамять

Клиент

Writer

Задержка — 0.1сек

Page 50: Арсен Мукучян, AdRiver

Итог: показатели ноды

● 500 клиентов● 3000 файлов● 100К в сек / 400К в сек● 2 Гбит/сек● 2-4Гб памяти● 20-40% CPU

Page 51: Арсен Мукучян, AdRiver

Итог: задача решенаКоличество серверов 10

Характеристики серверной единицы

SuperMicro XEON X5450 8core, 16Гб RAM, 25Тб RAID-SATA

Объем данных 400Тб (200Тб пакованных)

Количество параллельных клиентов

До 2000

Запись/Чтение с ноды 100К в сек / 400К в сек

Исходящий трафик До 20Гбит/сек

Время разработки Меньше года

Платформа x86_64, Gentoo/Debian Linux

Язык разработки с++

Интерфейсы с++, python, shell

Page 52: Арсен Мукучян, AdRiver

Спасибо за внимание!

[email protected]