Масштабируемая система голосования на базе PostgreSQL PgQ Сергей Нековаль «Грамант»
Dec 14, 2014
Масштабируемая система голосования на базе 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 = 150 000max_lag = 30 мин.max_count = 150 000
max_lag = 3 мин.max_count = 5 000max_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=77958023’);
COMMIT;
Асинхронность• Где подвох?• Результат часто нужен немедленно
Куда расти?• Отделение исторических таблиц• Несколько БД с очередями• Skytools 3 cooperative consumers• Предварительное суммирование
Pitfalls• Нельзя узнать длину очереди!• Нельзя очистить очередь!• Текстовый формат событий• Документация аскетична
http://wiki.postgresql.org/wiki/Skytools
Вопросы?
Бонусный слайд• Consumer: lag, last_seen