Различные результаты выбора при использовании multimaster через pglogical в PostgreSQL
Существует два узла PostgreSQL 9.6, подписанных друг на друга через pglogical. Если узел A вставляет строку в реплицированную таблицу, то узел B видит ее и наоборот.
Однако, когда я обновляю строку на одном узле, то последующие SELECT
запросы на обоих узлах будут возвращать разные результаты - текущий и некоторые из предыдущих.
Более того, в журналах обоих узлов есть записи о конфликтах репликации.
Почему это происходит и как я могу это исправить?
upd: установка pglogical.conflict_resolution в last_update_wins помогает. Возможно, стоит рассмотреть и другие варианты разрешения конфликта
1 ответ
Мультимастерная репликация сложна.
Существуют конфликты, которые могут возникнуть, если ваше приложение не знает об этом и не специально настроено для репликации с несколькими хозяевами:
Строки, вставленные в разные узлы с одинаковым (автоматически генерируемый первичный ключ, должны конфликтовать.
Если вы измените первичный ключ строки на одном узле при обновлении или удалении его на другом, базы данных "разойдутся", что приведет к будущим конфликтам.
Вам нужно будет исправить свое приложение, чтобы избежать проблем, подобных описанным выше, и вам придется вручную находить и разрешать все конфликты, которые произошли до сих пор.
Вот пример второго случая:
-- node one:
UPDATE person
SET id = 1234
WHERE id = 6543;
-- at the same time on node two
DELETE FROM person
WHERE id = 6543;
Оба оператора будут реплицированы на другой узел, но там ничего не будут делать, потому что оба узла больше не имеют person
с id
6543 больше. Не будет никакого конфликта репликации сразу, но узел один теперь имеет person
этот узел два не имеет. Легко увидеть, как это может привести к конфликтам репликации позже (представьте, что вы вставляете строку в узел, имеющий отношение внешнего ключа к person
1234).
Вот почему в большинстве случаев целесообразно рассмотреть архитектуру, которая не включает репликацию с несколькими хозяевами.