У меня есть два Linux-сервера с Postgresql-10 на каждом из них. На обоих есть база данных, скажем dbexample, с одинаковой схемой, таблицей и всем остальным. Оба они собирают данные из приложения и хранят их в своей базе данных (dbexample). Позвольте мне сказать вам, поскольку оба собирают данные из одного и того же приложения, несоответствия в данных одновременно нет.
Итак, в чем моя проблема? В то время как сервер «А» выходит из строя по любой причине. В этот момент он не может получить данные из приложения. Но поскольку второй - UP, он должен был захватить все данные за то время, когда сервер A был DOWN.
Теперь, когда сервер A работает, я хочу, чтобы все данные реплицировались на этот сервер A с сервера B за это время, чтобы все данные были одинаковыми на обоих серверах.
Учитывая тот же сценарий в случае отказа сервера B, я хочу, чтобы все было наоборот, то есть данные с сервера A реплицировались на сервер B.
Я прошел через множество руководств и нашел следующие решения:
Чтобы установить логическую репликацию между обоими серверами и сделать издателем и подписчиком друг друга. (Но это возможно в одну сторону, а не наоборот, если я не ошибаюсь). Поэтому, пожалуйста, предложите возможное решение.
Организовать сервер C и восстановить схему только базы данных, и сделать сервер A издателем и сервер C его подписчиком. Издатель сервера C и его подписчик сервер B. Сервер B Издатель и Сервер A его подписчик. Это будет так: -
A будет извлекать данные из B,
B будет извлекать данные из C, а
C будет извлекать данные из A.
Возможно ли это, если у A и B уже есть данные в своих базах данных?
Пожалуйста, подскажите, какой из них лучше или любое другое решение, которое у вас есть. Извините за мой язык, если я не могу выразить свою проблему. Спросите меня о любых разъяснениях.
То, что вы хотели бы сделать, обычно выполняется при настройке с несколькими мастерами (запись на оба сервера одновременно). Postgresql-10 не имеет этой функции по умолчанию, поэтому то, что вы пытаетесь сделать, всегда будет чем-то вроде взлома.
Обычно вы настраиваете ведущее устройство и ведомое устройство, а затем реплицируете данные с помощью чего-то вроде wal-shipping (потоковая репликация), а затем отслеживайте это с помощью что-то вроде repmgr. Включение синхронная репликация гарантирует, что на обоих серверах будет одинаковая информация, но вы пишете ее только мастеру!
когда репмгр обнаруживает, что ведущий неисправен, он может автоматически продвигать ведомое устройство к ведущему (и наоборот). А если вы используете синхронную репликацию, у них будут точно такие же данные. Repmgr может выполнить аварийное переключение автоматически.
Я бы также использовал оставайся живым чтобы использовать конкретный IP-адрес на хосте, который является мастером postgresql, и вы настроите этот IP-адрес в качестве назначения для своих клиентов. Сверху вы также можете добавить что-то вроде pgpool2 to load-balance читает и направляет запросы к мастеру автоматически, но учтите, что есть много компонентов, которые нужно правильно настроить и управлять.
Если этого недостаточно и вас действительно устраивает только настройка Master / Master, тогда вам нужно будет использовать какое-нибудь коммерческое решение, например Postgresql BDR который может справиться со всей сложностью за вас.
Вам не нужна двунаправленная репликация и ее дополнительная сложность.
Просто используйте стандартную репликацию и настройте B в качестве резервного для A.
Если A выходит из строя, позвольте B взять на себя роль главного, а затем перенастройте A как резервный для B, возможно, используя pg_rewind
сделать это.
При необходимости повторите при выходе из строя одного из узлов.