SymmetricDS - разрешение конфликтов

Я пытаюсь реализовать двунаправленную синхронизацию с несколькими мастерами для одного центрального узла и многих клиентов с помощью SymmetricDS. Клиенты общаются только с центральным узлом (звездообразная топология). У меня проблема с конфликтами в первичных ключах.

Например, база данных содержит таблицу «человек» с идентификатором столбца, именем, ... В центральной базе данных у меня есть строки:

  1. ааа
  2. BBB
  3. ccc

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

Теперь первый и второй клиенты создают новую строку в своей локальной базе данных. Первый:

  1. ааа
  2. BBB
  3. ccc
  4. ддд

Второй:

  1. ааа
  2. BBB
  3. ccc
  4. эээ

Они попытаются выполнить синхронизацию, но в 4. строке возник конфликт. Этот конфликт можно легко обнаружить в SymmetricDS, но теперь я хочу разрешить его, увеличивая ключ до тех пор, пока он не будет вставлен, а затем отправить изменения обратно клиентам ... Итак, результат будет:

  1. ааа
  2. BBB
  3. ccc
  4. ддд
  5. эээ

в каждой базе данных. Как это сделать? Спасибо.


person user2275785    schedule 27.02.2014    source источник


Ответы (1)


При работе с двунаправленным сценарием с несколькими мастерами не рекомендуется использовать автоматическое увеличение PK.

Стандартная практика - создать GUID для PK, чтобы избежать конфликтов между вашими клиентами.

Дополнительную информацию см. На следующем сайте.

Выбор подходящего первичного ключа для распределенной среды

person Austin Brougher    schedule 27.02.2014
comment
Я знаю это, но, к сожалению, я работаю над существующим проектом (школьным проектом), и я делаю только небольшую часть, где я хочу разработать механизм синхронизации, чтобы заменить существующую ограниченную синхронизацию. Кто-то может подумать, что конфликты на INSERT - обычная проблема в звездообразной сети с центральным узлом, поэтому SymmetricDS реализует некоторый простой механизм для их разрешения. Возможно, это можно сделать с помощью IDatabaseWriterFilter (5.10.2) или с помощью преобразования данных (4.8). Но я не могу понять, как это сделать. - person user2275785; 28.02.2014
comment
Какую базу данных вы используете? Можете ли вы вставить запись и указать свой ПК? С каким объемом данных вы работаете? Как часто будут вставляться записи с одним и тем же ПК? Иногда вы можете разделить диапазон автоматического увеличения PK и запустить каждый из ваших клиентских узлов с другой начальной позиции. В зависимости от вашей базы данных это может быть так же просто, как вставить запись со столбцом PK, включенным в то место, где вы хотите, чтобы этот узел начал увеличиваться. - person Austin Brougher; 28.02.2014
comment
Центральный узел использует PostgreSQL, а клиенты используют Apache Derby. Невозможно определить, какой диапазон может использовать один клиент (количество клиентов неизвестно). В предыдущей версии клиента была очень ограниченная недостаточная синхронизация (только INSERT без внешних ключей). Коллизии были решены путем переназначения идентификатора на новый идентификатор, определенный центральным узлом, и новый идентификатор был отправлен обратно клиенту, который сохранил его в столбце remote_id. Я предполагаю, что эта база данных будет содержать много данных в будущем, и произойдет много столкновений ... Пользователи также могут использовать веб-приложение для непосредственной работы с центральной базой данных. - person user2275785; 28.02.2014