Главный сервер Informix, версия варьируется от 9.40 до последней, база данных - . Неразработано по дизайну, которое невозможно изменить. Slave-сервер - это последний PostgreSQL. Master и slave являются отдельными машинами, сетевая латентность непредсказуема. Мастер-схема статически определена, хорошо известна и не изменяется, поэтому нужно реплицировать только данные. В магистратуре есть три типа таблиц:Informix to Postgres, алгоритм непрерывной репликации данных
- Числовые таблицы данных, обычно один столбец даты, одноразовый столбец и 15-300 int столбцов с ключом 2-3 первичных ключей. Данные никогда не изменяются, добавляются только один раз в заданный интервал (15, 30 или 60 минут) и удаляются при достижении точки сохранения. Набор данных репликации может составлять до 80 000 строк, но обычно он находится в диапазоне от сотен. Эти данные должны быть реплицированы в одну сторону, ведущие к подчиненным. Существует около 30 таблиц этого типа, и их необходимо реплицировать сразу и как можно быстрее, обычно через одну минуту после того, как новый набор интервалов был передан мастеру.
- Таблицы смешанных данных с датами, временем, int и строковыми типами, 30-100 столбцов, еще 2-3 первичных ключа. Эти данные также никогда не меняются, добавляются непрерывно и удаляются при достижении точки хранения. Набор данных составляет до 100 000 строк в час. Требуется односторонняя репликация, мастер-подчиненный. Есть несколько таблиц, как правило, менее 5.
- Таблицы смешанных данных, содержащие типы int и string, менее 10 столбцов, 2-3 первичных ключа. Данные в значительной степени остаются нетронутыми, со случайными добавлениями, изменениями или удалениями. Обычный размер набора реплик непредсказуем, но, вероятно, будет содержать несколько сотен строк. Эти данные должны быть скопированы в обе стороны, как можно быстрее. Существует несколько таблиц этого типа, и их необходимо синхронизировать независимо.
Я искал существующий инструмент, который мог бы делать то, что мне нужно, но похоже, что нет открытого источника. Я, вероятно, собираюсь написать один для моих нужд, и я ищу совет от гуру DB о том, как подойти к этой задаче.
В моей оценке, вероятно, нет единого алгоритма, который бы охватывал все варианты использования, поэтому я могу фактически искать два или три алгоритма. Вот что я нашел до сих пор:
- Пожар триггера мастера изменений, запись строк OIDs (? Делает Informix есть) на временную таблицу, сбросить измененные строки в файл, передать его и загрузить. Вопрос: как буферировать триггер? Мастер-БД не имеет разметки (без транзакций), поэтому триггер будет срабатывать при каждом INSERT. Дополнительная нагрузка на мастера, не хорошая.
- Добавьте задание cron на подчиненное устройство, которое вытащит последние ключи даты/времени из мастера, и если данные новее, потяните его. Проблема: хотя интервал обновления определен, на самом деле он основан на источнике данных (а не на часах базового БД), который, как гарантируется, может меняться от часов ведомого сервера. Более того, может быть несколько источников данных, каждый из которых имеет разные часы, и данные необходимо реплицировать как можно скорее. Единственный способ, который я вижу, это постоянно опросить мастера от подчиненного, надеясь, что к моменту опроса данных данные будут все совершены (транзакций, помните?). Kludgy, медленно, не хорошо.
- Добавить Informix в качестве внешней оболочки данных в Postgres и запускать запросы непосредственно вместо того, чтобы беспокоиться о репликации. Плюсы: простота. Минусы: коннектор Informix, похоже, находится в альфа-стадии, и весь подход в лучшем случае неизвестен.
Я изучал эту тему в течение некоторого времени, и кажется, что ядром проблемы является отсутствие транзакций на стороне мастера.Если бы ведущая БД была зарегистрирована, было бы намного проще ее копировать, но без транзакций задача внезапно становится намного сложнее. Во-первых, как я могу гарантировать, что нет обманов? Другой, как избежать циклов обновления в таблицах типов 3? Учитывая все это, как сделать репликацию максимально быстрой реакцией? Я имею в виду задержку между обновлением данных и началом синхронизации, передача данных - это еще одна тема.
Любые данные приветствуются.
Ничего себе, поэтому в Informix «unlogged» означает «без транзакций», а не просто «не сбой в безопасности», как в Pg. Это делает вещи намного сложнее. Я собирался предложить вам портировать инструменты репликации на основе триггеров, такие как PGQ и Londiste от Skytools, или, может быть, Bucardo, для поддержки бэкэнда Informix. Однако это не сработает, если у вас нет транзакций. –
Лично я думаю, что я переношу 1-ю БД на PostgreSQL ;-). Особенно это касается работы, которую мы выполняем при репликации с логической потоковой передачей (https://wiki.postgresql.org/wiki/BDR_User_Guide, все еще очень альфа). –
@CraigRinger К сожалению, я не могу перенести мастер-БД в Postgres, хотя я бы с удовольствием. Магистр (ы) - это устаревшие системы отчетности, которые мне нужны для агрегирования данных и их наследие нельзя трогать. Я могу добавлять пользователей, триггеры и хранимые процедуры, но делать что-либо большое, как изменения схемы, не входит в таблицу. –