PostgreSQL для хранилища данных: лучший подход для ETL / извлечения данных почти в реальном времени - PullRequest
14 голосов
/ 26 марта 2010

Справочная информация:

У меня есть база данных PostgreSQL (v8.3), которая сильно оптимизирована для OLTP.

Мне нужно извлекать данные из него на основе полу-реального времени (кто-то обязательно спросит, что означает полу-реальное время, и ответ будет настолько часто, насколько это возможно, но я буду прагматичен, как ориентир допустим, мы надеемся на каждые 15 минут) и передаем его в хранилище данных.

Сколько данных? В пиковые моменты времени мы говорим о 80-100 тыс. Строк в минуту, попадающих на сторону OLTP, в непиковое время это значительно снизится до 15-20 тыс. Наиболее часто обновляемые строки имеют размер ~ 64 байта в каждой, но существуют различные таблицы и т. Д., Поэтому данные весьма разнообразны и могут варьироваться до 4000 байтов в строке. OLTP активен 24x5,5.

Лучшее решение?

Из того, что я могу собрать, наиболее практичное решение заключается в следующем:

  • Создать TRIGGER для записи всех действий DML во вращающийся файл журнала CSV
  • Выполните все необходимые преобразования
  • Используйте встроенный инструмент обработки данных DW для эффективной перекачки преобразованного CSV в DW

Почему такой подход?

  • TRIGGERS позволяют выбирать целевые таблицы, а не быть общесистемными + вывод настраивается (т.е. в CSV) и относительно прост в написании и развертывании. SLONY использует аналогичный подход и накладные расходы приемлемы
  • CSV легко и быстро преобразуется
  • Легко накачивать CSV в DW

Рассмотрены альтернативы

  • Использование собственного ведения журнала (http://www.postgresql.org/docs/8.3/static/runtime-config-logging.html). Проблема в том, что он выглядел очень многословно по сравнению с тем, что мне было нужно, и было немного сложнее разобрать и преобразовать. Однако это могло бы быть быстрее, так как я предполагаю, что издержки меньше по сравнению с TRIGGER. Конечно, это облегчит работу администратора, так как он общесистемный, но опять же, мне не нужны некоторые таблицы (некоторые используются для постоянного хранения сообщений JMS, которые я не хочу регистрировать)
  • Запрос данных напрямую через инструмент ETL, такой как Talend, и закачка их в DW ... проблема заключается в том, что для поддержки этой схемы OLTP потребуется настроить, и это имеет много отрицательных побочных эффектов
  • Использование измененного / взломанного SLONY - SLONY хорошо регистрирует и переносит изменения в подчиненное устройство, поэтому концептуальная основа существует, но предлагаемое решение кажется проще и чище
  • Использование WAL

Кто-нибудь делал это раньше? Хотите поделиться своими мыслями?

Ответы [ 3 ]

11 голосов
/ 30 марта 2010

Если предположить, что ваши интересующие таблицы имеют (или могут быть дополнены) уникальный, индексированный, последовательный ключ, тогда вы получите намного лучшее значение от простой выдачи SELECT ... FROM table ... WHERE key > :last_max_key с выводом в файл, где last_max_key является последним значением ключа из последнего извлечения (0 при первом извлечении). Этот инкрементный, отсоединенный подход позволяет избежать введения задержки триггера в пути ввода данных (будь то пользовательские триггеры или модифицированный Slony) и, в зависимости от вашей настройки, может масштабироваться лучше с количеством процессоров и т. д. (Однако, если вам также нужно отслеживать UPDATE s , и вы добавили последовательный ключ, тогда ваши операторы UPDATE должен SET ключевой столбец для NULL, чтобы он получал новое значение и выбирался при следующем извлечении. вы не сможете отслеживать DELETE s без триггера.) Вы имели в виду, когда упомянули Talend?

Я бы не использовал средства ведения журнала, если вы не можете реализовать решение выше ; ведение журнала, скорее всего, включает накладные расходы на блокировку , чтобы гарантировать, что строки журнала записываются последовательно и не перекрываются / не перезаписываются друг друга при записи нескольких бэкэндов в журнал (проверьте источник Postgres.) Затраты на блокировку могут быть не катастрофическими, но Вы можете обойтись без него, если вы можете использовать инкрементную альтернативу SELECT. Более того, запись в журнал оператора заглушит любых полезных сообщений WARNING или ERROR, а сам синтаксический анализ не будет мгновенным .

Если вы не готовы анализировать WAL (включая отслеживание состояния транзакции и готовность переписывать код при каждом обновлении Postgres), я также не обязательно буду использовать WAL - то есть, если у вас нет дополнительного оборудования доступно , в этом случае вы можете пересылать WAL на другую машину для извлечения (на второй машине вы можете использовать триггеры бесстыдно - или даже запись операторов - так как бы ни случилось это не влияет на производительность INSERT / UPDATE / DELETE на основном компьютере.) Обратите внимание, что с точки зрения производительности (на основном компьютере), если вы не можете записывать журналы в SAN, вы получите сопоставимый снижение производительности (с точки зрения, главным образом, перебора кеша файловой системы) от доставки WAL на другой компьютер, а также от запуска инкрементного SELECT.

2 голосов
/ 18 апреля 2010

Если вы можете вспомнить «таблицу контрольных сумм», которая содержит только идентификаторы и «контрольные суммы», вы можете не только быстро выбрать новые записи, но также и измененные и удаленные записи.

контрольная сумма может быть функцией контрольной суммы crc32, которая вам нравится.

0 голосов
/ 03 января 2017

Новое предложение ON CONFLICT в PostgreSQL изменило способ, которым я делаю много обновлений. Я извлекаю новые данные (основанные на row_update_timestamp) во временную таблицу, а затем в одном операторе SQL INSERT в целевую таблицу с помощью ON CONFLICT UPDATE. Если ваша целевая таблица секционирована, то вам нужно прыгнуть через пару обручей (то есть напрямую попасть в таблицу разделов). ETL может произойти при загрузке таблицы Temp (скорее всего) или в ON ON CONFLICT SQL (если тривиально). По сравнению с другими системами "UPSERT" (обновление, вставка, если ноль строк и т. Д.), Это показывает значительное улучшение скорости. В нашей конкретной среде DW нам не нужно / не нужно приспосабливаться к DELETE. Ознакомьтесь с документацией ON CONFLICT - она ​​дает Oracle MERGE возможность заработать!

...