21
«Грабли» при масштабировании веб-приложения или «что происходит при росте с 1М до 50М хитов в сутки». Евгений Коковихин, ведущий разработчик Wapstart. (в конце доклада вам покажут 1000 слонов!)

E Kokovikhin - devconf 2012

Embed Size (px)

DESCRIPTION

Презентация "Грабли машстрабирования"

Citation preview

Page 1: E Kokovikhin - devconf 2012

«Грабли» при масштабировании

веб-приложения

или «что происходит при росте с 1М до 50М хитов в сутки».

Евгений Коковихин, ведущий разработчик Wapstart.

(в конце доклада вам покажут 1000 слонов!)

Page 2: E Kokovikhin - devconf 2012

Кто мы?

• Компания WapStart – владелец крупнейшей в России мобильной

рекламной сети Plus1 WapStart и каталога мобильных сайтов

Top WapStart.

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

сайтов и приложений.

• Ежемесячная рекламная емкость WapStart - свыше 1,5 млрд.

показов, число уникальных посетителей - более 10 миллионов

в месяц.

• Компания WapStart владеет передовыми технологиями

таргетинга и анализа аудитории, позволяющими проводить

рекламные кампании с высокой рентабельностью инвестиций.

© Отдел маркетинга.

Page 3: E Kokovikhin - devconf 2012

Эту картинку я нашел в интернете

Page 4: E Kokovikhin - devconf 2012

… и эту

Page 5: E Kokovikhin - devconf 2012

Задачи, которые решает plus1.wapstart.ru

• Поиск подходящих баннеров для пользователя.

• Сортировка баннеров по релевантности и стоимости.

• Подсчет денег.

• Администрирование баннеров и рекламных площадок.

• Сбор и анализ статистики.

Page 6: E Kokovikhin - devconf 2012

ПО, которое используются

в plus1.wapstart.ru

• PHP 5.3 / php-fpm

• postgresql 9.1

• nginx

• memcache

• Freebsd (fronts)

• Debian (farms)

Page 7: E Kokovikhin - devconf 2012

Конфигурация железа: было

front-server

admin gui

db-server

farm2

farm1

мир Хорошо:

• Хорошо работает при

небольшой нагрузке;

• Все очень просто.

Плохо:

• Разные требования

к железу у разных

ролей;

• Сложно отлавливать

баги и искать узкие

места из-за влияния

других подсистем.

Page 8: E Kokovikhin - devconf 2012

Конфигурация железа: стало

front1

мир

front1

farm-adm farm1 farmN

db-master

db-slave

Хорошо:

• все еще просто;

• легко добавлять и

убирать железо;

• железо разделено по

ролям.

Плохо:

• Вывод железа из

продакшена

в случае отказа

не автоматизирован.

Проблемы:

• сессии;

• картинки /

пользовательские файлы;

• sql запросы,

модифицирующие данные

Page 9: E Kokovikhin - devconf 2012

Статистика (1) Плохо:

• медленно;

• сложно удалять старые

сырые данные;

• сложно

масштабировать.

Проблемы:

• Однажды мы начали

писать быстрее, чем

смогли обрабатывать;

• Внешние ключи не

только полезны, но и

вредны.

событие

DB (raw)

hourly tables daily tables

интерфейсы

аггрегатор

Хорошо:

• выборки очень просты;

• все понятно;

Page 10: E Kokovikhin - devconf 2012

Статистика (2)

событие

файл

hourly tables daily tables

интерфейсы

аккумулятор

temp tables

аггрегатор

Хорошо:

• выборки очень просты;

• все понятно;

Плохо:

• Временные таблицы надо чистить;

Page 11: E Kokovikhin - devconf 2012

Статистика (3)

событие

файл

hourly tables daily tables

интерфейсы

аккумулятор

temp hourly

tables

Аггрегатор /

удалятор

Хорошо:

• Аггрегация работает

годно;

Плохо:

• Данные в дневные таблицы попадают не

одновременно с часовыми (переживем).

Page 12: E Kokovikhin - devconf 2012

Биллинг: было

Рекламодатель

100 рублей

Утро: Вечер:

Владелец сайта

100 рублей

Рекламодатель

150 рублей

Владелец сайта

10 рублей

Рекламодатель

180 рублей

Владелец сайта

20 рублей

Рекламодатель

50 рублей

Владелец сайта

120 рублей

Рекламодатель

70 рублей

Владелец сайта

12 рублей

Рекламодатель

100 рублей

Владелец сайта

30 рублей

Page 13: E Kokovikhin - devconf 2012

Биллинг: стало Счет сумма

User 1 1 000

