Как настроить одноранговую репликацию транзакций (программирование репликации на языке Transact-SQL)

В этом разделе описывается настройка и обслуживание топологии одноранговой репликации с помощью хранимых процедур. Вначале описывается создание трехузловой топологии, а затем объясняется, как добавить и подключить новый узел. Приводятся отдельные процедуры для добавления узла под управлением SQL Server 2005 и добавления узла под управлением SQL Server 2008 и более поздних версий SQL Server. Этот раздел не содержит сведений о параметрах, которые используются для обнаружения конфликтов в одноранговой репликации. Сведения об обнаружении конфликтов см. в разделе Как настроить обнаружение конфликтов в одноранговой репликации транзакций (программирование репликации на языке Transact-SQL).

Настройка топологии очень напоминает настройку ряда стандартных публикаций транзакций и подписок на публикацию транзакций. Самое главное — способ инициализации узлов и значения, указываемые в параметре @sync_type хранимой процедуры sp_addsubscription.

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

  • После настройки первого узла остальные узлы обычно инициализируются его резервной копией. Поэтому для подписок, реплицирующих данные из первого узла в остальные, указывается значение initialize with backup или replication support only. Значение replication support only может использоваться, если система неактивна, однако, если система активна, следует указать значение initialize with backup. Использование значения initialize with backup гарантирует, что все необходимые транзакции будут реплицированы на новый узел.

  • После инициализации узла не требуется его повторная инициализация подписками, реплицирующими данные с других узлов. Поэтому указывается значение replication support only или initialize from lsn. Значение replication support only может использоваться, если система неактивна, однако, если система активна, следует указывать значение initialize from lsn. Использование значения initialize from lsn гарантирует, что все необходимые транзакции будут реплицированы на новый узел.

    SQL Server 2005 не поддерживает значение initialize from lsn. Если топология включает узлы SQL Server 2005, можно соединить новый узел с существующим, но при подключении нескольких узлов систему необходимо заморозить. Замораживание системы подразумевает остановку действий в опубликованных таблицах на всех узлах и проверку получения изменений на каждом узле. Этот процесс подробно описан в последнем подразделе данного раздела.

Описание процедуры

При настройке топологии активных баз данных для добавления первого и второго узлов (узел A и узел B), используется следующая процедура. Для добавления узла C и всех последующих узлов затем используется очередная процедура. Последняя использует в качестве параметра @sync_type значение initialize from lsn. Этот параметр позволяет настраивать топологию при активной системе, не теряя транзакций.

