Однонаправленная репликация между двумя базами (постановка)

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
Строка 1: Строка 1:
Рассмотрим вариант однонаправленной репликации между двумя базами A и B. База B работает в режиме только для чтения. Все изменения осуществляются на базе A. В дальнейшем, мы будем использовать термины "Исходная база" для базы А и "Конечная база" для B.  
+
Рассмотрим вариант однонаправленной репликации между двумя базами A и B. База B работает в режиме только для чтения. Все изменения осуществляются на базе A. В дальнейшем, мы будем использовать термины "Удаленная база данных (УБД)" для базы А и "Центральная база данных (ЦБД)" для B.  
  
 
Базы обмениваются между собой сообщениями. Канал связи между базами может быть непостоянным. Т.е. база A может посылать сообщения в тот момент, когда база B недоступна и наоборот. Порядок выполнения действий над объектами на базе A должен сохраняться при переносе на базу B. Транспорт передачи сообщений не гарантирует нам ни сохранности и целости конкретного сообщения, ни сохранения порядка при передаче нескольких сообщений.
 
Базы обмениваются между собой сообщениями. Канал связи между базами может быть непостоянным. Т.е. база A может посылать сообщения в тот момент, когда база B недоступна и наоборот. Порядок выполнения действий над объектами на базе A должен сохраняться при переносе на базу B. Транспорт передачи сообщений не гарантирует нам ни сохранности и целости конкретного сообщения, ни сохранения порядка при передаче нескольких сообщений.
Строка 5: Строка 5:
 
В начальный момент времени базы данных находятся в идентичном состоянии.
 
В начальный момент времени базы данных находятся в идентичном состоянии.
  
Фиксирование изменений, произведенных в базе A, осуществляется в логе, специальной таблице. В логе фиксируется тип и идентификатор объекта, вид операции, порядковый номер изменения. Заполнение лога осуществляется с помощью системы триггеров.
+
Фиксирование изменений, произведенных в базе A, осуществляется в логе, специальной таблице. В логе фиксируется:
 +
* тип и идентификатор объекта,  
 +
* вид операции (создание, изменение, удаление),
 +
* порядковый номер изменения,
 +
* состояние записи.
 +
Заполнение лога осуществляется с помощью системы триггеров.
  
 
Запись в логе находится в определенном состоянии.
 
Запись в логе находится в определенном состоянии.
Строка 11: Строка 16:
 
Первоначальное состояние -- L (Logged). Записи с таким статусом считаются подготовленными к отправке.
 
Первоначальное состояние -- L (Logged). Записи с таким статусом считаются подготовленными к отправке.
  
Объект может быть заблокирован, состояние B (Blocked) записи в логе. В этом случае он не передается, а так как мы не можем нарушать последовательность выполнения операций на конечной базе данных, то нет смысла передавать операции после заблокированной записи. Пользователь должен быть уведомлен о том, какая именно запись вызвала остановку процедуры передачи данных.
+
Объект может быть заблокирован, состояние B (Blocked) записи в логе. В этом случае он не передается, а так как мы не можем нарушать последовательность выполнения операций на конечной базе данных, то нет смысла передавать операции после заблокированной записи. Пользователь должен быть уведомлен о том, какая именно заблокированная запись вызвала остановку процедуры передачи данных.
  
 
Поскольку мы не храним полного состояния объекта в логе, а только ссылку на него, то любое последующее изменение объекта должно быть заблокировано, пока предыдущие изменения не будут успешно переданы на конечную базу данных. Исключение составляют два и более последовательных изменения одного и того же объекта.
 
Поскольку мы не храним полного состояния объекта в логе, а только ссылку на него, то любое последующее изменение объекта должно быть заблокировано, пока предыдущие изменения не будут успешно переданы на конечную базу данных. Исключение составляют два и более последовательных изменения одного и того же объекта.
Строка 22: Строка 27:
  
 
# Исходная база проверяет лог. При наличии записей в состоянии L для каждой из них формируется отдельное сообщение для передачи на конечную базу данных.  
 
# Исходная база проверяет лог. При наличии записей в состоянии L для каждой из них формируется отдельное сообщение для передачи на конечную базу данных.  
# Конечная база данных проверяет наличие сообщений в очереди.  
+
# Конечная база данных проверяет наличие сообщений в очереди. При наличии сообщений они сортируются в порядке возрастания номера. Проверяется номер первого сообщения.
 +
## Если он соответствует ожидаемому, то происходит считывание и обработка сообщения.
 +
## Если номер первого сообщения в очереди меньше ожидаемого, то просто игнорируем его (удаляем).
 +
## Если номер первого сообщения в очереди больше ожидаемого, то посылаем запрос на пересылку сообщений с нужными номерами. Останавливаем дальнейшую обработку очереди. Ждем ответа от исходной базы.
 +
#
  
 
[[Category:Постановка]]
 
[[Category:Постановка]]
 +
[[Category:Репликация]]

Версия 20:43, 16 августа 2009

Рассмотрим вариант однонаправленной репликации между двумя базами A и B. База B работает в режиме только для чтения. Все изменения осуществляются на базе A. В дальнейшем, мы будем использовать термины "Удаленная база данных (УБД)" для базы А и "Центральная база данных (ЦБД)" для B.

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

В начальный момент времени базы данных находятся в идентичном состоянии.

Фиксирование изменений, произведенных в базе A, осуществляется в логе, специальной таблице. В логе фиксируется:

  • тип и идентификатор объекта,
  • вид операции (создание, изменение, удаление),
  • порядковый номер изменения,
  • состояние записи.

Заполнение лога осуществляется с помощью системы триггеров.

Запись в логе находится в определенном состоянии.

Первоначальное состояние -- L (Logged). Записи с таким статусом считаются подготовленными к отправке.

Объект может быть заблокирован, состояние B (Blocked) записи в логе. В этом случае он не передается, а так как мы не можем нарушать последовательность выполнения операций на конечной базе данных, то нет смысла передавать операции после заблокированной записи. Пользователь должен быть уведомлен о том, какая именно заблокированная запись вызвала остановку процедуры передачи данных.

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

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

Запись об успешно принятом объекте имеет состояние R (Received).

Последовательность обмена сообщениями между исходной и конечной базами данных выглядит следующим образом:

  1. Исходная база проверяет лог. При наличии записей в состоянии L для каждой из них формируется отдельное сообщение для передачи на конечную базу данных.
  2. Конечная база данных проверяет наличие сообщений в очереди. При наличии сообщений они сортируются в порядке возрастания номера. Проверяется номер первого сообщения.
    1. Если он соответствует ожидаемому, то происходит считывание и обработка сообщения.
    2. Если номер первого сообщения в очереди меньше ожидаемого, то просто игнорируем его (удаляем).
    3. Если номер первого сообщения в очереди больше ожидаемого, то посылаем запрос на пересылку сообщений с нужными номерами. Останавливаем дальнейшую обработку очереди. Ждем ответа от исходной базы.
Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты