30 июня была проведена онлайн-сессия «Вопросы к ведущим мировым экспертам PostgreSQL». В течение трёх часов любой желающий мог задать вопрос одному из приглашённых гостей и получить исчерпывающий ответ. В результате было получено более 40 вопросов, ни один из которых не остался без внимания.
Участники: Брюс Момджан (Bruce Momjian) (PGDG, EnterpriseDB), Максим Богук (Rambler, Мастерхост), Фёдор Сигаев (PGDG), Марко Креэн (Marko Kreen) (Skype).
Вот избранные вопросы и ответы:
Вопрос (kai): Одна из досадных штук в работе — это отсутствие конструкции "INSERT OR UPDATE". В MySQL можно сделать так: "INSERT INTO users (username, email) VALUES ('Jo', '[email protected]') ON DUPLICATE KEY UPDATE email = '[email protected]'". Появится ли что-нибудь похожее в PostgreSQL ?
Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB:
Стандартный (ANSI) способ для таких вещей — это MERGE или UPSERT. Оба способа находятся у нас в TODO-листе и, насколько я знаю, кто-то работает над этой функциональностью для PostgreSQL 8.4, хотя лично я ещё не видел этого патча. Мы, вне всяких сомнений, нуждаемся в таком синтаксисе.
Вопрос (Alexander): Вопросы к разработчикам Skype:
1) Хочется оценить масштабы Skype, хотя бы приблизительно. Сколько пользователей сейчас зарегистрировано? Сколько пользователей находятся одновременно онлайн? Сколько транзакций в секунду выполняет Ваш PostgreSQL? Сколько у Вас серверов PostgreSQL?
2) Как правильно померить количество транзакций в секунду в PostgreSQL?
Марко Креэн, инженер компании Skype:
1) Общее количество пользователей у нас сейчас в районе 300 миллионов. Я точно не знаю насчёт активных пользователей, но мой Skype-клиент показывает, что сейчас онлайн находятся 10 миллионов пользователей, и это далеко не пиковая нагрузка. У меня нет точных цифр по количеству транзакций в секунду (TPS), но, кажется, наша нагрузка — где-то в районе 10-20 тысяч TPS. Всего у нас более 100 серверов PostgreSQL, хотя и не все из них работают одновременно.
2) Используйте анализатор логов или pgBouncer, установленный перед базой данных, он даёт такую статистику.
Вопрос (Сергей Коноплёв):
У нас есть задачи генерации событий на основе операций в БД: добавление/изменение/удаление. Это, конечно, можно делать в триггерах, но на уровне WAL файлов IMHO это было бы эффективнее, не говоря о том, что обработку можно было бы делать отложенной и вынесенной. Вопрос - есть ли хорошо документированный API для работы с WAL файлами и, если есть, насколько сильно он будет меняться от версии к версии? Если да, то где можно найти информацию об этом?
Фёдор Сигаев, ведущий разработчик PostgreSQL:
Внешнее API отсутствует, поскольку никогда не предполагался внешний доступ к WAL-файлам. Более того, их формат совместим только для минорных версий, гарантии совместимости форматов между major-версиями никогда даже не предполагалось. В Постгресе даже нет центрального расшифровщика WAL-записей, каждая запись в некотором смысле контейнер, который имеет признак расшифровщика (таблица, btree-индекс, GiST-индекс и т.д.) Строить свою обработку на WAL-логах не очень удобно ещё и по следующей причине: файлы могут использоваться повторно, и Постгрес никак не оповещает внешний мир об этом.
Брюс Момджан, лидер сообщества PostgreSQL, эксперт компании EnterpriseDB:
То есть, Вы ищете способ чтения WAL-файлов напрямую? Не существует никакого API для этого, так как их внутренний формат достаточно сложен. Я сейчас понял, что возможность чтения логов могла бы быть полезной, возможно, нам стоит рассмотреть вопрос о включении этого пожелания в TODO-лист. У нас есть на самом деле pg_filedump, но я не уверен, что он дампит WAL-файлы.
Марко Креэн, инженер компании Skype:
Может быть, это более эффективно, но менее надёжно (например, WAL-файл может сротироваться без вашего ведома). Пожалуйста, попробуйте PgQ из пакета Skytools и поизучайте скрипты, которые используют этот механизм для организации очереди. Это очень эффективная очередь внутри базы данных, легкая в использовании и надёжная. Также в ней существует встроенный фреймворк для того, чтобы гарантировать транзакции между несколькими базами данных при обработке очереди. Ещё в ней существуют триггеры, которые автоматически определяют структуру таблиц и форматируют данные в легко разбираемом формате (urlencode).
Полную историю онлайн-сессии можно прочитать здесь.
|