Настройка трехузловой одноранговой топологии

  1. Настройте каждый узел в качестве издателя и свяжите их с локальным или удаленным распространителем. Если используется удаленный распространитель, рекомендуется не применять один и тот же удаленный распространитель для всех узлов, так как это может привести к возникновению точки сбоя. Дополнительные сведения см. в разделе Как настроить публикацию и распространение (программирование репликации на языке Transact-SQL).

  2. На узле A выполните хранимую процедуру sp_addpublication. Укажите значение true в параметре @enabled_for_p2p, значение active в параметре @status и значение true в параметре @allow_initialize_from_backup. Чтобы добавить статьи в публикацию, выполните процедуру sp_addarticle.

  3. Перед настройкой топологии на каждом узле должны присутствовать исходные данные. Для инициализации данных для публикации на каждом узле топологии используются возможности резервного копирования и восстановления SQL Server. Резервное копирование необходимо выполнить на первом настраиваемом узле, в данном случае это узел А. Резервное копирование необходимо выполнить после того, как узел А будет создан и включен для одноранговой репликации. В этом разделе предполагается, что на новых узлах (перед тем как они будут добавлены) не выполняются никакие действия, поэтому одну резервную копию можно использовать для инициализации всех узлов.

    Если на новых узлах какие-либо действия были выполнены до добавления всех узлов, необходимо создать новую резервную копию после добавления всех новых узлов и их синхронизации по крайней мере один раз с узлом А. Тем самым обеспечивается наличие в резервной копии с узла А метаданных обо всех других узлах. Например, если добавляются узлы B и C, на которых происходят какие-либо действия, необходимо выполнить следующее: инициализировать узел B резервной копией с узла A, настроить и синхронизировать узел B, выполнить новое резервное копирование на узле A, инициализировать узел C новой резервной копией, затем настроить и синхронизировать узел C.

    Дополнительные сведения о резервном копировании и восстановлении баз данных см. в разделе Резервное копирование и восстановление баз данных в SQL Server.

    Важное примечаниеВажно!

    При восстановлении базы данных не указывайте параметр KEEP_REPLICATION (в Transact-SQL) или параметр Сохранить настройки репликации (в среде Среда SQL Server Management Studio). Репликация произведет настройку базы данных соответствующим образом при запуске мастера настройки одноранговой топологии.

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

  4. Выполните процедуру sp_addsubscription на узле А. Укажите имя публикации, созданной на узле A, как значение параметра @publication, имя узла B как значение параметра @subscriber, имя целевой базы данных на узле B как значение параметра @destination_db, значение initialize with backup в параметре @sync_type, а также укажите соответствующие значения для параметров @backupdevicetype и @backupdevicename.

  5. На узле A повторно выполните хранимую процедуру sp_addsubscription. На этот раз укажите имя публикации как значение параметра @publication, имя узла C как значение параметра @subscriber, имя целевой базы данных на узле C как параметр @destination_db, значение initialize with backup в параметре @sync_type, а также укажите соответствующие значения для параметров @backupdevicetype и @backupdevicename.

  6. На узле B выполните хранимую процедуру sp_addpublication. Задайте имя публикации в параметре @publication значение true в параметре @enabled_for_p2p, значение active в параметре @status и значение true в параметре @allow_initialize_from_backup. Чтобы добавить статьи в публикацию, выполните процедуру sp_addarticle.

  7. Выполните процедуру sp_addsubscription на узле Б. Задайте имя публикации в параметре @publication, имя узла А в параметре @subscriber, имя целевой базы данных на узле А в параметре @destination_db и значение replication support only в параметре @sync_type.

  8. На узле B еще раз выполните хранимую процедуру sp_addsubscription. На этот раз укажите имя публикации как параметр @publication, имя узла C как параметр @subscriber, имя целевой базы данных на узле C как параметр @destination_db и значение replication support only в параметре @sync_type.

  9. На узле C выполните хранимую процедуру sp_addpublication. Задайте имя публикации в параметре @publication значение true в параметре @enabled_for_p2p, значение active в параметре @status и значение true в параметре @allow_initialize_from_backup. Чтобы добавить статьи в публикацию, выполните процедуру sp_addarticle.

  10. Выполните процедуру sp_addsubscription на узле В. Задайте имя публикации в параметре @publication, имя узла А в параметре @subscriber, имя целевой базы данных на узле А в параметре @destination_db и значение replication support only в параметре @sync_type.

  11. На узле C повторно выполните хранимую процедуру sp_addsubscription. На этот раз укажите имя публикации как параметр @publication, имя узла B как параметр @subscriber, имя целевой базы данных на узле B как параметр @destination_db и значение replication support only в параметре @sync_type.

  12. Если в опубликованных таблицах имеются столбцы идентификаторов, после восстановления диапазон идентификаторов, назначенный для таблиц на узле A, будет также использоваться в таблицах на узлах B и C. Необходимо использовать процедуру DBCC CHECKIDENT для повторной установки начальных значений таблиц на узлах B и C, чтобы обеспечить использование разных диапазонов для каждого сервера.

    Дополнительные сведения об управлении диапазонами идентификаторов см. в подразделе «Назначение диапазонов для ручного управления диапазонами идентификаторов» раздела Репликация столбцов идентификаторов.

Следующая процедура используется для добавления одного или нескольких узлов в топологию, охватывающую узлы под управлением SQL Server 2008 или более поздних версий SQL Server.

Добавление в топологию узла под управлением SQL Server 2008 или более поздней версии

  1. Настройте узел D в качестве издателя и свяжите его с локальным или удаленным распространителем.

  2. Восстановите резервную копию с узла А на узле Г.

  3. Выполните процедуру sp_addpublication на узле Г. Задайте имя публикации в параметре @publication значение true в параметре @enabled_for_p2p, значение active в параметре @status и значение true в параметре @allow_initialize_from_backup. Чтобы добавить статьи в публикацию, выполните процедуру sp_addarticle.

  4. Выполните процедуру sp_addsubscription на узле Г. Задайте имя публикации в параметре @publication, имя узла А в параметре @subscriber, имя целевой базы данных на узле А в параметре @destination_db и значение replication support only в параметре @sync_type.

  5. Выполните процедуру sp_addsubscription на узле А. Задайте имя публикации в параметре @publication, имя узла Г в параметре @subscriber, имя целевой базы данных на узле Г в параметре @destination_db, значение initialize with backup в параметре @sync_type, а также соответствующие значения в параметрах @backupdevicetype и @backupdevicename.

    Узел D мог принять транзакции с узлов B и C через узел A. Эти транзакции рассматриваются в следующем шаге.

  6. Выполните запрос таблицы MSpeer_lsns на узле Г. Столбцы originator и originator_lsn используются, чтобы определить регистрационный номер последней транзакции в журнале (номер LSN), которую узел D получил от узла B.

  7. Выполните процедуру sp_addsubscription на узле Г. Задайте имя публикации в параметре @publication, имя узла Б в параметре @subscriber, имя целевой базы данных на узле Б в параметре @destination_db и значение replication support only в параметре @sync_type.

  8. Выполните процедуру sp_addsubscription на узле Б. Укажите имя публикации как параметр @publication, имя узла D как параметр @subscriber, имя целевой базы данных на узле D как параметр @destination_db, значение initialize from lsn в параметре @sync_type и номер LSN, полученный для узла B, в параметре @subscriptionlsn.

  9. Выполните запрос таблицы MSpeer_lsns на узле Г. Столбцы originator и originator_lsn используются, чтобы определить номер LSN последней транзакции, которую узел D получил от узла C.

  10. Выполните процедуру sp_addsubscription на узле Г. Задайте имя публикации в параметре @publication, имя узла В в параметре @subscriber, имя целевой базы данных на узле В в параметре @destination_db и значение replication support only в параметре @sync_type.

  11. Выполните процедуру sp_addsubscription на узле В. Укажите имя публикации как параметр @publication, имя узла D как параметр @subscriber, имя целевой базы данных на узле D как параметр @destination_db, значение initialize from lsn в параметре @sync_type и номер LSN, полученный для узла C, в параметре @subscriptionlsn.

  12. Если в опубликованных таблицах имеются столбцы идентификаторов, то после восстановления диапазон идентификаторов, назначенный для таблиц на узле A, будет также использоваться в таблицах на узле D. Необходимо использовать процедуру DBCC CHECKIDENT для повторной установки начальных значений таблиц на узле D, чтобы использовать разные диапазоны для каждого узла.

    Дополнительные сведения об управлении диапазонами идентификаторов см. в подразделе «Назначение диапазонов для ручного управления диапазонами идентификаторов» раздела Репликация столбцов идентификаторов.

