Масштабируемая система голосования на базе postgresql. pgq...

Post on 10-Jun-2015

1.788 Views

Category:

Documents

4 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

Вопросы?

snekoval@gramant.ru

Бонусный слайд• Consumer: lag, last_seen

top related