User 2 100

User 3 100

System 150

… …

… …

Счет сумма

User 1 1 100

User 2 200

User 3 500

System 3 000

… …

… …

time Credit_bill_id Debet_bill_id Amount comment

… User_1 User_2 100 за клики

… … … … …

Page 14: E Kokovikhin - devconf 2012

Мониторим всё

1. Состояние логов

2. Аггрегация ошибок и отправка их почтой

3. Цветные графики

4. Особо критичные триггеры по sms.

Page 15: E Kokovikhin - devconf 2012

Борьба за быстродействие:

• клиенты хотят получать баннер быстро;

• клиенты получают баннеры синхронно;

• аренда оборудования - это дорого.

Page 16: E Kokovikhin - devconf 2012

Борьба за быстродействие: было

Запрос

пользователя

Разбор

onPHP cache

(memcache)

DB (Postgres) Формирование

запроса

Получения

списков

баннеров по

запросу

Проверки в

реальном

времени

Отрисовка и

отдача

пользователю

Плохо:

• Иногда ходим в базу;

• Используем родные объекты

onPHP – медленная сборка.

Проблема:

• Однажды оно перестало

помещаться в кеш.

Page 17: E Kokovikhin - devconf 2012

Борьба за быстродействие: как хотели.

Запрос

пользователя

Разбор

Формирование

запроса

Получение

списков

баннеров по

запросу

Отрисовка и

отдача

пользователю

Преднаполнение

кеша

Мemcache

get model_id=42&gateway_id=1&region_id=199

VALUE model_id=42&gateway_id=1&region_id=199 0 256

a:2:{i:0;O:11:"PlainBanner":13:{s:15:"PlainBannerid";i:31

;s:17:"PlainBannername";N;s:18:"PlainBannertitle";N;s:20:

"PlainBannercontent";N;s:30:"PlainBannersingleLineContent

";N;s:17:"PlainBannerlink";N;s:20:"PlainBannerstateId";N;

s:23:"PlainBannercampaignId";N;s:19:"PlainBannertypeId";N

;s:21:"PlainBannerpictures";a:0:{}s:25:"PlainBannerfakePi

ctures";a:0:{}s:17:"PlainBannerfake";b:0;s:32:"PlainBanne

rshowOnlyWithGraphic";N;}i:1;O:11:"PlainBanner":13:{s:15:

"PlainBannerid";i:42;s:17:"PlainBannername";N;s:18:"Plain

Bannertitle";N;s:20:"PlainBannercontent";N;s:30:"PlainBan

nersingleLineContent";N;s:17:"PlainBannerlink";N;s:20:"Pl

ainBannerstateId";N;s:23:"PlainBannercampaignId";N;s:19:"

PlainBannertypeId";N;s:21:"PlainBannerpictures";a:0:{}s:2

5:"PlainBannerfakePictures";a:0:{}s:17:"PlainBannerfake";

b:0;s:32:"PlainBannershowOnlyWithGraphic";N;}}

END

Не взлетело :(

Page 18: E Kokovikhin - devconf 2012

Борьба за быстродействие:

как получилось Запрос

пользователя

Разбор

Формирование

запроса на каждую

сущность таргетинга

Получение и

объединение

списков баннеров

по запросу

Отрисовка и

отдача

пользователю

Преднаполнение

кеша

Мemcache

Вот так

работает!

Проблемы:

• Разбиратель запроса все еще

может попасть в базу;

• Редкий траффик идет в базу

целиком;

• За преднаполненным кешем

надо следить.

Page 19: E Kokovikhin - devconf 2012

Мониторинг (2)

и как мы раньше жили без pinba?

• Меряем именно то, что происходит на проде;

• Меряем все, что происходит на проде;

• Можем измерять бизнес-метрики;

• Красивые графики.

Page 20: E Kokovikhin - devconf 2012

Резюме:

• Разработка – процесс итеративный.

• Ошибки бывают, не бойтесь ошибаться.

• Не надо думать на 3 года вперед, все равно все изменится.

• Мониторинг – наше всё.

• Сила в простых вещах. Когда все просто – это легко поддерживать

и модифицировать.

Page 21: E Kokovikhin - devconf 2012

Wapstart: • http://wapstart.ru/ https//:plus1.wapstart.ru/

• Продажи: [email protected]

• Разработка: [email protected]

• github: https://github.com/Wapstart

• Habr: http://habrahabr.ru/company/wapstart/

Я: • Mail/jabber: [email protected]

• Github: https://github.com/dovg

• Habr: http://habrahabr.ru/users/dovg/

• Vk: http://vk.com/id2082364

Вопросы?