Масштабируемая система голосования на базе 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
Top Related