Как отмечено во введении к этому разделу, основная разница между добавлением узла SQL Server 2005 и добавлением узла более поздней версии SQL Server, заключается в том, что в SQL Server 2005 необходимо заморозить систему, чтобы подключить новый узел к уже существующим. Следующая процедура показывает, как добавить узел SQL Server 2005 к существующей топологии:

  • Первый этап состоит из шагов 1 — 5. На нем узел D частично соединяется с топологией путем создания подписок между узлом A и узлом D. Таким образом, изменения продолжают происходить на узле A, узле B и узле C. Изменения на узле D могут начаться только после создания подписок между узлом A и узлом D. Изменения на узле B и узле C реплицируются на узел D через узел A.

  • Второй этап состоит из шагов 6 — 9. На нем узел D полностью соединяется с топологией путем создания подписок между узлом B и узлом D, а также между узлом C и узлом D. На этом этапе необходимо заморозить систему.

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

Добавление к топологии узла SQL Server 2005

  1. Настройте узел D в качестве издателя и свяжите его с локальным или удаленным распространителем.

  2. Восстановите резервную копию с узла А на узле Г.

  3. Выполните процедуру sp_addpublication на узле Г. Задайте имя публикации в параметре @publication значение true в параметре @enabled_for_p2p, значение active в параметре @status и значение true в параметре @allow_initialize_from_backup. Чтобы добавить статьи в публикацию, выполните процедуру sp_addarticle.

  4. Выполните процедуру sp_addsubscription на узле Г. Задайте имя публикации в параметре @publication, имя узла А в параметре @subscriber, имя целевой базы данных на узле А в параметре @destination_db и значение replication support only в параметре @sync_type.

  5. Выполните процедуру sp_addsubscription на узле А. Задайте имя публикации в параметре @publication, имя узла Г в параметре @subscriber, имя целевой базы данных на узле Г в параметре @destination_db, значение initialize with backup в параметре @sync_type, а также соответствующие значения в параметрах @backupdevicetype и @backupdevicename.

  6. Заморозьте топологию, выполнив следующие шаги:

    1. Остановите все действия со всеми опубликованными таблицами одноранговой топологии.

    2. Выполните хранимую процедуру sp_requestpeerresponse в базе данных на Сервере A, Сервере B, Сервере C и Сервере D и получите выходной параметр @request_id.

    3. По умолчанию агент распространителя работает непрерывно, поэтому маркеры отправляются на все узлы автоматически. Если агент распространителя не выполняется в непрерывном режиме, запустите его. Дополнительные сведения см. в разделе Основные понятия об исполняемых объектах агента репликации или Как запустить и остановить агент репликации (среда SQL Server Management Studio).

    4. Выполните хранимую процедуру sp_helppeerresponses, указав значение @request_id, полученное на шаге 2. Подождите, пока все узлы сообщат о получении однорангового запроса.

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

  7. Выполните процедуру sp_addsubscription на узле Г. Задайте имя публикации в параметре @publication, имя узла Б в параметре @subscriber, имя целевой базы данных на узле Б в параметре @destination_db и значение replication support only в параметре @sync_type.

  8. Выполните процедуру sp_addsubscription на узле Г. Задайте имя публикации в параметре @publication, имя узла В в параметре @subscriber, имя целевой базы данных на узле В в параметре @destination_db и значение replication support only в параметре @sync_type.

  9. Выполните процедуру sp_addsubscription на узле Б. Задайте имя публикации в параметре @publication, имя узла Г в параметре @subscriber, имя целевой базы данных на узле Г в параметре @destination_db и значение replication support only в параметре @sync_type.

  10. Выполните процедуру sp_addsubscription на узле В. Задайте имя публикации в параметре @publication, имя узла Г в параметре @subscriber, имя целевой базы данных на узле Г в параметре @destination_db и значение replication support only в параметре @sync_type.