Как синхронизировать два (или n) процесса репликации для баз данных SQL Server? - PullRequest
4 голосов
/ 08 июня 2010

Существуют две основные базы данных и две копии только для чтения, обновляемые стандартной репликацией транзакций.Необходимо сопоставить некоторый объект из обеих баз данных только для чтения, допустим, что базы данных A содержат заказы, а базы данных B содержат строки.

Репликация http://i46.tinypic.com/1tacsx.png

Проблема заключается в том, что репликация в однуБаза данных может отставать от репликации второй базы данных, и в момент сопоставления R-базы данных будут иметь противоречивые данные.Например.

Мы сохранили 2 заказа со строками в 19:00 и 19:03.Процесс сопоставления начался в 19:05, но к моменту сопоставления Репликация базы данных обработала все изменения до 19:03, но репликация базы данных B обработала только изменения до 19:00.После отображения у нас будет сущность заказа с порядком на 19:03 и строками на 19:00.Проблемы гарантированы:)

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

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

UPD:

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

Ответы [ 3 ]

1 голос
/ 15 июня 2010

Кажется, что данная задача не может быть решена в данных ограничениях. Если я правильно понял, число баз данных и схема строки являются константами.

Итак, оставшиеся переменные:

  • Дополнительные "инъекции" в базу данных
  • Временные уловки
  • Триггеры Трюки
  • «Позднее связывание» изменений, реплицированных не вовремя

В настоящее время я нашел только одну идею, которая, кажется, работает:

  1. Добавить триггер в таблицу «Линии», чтобы изменить отметку времени записи «Порядок» (last_line_time)
  2. В реплике дождитесь появления строки со временем, равной last_line_time.
    • Если max (lines.line_time)> order.last_line_time, то порядок устарел
    • Если max (lines.line_time)
    • Если max (lines.line_time) == order.last_line_time, тогда все в порядке, пока:)

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

1 голос
/ 08 июня 2010

Вы не можете. Ваше единственное решение - иметь только одного мастера. Никогда не следует разбивать приложение на разные базы данных, поскольку у вас уже есть проблема даже без репликации . Вы не можете восстановить и A, и B в согласованное состояние. База данных - это ваша единица восстановления, и ее никогда не следует разбивать на отдельные объекты.

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

0 голосов
/ 06 июля 2010

Почему вы не создаете представления, объединяющие таблицы с соответствующими состояниями из базы данных A и базы данных B, например, в базе данных C, которая будет синхронизировать данные, а затем реплицировать их?Я думаю, что таким образом у вас будут согласованные данные.

...