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

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
(Состояния записи в логе УБД)
(Состояния записи в логе ЦБД)
Строка 115: Строка 115:
 
=== Состояния записи в логе ЦБД ===
 
=== Состояния записи в логе ЦБД ===
  
{|border="1" cellpadding="2" cellspacing="0" width="680px"
+
{|border="1" cellpadding="2" cellspacing="0" width="780px"
 
  |+
 
  |+
 
  !Состояние
 
  !Состояние

Версия 22:03, 22 августа 2009

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

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

Содержание

Лог изменений

Фиксирование изменений осуществляется в логе, который заполняется триггерами и содержит:

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

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

Состояние базы данных

Мы будем называть целое число S состоянием базы данных. Если S = М, значит все изменения переданы на ЦБД. Если S < M, -- необходимо осуществить передачу. Ситуация, когда S > M означает серьезный сбой в данных репликации, нарушение логической целостности.

В начальный момент времени:

 S = M = 0

Базы данных А и B находятся в идентичном состоянии, если Sa = Sb и очередь сообщений пуста. Поскольку просто физическое отсутствие сообщений в очереди не означает того, что их там не было. То, говорить об идентичности баз мы можем только после того, как ЦБД послала "Запрос состояния УБД" и получила на него ответ.

Состояние базы данных увеличивается на единицу каждый раз, когда подтверждается передача очередного объекта. Фактически, состояние базы данных равно максимальному номеру записи в логе в состоянии C (Confirmed).

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

 Sa = Sb = Мa = Мb = 0

Состояния записи в логе

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

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

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

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

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

Связь в асинхронном режиме

В том случае, если при обмене данными между УБД и ЦБД нет постоянного канала связи, мы будем следующие параметры:

 Tr -- Допустимое время ожидания ответа на посланное сообщение.
 Ts -- Время простоя системы до отсылки запроса о состоянии УБД.

Последовательность обмена сообщениями

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

База А

Проверяется очередь сообщений:

  1. Очередь сообщений пуста:
    1. Проверяется лог на наличие записей в состоянии L. Для каждой такой записи формируется и посылается отдельное сообщение для передачи на базу B. После формирования и успешной отправки сообщения, запись в логе переводится в состояние S (Sent).
  2. Если в очереди присутствуют сообщения сортируем их по порядковому номеру и обрабатываем последовательно:
    1. "Запрос на передачу объекта".
    2. "Запрос состояния УБД".
База B

Проверяется наличие сообщений в очереди.

  1. Очередь пуста:
    1. Ранее было отправлено сообщение "Запрос состояния УБД":
      1. Если интервал времени на ответ не истек, то продолжаем ожидать.
      2. Интервал времени истек. Информируем системного администратора. Повторяем "Запрос состояния УБД".
    2. Если истек интервал проверки связи и состояния УБД, то отсылаем "Запрос состояния УБД".
  2. Очередь не пуста:
    1. ...
  1. Если он соответствует ожидаемому, то происходит считывание и обработка сообщения.
  2. Если номер первого сообщения в очереди меньше ожидаемого, то просто игнорируем его (удаляем).
  3. Если номер первого сообщения в очереди больше ожидаемого, то посылаем запрос на пересылку сообщений с нужными номерами. Останавливаем дальнейшую обработку очереди. Ждем ответа от исходной базы.
  4. ...
Запрос состояния УБД

Когда база B хочет узнать текущее состояние синхронизации с базой А, она посылает специальное сообщение "Запрос состояния УБД" и фиксирует время его отправки. Получив данное сообщение, база А действует в соответствии со своим логом. Если он содержит записи, подлежащие отправке, то формируются и посылаются соответствующие сообщения. Непосредственного ответа на "Запрос состояния УБД" в этом случае не отсылается. Если лог не содержит записей для отправки, то формируется специальное сообщение "Состояние УБД", которым передается число Sa. После отсылки запроса База B периодически проверяет свою очередь сообщений. Если в течение заданного тайм-аута в очередь не поступило ни одного ответа от базы А, то системный администратор оповещается о возможном нарушении канала связи или неполадках на УБД. Если поступил ответ "Состояние УБД", то Sa сверяется с Sb. При их равенстве базы данных считаются идентичными (синхронизированными). Если Sa > Sb, то база B отсылает сообщение "Запрос на передачу объекта" с указанием номера Sb + 1. Состояние, когда Sa < Sb, свидетельствует о серьезной рассинхронизации двух баз данных и требует немедленного информирования системного администратора.

"Запрос состояния УБД" отсылается автоматически по истечении заданного интервала времени с момента обработки последнего сообщения от УБД или с момента отправки предыдущего запроса на состояние, на который не поступило ответа.

Состояния записи в логе УБД

Состояние Описание Переход
L Изменение объекта занесено в лог. Используется для блокировки дальнейших изменений этого объекта и для информирования системы о необходимости формирования и отсылки сообщения на ЦБД. S
B Используется остановки процесса передачи данных на ЦБД. Объект в состоянии B можно редактировать. Пока объект не перейдет из этого состояния в другое состояние, никакой другой объект не может быть изменен. L
S Объект был помещен в сообщение и отослан на ЦБД. Объект в состоянии Sent не может быть изменен. C, F
C Изменение объекта успешно записано в ЦБД. С этого момента снимается блокировка на изменение объекта.
F Изменение объекта не может быть записано в ЦБД. Необходимо срочное вмешательство системного администратора. Объект остается в заблокированном состоянии.

Состояния записи в логе ЦБД

Состояние Описание Переход
R Объект получен и записан в базу данных. С
С Подтверждение записи объекта в базу данных получено на УБД. Увеличиваем состояние ЦБД.
F Объект получен, но не может быть записан в базу данных. Необходимо срочное вмешательство системного администратора. R

Структура сообщения

Поле Описание
Контрольная сумма Хэш код MD5, который позволяет контролировать целостность полученного сообщения. Рассчитывается по всему потоку данных, включая и заголовок.
Идентификатор УБД
Идентификатор ЦБД
Номер записи в логе
Данные
Персональные инструменты
Пространства имён

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