2016-04-12 1 views
0

Мне было интересно, есть ли какие-либо инструменты postgresql, которые облегчили бы репликацию только для чтения по запросу. Вот описание проблемы:Postgresql избыточность для запросов только для чтения с обновлением по запросу

  • Каждый процесс изменения данных выполняется в виде нескольких операций (процессы являются сложными - например, данные загрузки, запуска вычислений, которыми управляют больше данных и т.д.). Пока процесс не завершен, я считаю, что база данных будет непоследовательной для отчетности.

  • Отчеты должны использовать только последовательные данных, но они не должны ждать данных процесса для завершения изменяющихся - они должны использовать старые (согласующихся) данные.

В идеале, отчеты должны работать на последовательной снимок базы данных. Идея решения этой проблемы заключается в следующем:

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

не будет использоваться невольник для обеспечения отказоустойчивости, это не цель.

Есть ли хорошее решение этой проблемы? Или, может быть, его можно решить по-другому?

+1

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

+0

Одно из решений, о котором я могу думать: создать таблицы FDW для каждой исходной таблицы, создать материализованные представления на основе таблиц FDW и обновить MVIEWS, как только вы узнаете свою базу данных находится в согласованном состоянии. –

+0

Запуск всего по одной транзакции на самом деле не вариант. Процесс включает в себя несколько потоков, процессов, двоичных файлов. Мат. представления могут быть опцией потенциально, если они могут обновлять только новые данные, а не весь вид - насколько мне известно, postgresql не поддерживает его (?). Это займет слишком много времени. –

ответ

0

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

В моем случае я могу создать «фиктивную» транзакцию и экспортировать ее снимок. Фиктивная транзакция ничего не сделает, она начнется, когда процесс начнется и завершится, когда он будет завершен. Все отчеты будут использовать этот идентификатор моментального снимка для представления данных, которые были видны в то время, когда была создана фиктивная транзакция.

Подробнее о снимках здесь: https://www.willglynn.com/2013/10/25/postgresql-snapshot-export/