Масштабируемая система голосования на базе PostgreSQL PgQ Сергей Нековаль «Грамант»
План доклада Обзор PgQ Как мы используем PgQ Pros & Cons
Вступление Сервис позволяет пользователям бесплатно загружать и просматривать видео-контент (японский аналог YouTube): Основной источник дохода – реклама. Число показов в сутки – более 20 млн., 5 ТБ трафика Число зарегистрированных пользователей – более 150 тыс.
Голосуем за видео Обновление статистики голосов и показов Обновление рейтингов Запись истории голосов/показов Что нужно?
События Просмотр 8-9 млн. в сутки Голосование25-30 тыс. в сутки Добавление в избранное5 тыс. в сутки
Где тут голосование?
В наличии на 2008 год: Суммирование голосов с помощью файлов Рейтинги обсчитываются раз в день БД перегружена, статистика запаздывает
«Китайский» вариант
Что делать?
Skytools Разработка компании Skype Open Source Репликация: Londiste Очереди: PGQ
PgQ to the rescue Предоставляет API для работы с очередью Хранит данные в event tables Можно передавать любые данные в событии Ориентирован на обработку множества событий (batch)
Компоненты PgQ
Ticker Ротация таблиц Формирование batches Контроль доставки batches Обработка retry-событий
Consumer API для SQL, Python, PHP, Java Обрабатывает не события, а пачки Producer SELECT pgq.insert_event(queue, type, data, …)
В чем польза PgQ Транзакционность (ничего не пропадает) Асинхронность (регулируется нагрузка) Consumer логически отделен от БД Простота мониторинга (все в БД)
Голосование с помощью PGQ
Новый вариант
Сохраняем структуру БД Front-End (PHP) становится producer-ом На каждый чих в очередь заносится событие Memcache: статистика + рейтинги
Тюнинг очередей ticker_max_lag (время) ticket_max_count (число)
Система как трубопровод
max_lag = 30 мин. max_count = max_lag = 30 мин. max_count = max_lag = 3 мин. max_count = max_lag = 3 мин. max_count = 5 000
Disk I/O
Производительность Vacuum fsync = off Asynchronous commit SET LOCAL synchronous_commit TO OFF; SELECT pgq.insert_event(COUNTER, V, movie_id= ); COMMIT;
Асинхронность Где подвох? Результат часто нужен немедленно
Куда расти? Отделение исторических таблиц Несколько БД с очередями Skytools 3 cooperative consumers Предварительное суммирование
Pitfalls Нельзя узнать длину очереди! Нельзя очистить очередь! Текстовый формат событий Документация аскетична
Вопросы?
Бонусный слайд Consumer: lag, last_seen