Top Banner
Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард. Евгений Коковихин, руководитель отдела разработки Wapstart. Разработчик баннерной сети http://plus1.wapstart.ru/.
42

Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Jul 04, 2015

Download

Documents

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Евгений Коковихин, руководитель отдела разработки Wapstart. Разработчик баннерной сети http://plus1.wapstart.ru/.

Page 2: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

О компании WapStart

WapStart – владелец крупнейшей в России мобильной рекламной сети Plus1 WapStart и наиболее полного и популярного в России каталога мобильных сайтов Top WapStart. Компания оказывает услуги тысячам издателей мобильных сайтов и приложений. Ежемесячная рекламная емкость WapStart – свыше 4,2 млрд. показов, число уникальных посетителей – более 25 миллионов. Компания WapStart владеет передовыми технологиями таргетинга и анализа аудитории, позволяющими проводить рекламные кампании в мобильной среде с высокой рентабельностью инвестиций.

Page 3: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Marketing is so marketing

Page 4: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

0

500

1000

1500

2000

2500

3000

3500

4000

4500

Mill

ions

Page 5: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Задача

•  Будьте готовы показать миллиард. //это примерно 13-15K rps.

Page 6: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Год назад у нас было так

front1

farm1 farm2 farm3 farm4 … farmN

front2

Master-db

Slave-db

Cache 1 Cache 2 Cache 3

Page 7: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Идеи

•  Все должно быть локально.

Page 8: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Идеи

•  Пользователь должен всегда попадать на один и тот же бекенд (так как у нас все локально).

Page 9: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Идеи

•  Ротатор (баннерная крутилка / php-fpm) не должен ходить в базу.

Page 10: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Идеи

•  Нужна какая-то умная штука для синхронизации.

Page 11: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Реализация.

Page 12: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Задача: сделать так

front1

farm1

cache1

farm2

cache2

farm3

cache3

farm4

cache4

farmN

cacheN

front2

Master-db

Slave-db

queue filler

Page 13: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Реализация:

•  Для nginx есть модуль persistent upstream https://github.com/replay/ngx_http_consistent_hash

•  Мы его доработали https://github.com/WapStart/ngx_http_consistent_hash

Пользователи должны попадать в один и тот же upstream

include /usr/local/etc/nginx/fastcgi_params; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param CONSISTENT_HASH $consistentHash; fastcgi_param GEOIP_COUNTRY_CODE $geoip_country_code; fastcgi_pass consistent-upstream;

Page 14: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Реализация:

•  Выпиливаем из конфигов подключение к СУБД и отлаживаем.

Безбазье

Page 15: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Реализация:

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

серверах. •  Интерфейс неизменный. При этом читаем всегда из локального

кеша, а пишем во все. •  Пишем только из центра.

Преднаполняторы кеша

Page 16: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Реализация: Клики

Page 17: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Реализация: Клики; теория перекрутов

•  Показы продолжались после окончания лимитов. •  Пользователь что-то изменил, но это подействовало не сразу. •  Показали до окончания лимитов, но кликнули после.

Page 18: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Реализация: Клики; теория перекрутов

•  Среднюю величину перекрутов любого рода можно предсказать. •  Время реакции тоже предсказуемо.

//Осталось лишь согласовать с бизнесом )

Page 19: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Реализация: Клики; обработка в фоне

•  Было: Event -> database. •  Стало: Event -> file queue -> logAnalyzer -> database. •  Цепочка стала более длинной, время реакции увеличилось.

Решение: •  Предсказываем события.

Page 20: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Масштабирование на уровне дата-центров

Page 21: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Задача. Сделать так:

Центр

Primary DNS

СУБД Синхрони-затор

Управлятор трафиком

Монито-ринг

Internet

Дата-центр 1

Дата-центр 2

Дата-центр 3

Дата-центр 4

Page 22: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

В пределах дата-центра

front1

farm1

cache1

farm2

cache2

farm3

cache3

farmN

cacheN

центр VPN Синхрони-

затор

Page 23: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Масштабирование на уровне дата-центров Можно выбрать дорогой дата-центр, а можно быть

готовым к его падению

