SlideShare a Scribd company logo
«Грабли» при масштабировании
       веб-приложения




  или «что происходит при росте с 1М до 80М хитов в сутки».
     Евгений Коковихин, ведущий разработчик Wapstart.
Кто мы?

• Компания WapStart – владелец крупнейшей в России мобильной
  рекламной сети Plus1 WapStart и каталога мобильных сайтов
  Top WapStart.
• Компания оказывает услуги тысячам издателей мобильных
  сайтов и приложений.
• Ежемесячная рекламная емкость WapStart - свыше 2 млрд.
  показов, число уникальных посетителей - более 13 миллионов
  в месяц.
• Компания WapStart владеет передовыми технологиями
  таргетинга и анализа аудитории, позволяющими проводить
  рекламные кампании с высокой рентабельностью инвестиций.
                                            © Отдел маркетинга.
Эту картинку я нашел в интернете
… и эту
Задачи, которые решает plus1.wapstart.ru
•   Поиск подходящих баннеров для пользователя.
•   Сортировка баннеров по релевантности и стоимости.
•   Подсчет денег.
•   Администрирование баннеров и рекламных площадок.
•   Сбор и анализ статистики.
ПО, которое используются
                   в plus1.wapstart.ru

•   PHP 5.3 (5.4) / php-fpm
•   postgresql 9.2
•   nginx
•   memcache
•   Freebsd (fronts)
•   Debian (farms)
Конфигурация железа: было
Хорошо:                 мир
• Хорошо работает при
  небольшой нагрузке;
• Все очень просто.


Плохо:
• Разные требования
  к железу у разных
  ролей;
• Сложно отлавливать
  баги и искать узкие
  места из-за влияния
  других подсистем.
Конфигурация железа: стало
               мир         Хорошо:
                           • все еще просто;
                           • легко добавлять и
                             убирать железо;
                           • железо разделено по
                             ролям.

  Проблемы:                 Плохо:
  • сессии;                 • Вывод железа из
  • картинки /                продакшена
    пользовательские файлы;   в случае отказа
  • sql запросы,              не автоматизирован.
    модифицирующие данные
Конфигурация железа: инстансы
             мир
Статистика (1)
Хорошо:                   Плохо:
• выборки очень просты;   • медленно;
• все понятно;            • сложно удалять старые
                            сырые данные;
                          • сложно
                            масштабировать.

                          Проблемы:
                          • Однажды мы начали
                            писать быстрее, чем
                            смогли обрабатывать;
                          • Внешние ключи не
                            только полезны, но и
                            вредны.
Статистика (2)
   Хорошо:
   • выборки очень просты;
   • все понятно;
   Плохо:
   • Временные таблицы надо чистить;
Статистика (3)
Хорошо:
• Аггрегация работает годно;


Плохо:
• Данные в дневные таблицы попадают
  не одновременно с часовыми (переживем).
Биллинг: было
Утро:                                         Вечер:


 Рекламодатель                                Рекламодатель
   100 рублей                                   50 рублей

                  Владелец сайта                               Владелец сайта
                    100 рублей                                   120 рублей




Рекламодатель                                Рекламодатель
  150 рублей                                   70 рублей

                 Владелец сайта                               Владелец сайта
                   10 рублей                                    12 рублей




Рекламодатель                                Рекламодатель
  180 рублей                                   100 рублей

                 Владелец сайта                               Владелец сайта
                   20 рублей                                    30 рублей
Биллинг: стало

                Счет         сумма                              Счет     сумма
                User 1            1 000                         User 1        1 100

                User 2             100                          User 2         200

                User 3             100                          User 3         500

                System             150                          System        3 000

                …                    …                          …                …

                …                    …                          …                …




         time            Credit_bill_id   Debet_bill_id   Amount          comment

         …               User_1           User_2          100             за клики

         …               …                …               …               …


Проблема:
• Проводок слишком много.
Мониторим всё
1.   Состояние логов
2.   Аггрегация ошибок и отправка их почтой
3.   Цветные графики
4.   Особо критичные триггеры по sms.
Борьба за быстродействие:



