Преподаватель
Опубликован: 11.12.2006 | Уровень: специалист | Доступ: свободно
Лекция 27:

Репликация транзакций

Аннотация: Репликация транзакций используется для репликации того, что происходит в транзакциях. Применяется репликация транзакций в ряде случаев: при передаче сообщений, при поддержки текущего состояние информационной базы, при распределении нагрузки. Примеры конфигурирования pull/push-подписок. Использование системной хранимой процедуры sp_adddistributor. Обзор реализаций репликаций транзакций.

В "Репликация в Microsoft SQL Server: обзор типов репликации и репликация моментальных снимков" был дан обзор репликации в Microsoft SQL Server 2000, включая краткое описание репликации транзакций. В данной лекции приводится уже подробное описание этой темы. Здесь описывается, как действует этот метод репликации, когда его следует использовать, а также как его конфигурировать, как выполнять его мониторинг и как настраивать системы, участвующие в репликации транзакций.

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

Введение в репликацию транзакций

Как следует из названия, репликация транзакций используется для репликации того, что происходит в транзакциях. При использовании этого метода репликации база данных подписчика создается первоначально с помощью моментального снимка (snapshot) – мы будем называть его просто снимком, – а последующие изменения, которые вносятся в базу данных издателя, реплицируются подписчику в соответствии с транзакциями. Все обновления, вставки и удаления, выполняемые в базе данных, распространяются именно таким образом.

Транзакции считываются из журнала транзакций агентом чтения журнала Log Reader Agent, который запускается на дистрибьюторе и подсоединяется к издателю. Эти транзакции обрабатываются и помещаются в дистрибутивную базу данных на дистрибьюторе. Позже агенты распространения (Distribution Agents) считывают эту информацию из дистрибутивной базы данных и применяют транзакции к базе данных подписчика.

Каждая база данных, которая использует репликацию транзакций, имеет собственного агента Log Reader Agent, который запускается на дистрибьюторе и следит за журналом транзакций этой базы данных на издателе. На каждую базу данных используется только один агент Log Reader Agent – независимо от количества публикаций, определенных по соответствующей базе данных.

Log Reader Agent запускается на дистрибьюторе в соответствии с расписанием, которое определяется при создании публикации. В зависимости от вашего выбора Log Reader Agent работает в соответствии с регулярным расписанием или непрерывно. При работе Log Reader Agent происходит следующая последовательность событий.

  1. Log Reader Agent читает журнал транзакций системы с данной публикацией и создает список операторов INSERT, UPDATE, DELETE и других модификаций данных, которые были выбраны для репликации, включая удаления таблиц, изменения в определениях колонок и т.д.
  2. Log Reader Agent обрабатывает данные из журнала транзакций и выполняет фильтрации, определенные по статьям. Сюда относятся все горизонтальные и вертикальные фильтрации.
  3. Эти модификации объединяются в пакет и отправляются в дистрибутивную базу данных на дистрибьюторе. Внутри дистрибутивной базы данных имеется несколько таблиц, в которых отслеживаются изменения репликации и задачи. Выполняемые на издателе модификации, которые должны распространяться подписчикам, сохраняются в таблице с именем MSRepl_commands. Эта таблица содержит реальные команды репликации в сжатом формате. Таблица MSRepl_commands содержит по одной строке для каждой операции INSERT, UPDATE и DELETE по каждой определенной ранее статье. Если модификация, которая вносится в таблицу базы данных издателя, относится к нескольким статьям, то это изменение будет дублировано в дистрибутивной базе данных. Например, если таблица A содержится в трех статьях, то изменение в таблице A приведет к появлению трех строк в дистрибутивной базе данных.
  4. После успешной передачи каждого пакета в дистрибутивную базу данных происходит фиксирование транзакций этого пакета. При отказе фиксирования в журнал ошибок агента записывается сообщение об ошибке.
  5. После успешного фиксирования этих изменений в дистрибутивной базе данных Log Reader Agent помечает последнее изменение, включенное в последнюю операцию репликации, чтобы не было повторения этих изменений.
  6. После того как транзакция прочитана из журнала транзакций и фиксирована в дистрибутивной базе данных, Log Reader Agent помечает те строки журнала транзакций, которые подходят для усечения (eligible to be truncated).

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

  • Вставка в таблицу приводит к вставке в дистрибутивную базу данных для каждой статьи, в которую входит данная таблица. Если таблица входит в две различные публикации, то она определена в двух отдельных статьях. Каждая из двух статей получит свою строку в дистрибутивной базе данных для каждой операции вставки, обновления и удаления, выполняемой в базе данных соответствующей публикации.
  • Для каждого обновления или удаления, влияющего на несколько строк, создается соответствующее количество строк в дистрибутивной базе данных. Для оператора SQL, который выполняет операцию обновления или удаления для нескольких строк, агент Log Reader Agent создает по отдельной команде в дистрибутивной базе данных для каждой из этих строк. Предложение WHERE в операторе SQL преобразуется в предложение WHERE, которое указывает строку в базе данных в соответствии со значение первичного ключа. Например, операция обновления, которая влияет на все строки в 10-строчной таблице, приведет к созданию 10 записей в дистрибутивной базе данных, для каждой из которых в предложении WHERE указывается значение первичного ключа.

Применение репликации транзакций

Репликация транзакций может применяться, когда подписчикам требуется поддерживать информацию на уровне текущего состояния данных издателя. Репликацию транзакций можно сконфигурировать таким образом, чтобы обновление подписчика происходило вскоре после обновления издателя. Даже в непрерывном режиме работы агент Log Reader Agent вместо непрерывного чтения обращается к журналу транзакций через определенное количество секунд, чтобы снизить нагрузку на журнал транзакций издателя.

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

  • Передача сообщений. Репликацию транзакций можно использовать для передачи сообщений между системами, когда важно следить за тем, что подписчик получил эти сообщения. Если происходит разъединение в сети, то данные будут переданы, как только соединение в сети будет восстановлено.
  • Поддержка текущего состояния информации в магазинах. Многие компании используют репликацию транзакций для передачи данных между главным офисом и магазинами розничной торговли. При каждом обновлении цен в главном офисе они также обновляются в системах розничной торговли.
  • Распределение нагрузки. Репликацию транзакций можно использовать для снятия части нагрузки с баз данных с помощью отчетных систем, которые могут обрабатывать длительные требующие интенсивного использования ресурсов запросы, освобождая тем самым главные серверы.

Существует много применений для репликации транзакций. В зависимости от конфигурации вашей системы и ваших приложений репликация транзакций может оказаться для вас очень полезным средством.

Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989
Игорь Соловьев
Игорь Соловьев
Россия, Братск