•  Пишем LowCost, подразумеваем Hetzner. •  На один рубль обрабатываем в три раза больше трафика! •  Не забывайте про VAT (еще дешевле). •  Пока стандартная конфигурация вас устраивает – все очень

дешево.

Page 24: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Масштабирование на уровне дата-центров

Hetzner: проблемы и ограничения

Page 25: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Масштабирование на уровне дата-центров

•  Не более 6 серверов в «кластере». •  Техподдержка не на вашей стороне. •  Иногда теряются пакеты. •  Иногда «утекает» база паролей и кредиток :) •  Возникают спонтанные проблемы с сетью. •  Не совсем «серверное» железо. Решение •  Приложение должно быть готовым к кратковременному

отсутствию связи. •  Если упадет «датацентр» целиком, мы должны продолжить

работу.

Hetzner: проблемы и ограничения

Page 26: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Масштабирование на уровне дата-центров. Мониторинг.

Page 27: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Масштабирование на уровне дата-центров Мониторинг

•  Трафик/логи.

Page 28: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Масштабирование на уровне дата-центров Мониторинг

•  CPU load.

Page 29: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Масштабирование на уровне дата-центров Мониторинг должен быть распределенным

•  Что будет, если упадет сервер с мониторингом? •  Каждый «узел» должен наблюдаться как минимум из двух мест. •  Особо критичные триггеры должны отправляться по смс.

Page 30: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Масштабирование на уровне дата-центров Как делить трафик?

Page 31: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Масштабирование на уровне дата-центров Как делить трафик: DNS

•  Измеряем трафик по подсетям или странам. •  Создаем view в bind (google://named views). •  Ждем.

Ограничения •  Иногда dns сервер клиента находится за пределами его сети. •  DNS рассасывается не моментально. •  Порции трафика выделяются по подсетям => иногда они

слишком большие, а иногда – маленькие.

Page 32: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Масштабирование на уровне дата-центров Как делить трафик: http permanent rewrites

•  Находим какой-нибудь критерий деления (площадка, user-agent, etc).

•  В nginx rewrite … permanent. •  Изменения вступают в силу сразу.

Ограничения •  Применимо только client-to-server подключений. •  Лишняя нагрузка на фронт-«делитель». •  Повышенное время ответа клиенту.

Page 33: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Масштабирование на уровне дата-центров Как делить трафик: поддомены для крупных

партнеров

•  Для крупных server-to-server партнеров можно завести отдельный субдомен partnerName.ro.plus1.wapstart.ru и заставить гнать траффик на него.

•  Изменяем dns и ждем.

Ограничения •  Применимо только для крупных партнеров. •  Время реакции DNS.

Page 34: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Масштабирование на уровне дата-центров Оставшиеся проблемы

VS

Page 35: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Масштабирование на уровне дата-центров Очереди

•  Списки баннеров доставляются шарманкой, но «срочные изменения» мы пока доставлять не умеем.

•  Аггрегаторы кликов ходят в базу напрямую.

Решение •  Нужен AMQP.

Page 36: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Масштабирование на уровне дата-центров Смерть / потеря связи

•  Дата-центр некоторое время может жить без связи с «центром». •  Деньги не обсчитываются => возможны перекруты. •  Показывать можно не все баннеры. •  Дата-центр может умереть навсегда.

Page 37: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Масштабирование на уровне дата-центров Плюсы

Page 38: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Масштабирование на уровне дата-центров Плюсы

•  Легкое масштабирование. •  Возможность разместить сервера ближе к пользователю (aka

CDN). •  Возможность менять конфигурацию/расположение серверов

без существенных проблем.

Page 39: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Переезд Задача – из-за форс-мажора надо оперативно

поменять основной дата-центр

•  Едем ночью. •  Трафик к крутилке может работать без субд и линейно

масштабирутся. •  Админку перевозим с минутным даунтаймом.

Page 40: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Спасибо!

Page 41: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Контакты.

•  https://wapstart.ru/ •  https://github.com/WapStart •  [email protected] •  https://www.facebook.com/WapStart

•  [email protected] •  https://github.com/dovg •  https://vk.com/ekokovikhin

Page 42: Как показывать 200 миллионов баннеров ежедневно и быть готовым показать миллиард.

Специальный 42ой слайд.