2013-04-01 3 views
7

AppA хранит/извлекает данные из dbA.tableA. AppB хранит/извлекает данные из dbB.tableA. В этих базах данных одно и то же определение. Для начала dbB.tableA был скопирован с dbA.tableA (при условии, что оба имеют 5 строк).Двунаправленная репликация для той же таблицы MySQL

row6 было создано AppA (скажем, основной ключ 6) row7 был создан AppB (скажем, основной ключ 7). Я хотел бы row7 быть скопирован в dbA.tableA и row6 в dbB.tableA

  1. Это возможно даже для настройки двунаправленной репликации, так что AppA, AppB просматривать одни и те же данные в любой момент времени.

  2. Если первичный ключ является автоматическим приращением, можно ли сохранить целостность данных или существует вероятность столкновения с первичным ключом.

+0

Первичные ключи в различных настройках звучат как вызов для проблем. Как и ряд других требований согласованности. Поэтому я был бы удивлен, если бы это могло быть сделано, чтобы работать достаточно чисто. Однако могут быть хакерские решения, связанные с помощью приложения и его схемы базы данных. Например. вы можете включить идентификатор для генерирующего узла в первичных ключах для новых строк. Вы можете добавить столбец, чтобы отметить, какие строки были перенесены. И так далее. – MvG

+0

@Rpj Собираетесь ли вы принять один из ответов ниже? –

ответ

5

Да, репликация master-master довольно хорошо поддерживается в mysql, поэтому вы можете делать то, что хотите.

Вы хотите, чтобы dbA и dbB имели разные auto_increment_offsets, и чтобы установить auto_increment_increment больше, чем значение по умолчанию 1. См

http://dev.mysql.com/doc/refman/5.0/en/replication-options-master.html

В общем, вы узнаете, вы хотите добавить в ваш соответствующий мой.CNF файлы что-то вроде:

дБ:

[mysqld] 
server-id = 1 
auto_increment_increment = 10 
auto_increment_offset = 1 

DBB:

[mysqld] 
server-id = 2 
auto_increment_increment = 10 
auto_increment_offset = 2 

тогда, когда сервер А вставок значения он будет использовать значение как 1, 11, 21, 31 для его значения первичного ключа .. сервер B будет использовать 2, 12, 22, 32 и т. д. таким образом они никогда не конфликтуют.

Очевидно, что вы можете использовать более низкие значения для вашего auto_increment_increment, например, 2, но в зависимости от того, как вы хотите развить кластер позже, вы можете захотеть дать себе комнату.

+0

Я не думаю, что вопрос включает несколько дебанов mysql. Можно ли установить auto_increment_increment и auto_increment_offset для db/schema? –

+0

О, ну, это была бы странная установка :) Если это так, то это решение не сработает. – hexist

1

Этот ответ предполагает, что вы запускаете обе базы данных/схемы на одном и том же mysqld. Если вы работаете на разных mysqlds, см. Ответ Hexist

Конечно, есть вероятность столкновения: кто должен сказать, что идентификатор 7 не создан в dbA и до того, как репликация произошла, в dbB создан другой идентификатор 7? Особенно при использовании автоматического приращения

Вы можете попробовать несколько вещей, среди:

  • Если идентификатор подписанной ИНТ значения Макс 2147483647. В DBB попробуйте установить начальное автоматическое приращение на 1073741824 (установите его на половину максимального значения). Таким образом, все идентификаторы, созданные в dbB, находятся в более высокой зоне идентификатора, и вероятность столкновения менее вероятна.
  • Try GUID, в вместо автоматического приращения идентификаторов (How should I store GUID in MySQL tables?)

Если оба дБА и DBB находятся на том же сервере MySQL, вы можете просто достичь «репликации», выполнив эти запросы по расписанию или с триггер (на вставке)

Insert into dbA.tableA values (select b.* from dbB.tableA b left join dbA.tableA a on b.id = a.id where a.id is null) 
Insert into dbB.tableA values (select a.* from dbA.tableA a left join dbB.tableA b on a.id = b.id where b.id is null) 

редактировать: К сожалению, Вы не можете использовать автоматическое приращение. Автоматический прирост всегда будет основываться на самом высоком идентификаторе. Таким образом, вы не можете заставить автоинкремент на 1 машине оставаться на низком уровне после получения более высокого идентификатора.

+0

Ах, ответ Hexist дает приятное прикосновение. Не знал о @@ auto_increment_increment и @@ auto_increment_offset. Действительно, используя эти функции, вы все равно можете использовать идентификатор auto incrementing. Но использование этого решения, вероятно, связано с таблицами, запущенными на двух разных серверах mysql. Если это так, запросы «replication», которые я написал, не будут работать, и вам действительно придется выполнять репликацию mysql. –

1

Я бы предложил предоставить управление магазином/восстановлением, чтобы сказать, что AppC, который будет иметь доступ как к dbA, так и к dbB. Также AppC создаст первичный ключ.

0

Предполагая, что вы работаете в обе базы данных на том же туздЫ, например, я добавлю мой бедняка репликации:

create view dbB.tableA as select * from dbA.tableA; 

Что само по себе является синонимами для MySQL бедняка, но она работает очень хорошо включая операции вставки, обновления и удаления.

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

+0

Это никак не отвечает на вопрос ОП. –

+0

Он не отвечает на его вопрос *, поскольку он был поставлен, я согласен, но он может ответить на его * потребность *, в зависимости от вспомогательных условий, которые он опустил из своего вопроса и общей архитектуры его установки. – Tobia

Смежные вопросы