•   клиенты хотят получать баннер быстро;
•   клиенты получают баннеры синхронно;
•   аренда оборудования - это дорого.
Борьба за быстродействие: было
                     Плохо:
      onPHP cache
       (memcache)    •Иногда ходим в базу;
                     •Используем родные объекты
                     onPHP – медленная сборка.
     DB (Postgres)

                     Проблема:
                     •Однажды оно перестало
                     помещаться в кеш.
Борьба за быстродействие: как хотели.
                  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:"Pl
                  ainBannersingleLineContent";N;s:17:"PlainBannerlink";N;s:
                  20:"PlainBannerstateId";N;s:23:"PlainBannercampaignId";N;
                  s:19:"PlainBannertypeId";N;s:21:"PlainBannerpictures";a:0
                  :{}s:25:"PlainBannerfakePictures";a:0:
       Мemcache   {}s:17:"PlainBannerfake";b:0;s:32:"PlainBannershowOnlyWit
                  hGraphic";N;}i:1;O:11:"PlainBanner":13:
                  {s:15:"PlainBannerid";i:42;s:17:"PlainBannername";N;s:18:
                  "PlainBannertitle";N;s:20:"PlainBannercontent";N;s:30:"Pl
                  ainBannersingleLineContent";N;s:17:"PlainBannerlink";N;s:
                  20:"PlainBannerstateId";N;s:23:"PlainBannercampaignId";N;
                  s:19:"PlainBannertypeId";N;s:21:"PlainBannerpictures";a:0
                  :{}s:25:"PlainBannerfakePictures";a:0:
                  {}s:17:"PlainBannerfake";b:0;s:32:"PlainBannershowOnlyWit
                  hGraphic";N;}}
                  END



      Не взлетело :(
Борьба за быстродействие:
     как получилось
                       Вот так
                       работает!
            Проблемы:
 Мemcache   •Разбиратель запроса все еще
            может попасть в базу;
            •Редкий траффик идет в базу
            целиком;
            •За преднаполненным кешем
            надо следить.
Борьба за быстродействие:
                       проект “рыба”!
Обычная работа:
                            •   Все хорошо, пока траффик
                                равномерный.
                            •   Любой редкий траффик идет в
                                базу целиком и делает плохо.
                            •   Много редкого траффика делает
                                очень плохо.
Пришла “Индия”:
Борьба за быстродействие:
                  проект “рыба”!




•   Никогда не ходим в базу.
•   Ключ нормализуется.
•   Вместо базы может быть любой “наполнятор”.
•   …, но иногда падает :(
Мониторинг (2)
          и как мы раньше жили без pinba?
•   Меряем именно то, что происходит на проде;
•   Меряем все, что происходит на проде;
•   Можем измерять бизнес-метрики;
•   Красивые графики.
Резюме:
•   Разработка – процесс итеративный.
•   Ошибки бывают, не бойтесь ошибаться.
•   Не надо думать на 3 года вперед, все равно все изменится.
•   Мониторинг – наше всё.
•   Сила в простых вещах. Когда все просто – это легко поддерживать
    и модифицировать.
Wapstart:
•   http://wapstart.ru/ https://plus1.wapstart.ru/
•   Продажи: sales@co.wapstart.ru
•   Разработка: dev@co.wapstart.ru
•   github: https://github.com/Wapstart
•   Habr: http://habrahabr.ru/company/wapstart/



                                                     Я:
                                                     •    Mail/jabber: dovg@dovg.ru
                                                     •    Github: https://github.com/dovg
                                                     •    Habr: http://habrahabr.ru/users/dovg/
                                                     •    Vk: http://vk.com/id2082364




                                      Вопросы?

More Related Content

PPT
13 октября, DEV {web} - конференция о Highload веб-разработке. "Архитектура п...
PPTX
Chef @DevWeb
PDF
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
PPT
Architechture of a social network for 30M users
PPT
Фотострана, Дмитрий Смирнов
PPTX
Опыт эксплуатации большого проекта на Ruby
ODP
Top10 доводов против языка Ruby
PDF
Иван Карев — Клиентская оптимизация
13 октября, DEV {web} - конференция о Highload веб-разработке. "Архитектура п...
Chef @DevWeb
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
Architechture of a social network for 30M users
Фотострана, Дмитрий Смирнов
Опыт эксплуатации большого проекта на Ruby
Top10 доводов против языка Ruby
Иван Карев — Клиентская оптимизация

What's hot (20)

PDF
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
PDF
Архитектура А/Б тестирования: сделай сам
PDF
Конструктор / Денис Паясь (Яндекс)
PDF
JSLab. Дмитрий Смолин, Дмитрий Филипенко. "React и Webpack с помощью кирки, л...
PDF
Инструменты разные нужны, инструменты разные важны
PDF
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
PDF
Олег Мохов "Куда движется вёрстка и верстальщики Яндекса"
PDF
Петренко Дмитрий. Как построить серверное обеспечение для pbn без футпринтов ...
PDF
Изоморфный JavaScript — будущее уже здесь
PDF
Remote Highload
PDF
Исерсон Илья. Золотая маска: как увеличить продажи, когда топ уже ваш
PPTX
Как устроен поиск
PDF
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
PPTX
Синяя Борода. История одного проекта.
PDF
Top-10 популярных вопросов администраторам баз данных или почему я против св...
PDF
Илья Космодемьянский, PostgreSQL-Consulting.com
PPT
Про качественный поиск (Андрей Аксенов)
PDF
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
PDF
Скорость работы интернет магазина
PPTX
Mysql replication DevConf 2012
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
Архитектура А/Б тестирования: сделай сам
Конструктор / Денис Паясь (Яндекс)
JSLab. Дмитрий Смолин, Дмитрий Филипенко. "React и Webpack с помощью кирки, л...
Инструменты разные нужны, инструменты разные важны
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
Олег Мохов "Куда движется вёрстка и верстальщики Яндекса"
Петренко Дмитрий. Как построить серверное обеспечение для pbn без футпринтов ...
Изоморфный JavaScript — будущее уже здесь
Remote Highload
Исерсон Илья. Золотая маска: как увеличить продажи, когда топ уже ваш
Как устроен поиск
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Синяя Борода. История одного проекта.
Top-10 популярных вопросов администраторам баз данных или почему я против св...
Илья Космодемьянский, PostgreSQL-Consulting.com
Про качественный поиск (Андрей Аксенов)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Скорость работы интернет магазина
Mysql replication DevConf 2012
Ad

Similar to 13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при масштабировании, на которые очень легко наступить", Евгений Коковихин (20)

PDF
E Kokovikhin - devconf 2012
PDF
Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)
PDF
Mihail Korepanov
PDF
Михаил Корепанов "Скорость рендеринга страниц: исследования, замеры, автомати...
PPTX
CodeFest 2012. Ивлиев Р. — Аккуратно переезжаем, или тестирование в проектах ...
PPTX
Всему своё время Highload Junior 2016
PDF
Всему своё время / Роман Ивлиев (Банки.ру)
PDF
Как сделать веб-карту, сохранить здоровье и возненавидеть IE
PDF
Кругом обман или использование стандартных протоколов для нестандартных вещей
PPTX
CodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
PDF
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)
PDF
Андрей Карпов, Приватные байки от разработчиков анализатора кода
PPTX
Построение аналитического хранилища на 100 петабайт
PPT
Новая почта Рамблера (Андрей Шетухин)
PPTX
Little Service in 2h
PDF
How to cook a blockchain and not get burned
PDF
Олег Мохов "Куда идём мы с Пятачком, или О том, куда движется вёрстка и верст...
PDF
Баннерокрутилка на Erlang
PPTX
«тестирование для программистов. или «есть ли жизнь без тестировщиков» ( рома...
PPT
Юрий Цыганенко, QA как услуга
E Kokovikhin - devconf 2012
Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)
Mihail Korepanov
Михаил Корепанов "Скорость рендеринга страниц: исследования, замеры, автомати...
CodeFest 2012. Ивлиев Р. — Аккуратно переезжаем, или тестирование в проектах ...
Всему своё время Highload Junior 2016
Всему своё время / Роман Ивлиев (Банки.ру)
Как сделать веб-карту, сохранить здоровье и возненавидеть IE
Кругом обман или использование стандартных протоколов для нестандартных вещей
CodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Построение аналитического хранилища на 100 петабайт
Новая почта Рамблера (Андрей Шетухин)
Little Service in 2h
How to cook a blockchain and not get burned
Олег Мохов "Куда идём мы с Пятачком, или О том, куда движется вёрстка и верст...
Баннерокрутилка на Erlang
«тестирование для программистов. или «есть ли жизнь без тестировщиков» ( рома...
Юрий Цыганенко, QA как услуга
Ad

More from IT-Portfolio (11)

PDF
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Highload...
PDF
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Эксплуат...
PDF
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Строим N...
PDF
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Оптимиза...
PPT
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Несколько...
PPTX
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
PPTX
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда сто...
PDF
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Шардинг в...
PDF
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Инженерны...
PDF
13 октября, DEV {web} - конференция о Highload веб-разработке. "Особенности р...
PPTX
13 октября, DEV {web} - конференция о Highload веб-разработке. "Управление ок...
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Highload...
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Эксплуат...
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Строим N...
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Оптимиза...
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Несколько...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда сто...
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Шардинг в...
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Инженерны...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Особенности р...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Управление ок...

13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при масштабировании, на которые очень легко наступить", Евгений Коковихин

  • 1. «Грабли» при масштабировании веб-приложения или «что происходит при росте с 1М до 80М хитов в сутки». Евгений Коковихин, ведущий разработчик Wapstart.
  • 2. Кто мы? • Компания WapStart – владелец крупнейшей в России мобильной рекламной сети Plus1 WapStart и каталога мобильных сайтов Top WapStart. • Компания оказывает услуги тысячам издателей мобильных сайтов и приложений. • Ежемесячная рекламная емкость WapStart - свыше 2 млрд. показов, число уникальных посетителей - более 13 миллионов в месяц. • Компания WapStart владеет передовыми технологиями таргетинга и анализа аудитории, позволяющими проводить рекламные кампании с высокой рентабельностью инвестиций. © Отдел маркетинга.
  • 3. Эту картинку я нашел в интернете
  • 5. Задачи, которые решает plus1.wapstart.ru • Поиск подходящих баннеров для пользователя. • Сортировка баннеров по релевантности и стоимости. • Подсчет денег. • Администрирование баннеров и рекламных площадок. • Сбор и анализ статистики.
  • 6. ПО, которое используются в plus1.wapstart.ru • PHP 5.3 (5.4) / php-fpm • postgresql 9.2 • nginx • memcache • Freebsd (fronts) • Debian (farms)
  • 7. Конфигурация железа: было Хорошо: мир • Хорошо работает при небольшой нагрузке; • Все очень просто. Плохо: • Разные требования к железу у разных ролей; • Сложно отлавливать баги и искать узкие места из-за влияния других подсистем.
  • 8. Конфигурация железа: стало мир Хорошо: • все еще просто; • легко добавлять и убирать железо; • железо разделено по ролям. Проблемы: Плохо: • сессии; • Вывод железа из • картинки / продакшена пользовательские файлы; в случае отказа • sql запросы, не автоматизирован. модифицирующие данные
  • 10. Статистика (1) Хорошо: Плохо: • выборки очень просты; • медленно; • все понятно; • сложно удалять старые сырые данные; • сложно масштабировать. Проблемы: • Однажды мы начали писать быстрее, чем смогли обрабатывать; • Внешние ключи не только полезны, но и вредны.
  • 11. Статистика (2) Хорошо: • выборки очень просты; • все понятно; Плохо: • Временные таблицы надо чистить;
  • 12. Статистика (3) Хорошо: • Аггрегация работает годно; Плохо: • Данные в дневные таблицы попадают не одновременно с часовыми (переживем).
  • 13. Биллинг: было Утро: Вечер: Рекламодатель Рекламодатель 100 рублей 50 рублей Владелец сайта Владелец сайта 100 рублей 120 рублей Рекламодатель Рекламодатель 150 рублей 70 рублей Владелец сайта Владелец сайта 10 рублей 12 рублей Рекламодатель Рекламодатель 180 рублей 100 рублей Владелец сайта Владелец сайта 20 рублей 30 рублей
  • 14. Биллинг: стало Счет сумма Счет сумма User 1 1 000 User 1 1 100 User 2 100 User 2 200 User 3 100 User 3 500 System 150 System 3 000 … … … … … … … … time Credit_bill_id Debet_bill_id Amount comment … User_1 User_2 100 за клики … … … … … Проблема: • Проводок слишком много.
  • 15. Мониторим всё 1. Состояние логов 2. Аггрегация ошибок и отправка их почтой 3. Цветные графики 4. Особо критичные триггеры по sms.
  • 16. Борьба за быстродействие: • клиенты хотят получать баннер быстро; • клиенты получают баннеры синхронно; • аренда оборудования - это дорого.
  • 17. Борьба за быстродействие: было Плохо: onPHP cache (memcache) •Иногда ходим в базу; •Используем родные объекты onPHP – медленная сборка. DB (Postgres) Проблема: •Однажды оно перестало помещаться в кеш.
  • 18. Борьба за быстродействие: как хотели. 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:"Pl ainBannersingleLineContent";N;s:17:"PlainBannerlink";N;s: 20:"PlainBannerstateId";N;s:23:"PlainBannercampaignId";N; s:19:"PlainBannertypeId";N;s:21:"PlainBannerpictures";a:0 :{}s:25:"PlainBannerfakePictures";a:0: Мemcache {}s:17:"PlainBannerfake";b:0;s:32:"PlainBannershowOnlyWit hGraphic";N;}i:1;O:11:"PlainBanner":13: {s:15:"PlainBannerid";i:42;s:17:"PlainBannername";N;s:18: "PlainBannertitle";N;s:20:"PlainBannercontent";N;s:30:"Pl ainBannersingleLineContent";N;s:17:"PlainBannerlink";N;s: 20:"PlainBannerstateId";N;s:23:"PlainBannercampaignId";N; s:19:"PlainBannertypeId";N;s:21:"PlainBannerpictures";a:0 :{}s:25:"PlainBannerfakePictures";a:0: {}s:17:"PlainBannerfake";b:0;s:32:"PlainBannershowOnlyWit hGraphic";N;}} END Не взлетело :(
  • 19. Борьба за быстродействие: как получилось Вот так работает! Проблемы: Мemcache •Разбиратель запроса все еще может попасть в базу; •Редкий траффик идет в базу целиком; •За преднаполненным кешем надо следить.
  • 20. Борьба за быстродействие: проект “рыба”! Обычная работа: • Все хорошо, пока траффик равномерный. • Любой редкий траффик идет в базу целиком и делает плохо. • Много редкого траффика делает очень плохо. Пришла “Индия”:
  • 21. Борьба за быстродействие: проект “рыба”! • Никогда не ходим в базу. • Ключ нормализуется. • Вместо базы может быть любой “наполнятор”. • …, но иногда падает :(
  • 22. Мониторинг (2) и как мы раньше жили без pinba? • Меряем именно то, что происходит на проде; • Меряем все, что происходит на проде; • Можем измерять бизнес-метрики; • Красивые графики.
  • 23. Резюме: • Разработка – процесс итеративный. • Ошибки бывают, не бойтесь ошибаться. • Не надо думать на 3 года вперед, все равно все изменится. • Мониторинг – наше всё. • Сила в простых вещах. Когда все просто – это легко поддерживать и модифицировать.
  • 24. Wapstart: • http://wapstart.ru/ https://plus1.wapstart.ru/ • Продажи: sales@co.wapstart.ru • Разработка: dev@co.wapstart.ru • github: https://github.com/Wapstart • Habr: http://habrahabr.ru/company/wapstart/ Я: • Mail/jabber: dovg@dovg.ru • Github: https://github.com/dovg • Habr: http://habrahabr.ru/users/dovg/ • Vk: http://vk.com/id2082364 Вопросы?