Вставка данных в таблицы удаленных БД из нескольких баз данных через триггер или репликацию или оболочку сторонних данных - PullRequest
0 голосов
/ 01 марта 2019

Мне нужен совет по поводу следующего сценария.

У меня есть несколько встроенных систем, поддерживающих базу данных PostgreSQL, работающих в разных местах, и у нас есть сервер, работающий на CentOS в наших помещениях.

Каждая системаработает в удаленном месте и имеет несколько таблиц в своей базе данных.Эти таблицы имеют те же имена, что и имена таблиц сервера, но каждая система имеет другое имя таблицы, чем другие системы, например:

система 1 имеет таблицы:

  • sys1_table1
  • sys1_table2

Система 2 имеет таблицы

  • sys2_table1
  • sys2_table2

Я хочу обновлять таблицы sys1_table1, sys1_table2, sys2_table1 и sys2_table2 на сервере при каждой вставке, выполненной в системе 1 и системе 2.

Одним из решений является запись триггера накаждая таблица, которая будет выполняться при каждой вставке таблиц обеих систем и вставлять одни и те же данные в таблицы сервера.Этот триггер также удалит записи в системах после вставки данных на сервер.Проблема с этим решением заключается в том, что если соединение с сервером не установлено из-за проблем с сетью, этот триггер не будет выполнен или вставка будет потрачена впустую.Я проверил следующее решение для этого триггера для вставки строк в удаленную базу данных после удаления

Второе решение заключается в репликации таблиц из системы 1 и системы 2 в таблицы сервера.Проблема с репликацией будет в том, что если мы удалим данные из систем, это также приведет к удалению записей на сервере.Я мог бы добавить альтернативный триггер для таблиц сервера, который обновит дублирующуюся таблицу, поэтому реплицированная таблица может опустеть и это не повлияет на данные, но создаст длинный список таблиц, если у нас более 200 систем.

Третье решение - написать внешнюю таблицу с использованием postgres_fdw или dblink и обновить данные внутри таблиц сервера, но повлияет ли это на данные внутри сервера, когда мы удаляем данные из таблицы системы, верно?И что произойдет, если нет соединения с сервером?

Четвертое решение - написать приложение на python внутри каждой системы, которое установит соединение с базой данных сервера и записать данные в режиме реального времени, и еслинет подключения к серверу, так как он будет хранить данные внутри sys1.table1 или sys2.table2 или независимо от того, к какой таблице принадлежат данные, и после повторного подключения код отправит данные таблиц в таблицы сервера.

Какой вариант будет наилучшим в соответствии с этим сценарием?Мне больше нравится решение триггера, но есть ли способ избежать потери данных в случае отключения от сервера?

1 Ответ

0 голосов
/ 01 марта 2019

Я бы выбрал четвертое решение или, возможно, третье, если оно запускается извне базы данных.Таким образом, вы можете легко пережить потерю соединения.

Первое решение с триггерами имеет проблемы, которые вы уже обнаружили.Также плохой идеей является запуск потенциально длительных операций, таких как репликация данных в сети с неопределенным качеством, внутри транзакции базы данных.Длинные транзакции означают длинные блокировки и неэффективный автовакуум.

Второе решение также может быть вариантом, если у вас есть последние версии PostgreSQL, которые поддерживают логическая репликация .Вы можете использовать публикацию WITH (publish = 'insert,update'), чтобы DELETE и TRUNCATE не реплицировались.Репликация может справиться с потерей соединения (на некоторое время), но это не вариант, если вы хотите, чтобы данные в источнике были удалены после того, как они были реплицированы.

...