Как pglogical-2 обрабатывает логическую репликацию в одной и той же таблице, обеспечивая возможность записи в обе базы данных?
Основываясь на изображении выше, есть определенные таблицы, которые я хочу видеть во внутренней базе данных (справа). Другие таблицы, которые я хочу воспроизвести во внешней базе данных.
На самом деле существует только один набор значений, которые НЕ ДОЛЖНЫ реплицироваться. Остальная часть базы данных может быть реплицирована. В основном столбцы фактической цены в prices
таблица не может быть воспроизведена по всей. Он должен оставаться во внутренней базе данных.
Поскольку поставщики являются внешними по отношению к сети, они не имеют доступа к внутреннему приложению.
Мой план состоит в том, чтобы создать реплицированную версию того же приложения и позволить поставщикам отправлять предложения и выбирать товары.
Допустим, реплицированные таблицы по крайней мере quotations
а также quotation_line_items
, Эти таблицы должны быть доступны для записи (с точки зрения данных для INSERT, UPDATE и DELETE) как во внешней, так и во внутренней базе данных. Следовательно, в обеих базах данных данные в quotations
а также quotation_line_items
таблицы доступны для записи и должны быть воспроизведены в обоих направлениях.
Данные в других таблицах будут реплицироваться в одном направлении (от внутреннего к внешнему), за исключением столбцов фактических цен на сырье в prices
Таблица.
quotation_line_items
стол будет иметь price_id
колонка. Тем не менее, исходные значения цен в prices
таблица не должна появляться во внешней базе данных.
В конечном итоге я хочу, чтобы данные были согласованы для реплицированных таблиц в обеих базах данных. Я в порядке с синхронной репликацией, так что небольшая задержка (скажем, пара секунд для операций записи) в порядке.
Я столкнулся с pglogical https://github.com/2ndQuadrant/pglogical/tree/REL2_x_STABLE
и у них есть понятие ИЗДАТЕЛЬ и ПОДПИСЧИК.
На основании файла readme я не могу сказать, кто будет выступать в качестве издателя и подписчика, и как настроить его для моей ситуации.
2 ответа
Это не сработает. С настройкой, о которой вы мечтаете, вы обязательно столкнетесь с конфликтами репликации.
Как вы хотите предотвратить конфликтующие изменения данных в двух базах данных? Если вы говорите, что этого не произойдет, подумайте еще раз.
Я считаю, что вам было бы гораздо лучше использовать одну базу данных с двумя пользователями: одна, которая может получить доступ к "секретной" таблице, и другая, которая не может.
Если вы хотите ограничить доступ только к определенным столбцам, используйте представление. Простые представления обновляются в PostgreSQL.
Это возможно с репликацией BDR, которая использует pglogical. На базовом уровне путем выделения диапазонов идентификаторов ключей каждому узлу, чтобы запись была возможна в обоих местах без конфликтов. Однако теперь BDR является платным коммерческим продуктом.