Фон:
У меня есть база данных PostgreSQL (v8.3), которая сильно оптимизирована для OLTP.
Мне нужно извлечь данные из него на полу в режиме реального времени (кто-то обязательно задаст вопрос о том, что такое полурежим в реальном времени, и ответ так же часто, как я разумно могу, но я буду прагматичным, в качестве эталона скажем, мы надеемся на каждые 15 минут) и подаем его в хранилище данных.
Сколько данных? В пиковые времена мы говорим о 80-100 тыс. Строк в минуту, ударяя по OLTP-стороне, вне пика это значительно снизится до 15-20 тыс. Наиболее часто обновляемые строки составляют ~ 64 байта, но есть разные таблицы и т.д., Поэтому данные весьма разнообразны и могут иметь до 4000 байт в строке. OLTP активен 24x5.5.
Лучшее решение?
Из того, что я могу собрать вместе, наиболее практичным решением является следующее:
- Создайте TRIGGER, чтобы записать всю активность DML во вращающийся файл журнала CSV.
- Выполнять любые преобразования.
- Используйте встроенный инструмент DW data pump, чтобы эффективно перекачать преобразованный 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 нуждается в настройке для поддержки этого и имеет много отрицательных побочных эффектов.
- Использование tweaked/взломанного SLONY-SLONY отлично справляется с регистрацией и переносом изменений в подчиненный, поэтому концептуальная структура существует, но предлагаемое решение кажется проще и чище.
- Использование WAL
Кто-нибудь сделал это раньше? Хотите поделиться своими мыслями?