Это лучший способ двунаправленной синхронизации динамических данных в реальном времени с использованием mysql

Вот сценарий. 2 веб-сервера в двух разных местах, имеющих две базы данных mysql с идентичными таблицами. Ожидается, что данные в таблицах будут идентичными в реальном времени.

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

Server A in Location A
==============

Table Names
| ID| NAME  |
|-----------|
| 1 | Tom   |
| 2 | Scott |
|-----------|
| 3 | John  |
|-----------|

Server B in Location B
==============
Table Names
| ID| NAME  |
|-----------|
| 1 | Tom   |
| 2 | Scott |
|-----------|
| 3 | Peter |
|-----------|


Expected Scenario
===========
Table Names
| ID| NAME  |
|-----------|
| 1 | Tom   |
| 2 | Scott |
| 3 | Peter |
| 4 | John  |
|-----------|

Ответ 1

Существует не так много производительности от репликации вашей базы данных на двух мастеров. Однако, если вы правильно скопируете свое приложение, есть отличный бит при сбое.

Настройка Master-Master по существу такая же, как и настройка Slave-Master, но запускается как Slaves, так и важные изменения в ваших конфигурационных файлах на каждом поле.

Мастер MySQL 1:

auto_increment_increment = 2
auto_increment_offset = 1 

Мастер MySQL 2:

auto_increment_increment = 2
auto_increment_offset = 2

Эти два параметра гарантируют, что когда два сервера сражаются по первичному ключу по какой-то причине, они не дублируют и не убивают репликацию. Вместо того, чтобы увеличивать на 1, любое поле автоинкремента по умолчанию будет увеличиваться на 2. На одном поле он начнет смещение от 1 и запустит последовательность 1 3 5 7 9 11 13 и т.д. Во втором окне он начнет смещение на 2 и пробегайте по 2 4 6 8 10 12 и т.д. Из текущего тестирования появляется автоматическое добавление следующего бесплатного номера, а не того, что осталось раньше. Например. Если сервер 1 вставляет первые 3 записи (1 3 и 5), когда сервер 2 вставляет четвертый, ему будет выдана клавиша 6 (не 2, которая остается неиспользованной).

Как только вы установите это, запустите оба из них как Slaves. Затем, чтобы проверить, что оба работают нормально, подключитесь к обеим машинам и выполните команду SHOW SLAVE STATUS, и вы должны заметить, что оба Slave_IO_Running и Slave_SQL_Running должны оба сказать "ДА" на каждом поле.

Затем, конечно, создайте несколько записей в таблице и убедитесь, что в одном поле вставлены нечетные первичные ключи с нумерованным номером, а другой - только с четными номерами.

Затем выполните все тесты, чтобы убедиться, что вы можете выполнять все стандартные приложения на каждом ящике, копируя их на другой.

Это относительно просто, как только это произойдет. Но, как уже упоминалось, MySQL отговаривает его и советует вам убедиться, что вы помните эту функциональность при написании кода приложения.

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

Ответ 2

MySQL не поддерживает синхронную репликацию, однако, даже если бы это было так, вы, вероятно, не захотели бы использовать его (не можете принять удар производительности в ожидании синхронизации другого сервера при каждой транзакционной фиксации).

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

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

Ответ 3

Важно ли, чтобы UID были одинаковыми? Или вы могли бы подумать о том, чтобы таблица или столбец отображали удаленный UID на локальный UID и записывали собственный код синхронизации для объектов, которые вы хотите реплицировать, что делает любое необходимое отображение UID для столбцов внешнего ключа и т.д.?

Ответ 4

Единственный способ обеспечить синхронизацию ваших таблиц - настроить двухканальную репликацию между базами данных.

Но MySQL допускает одностороннюю репликацию, поэтому вы не можете просто решить свою проблему в этой конфигурации.

Чтобы быть понятным, вы можете "настроить" двухканальную репликацию, но MySQL AB отпугивает это.