Обнаружение конфликтов в одноранговой репликации
Одноранговая репликация транзакций дает возможность вставлять, обновлять и удалять данные в любом узле топологии и передавать изменения в данных на другие узлы. Данные можно изменять в любом узле, поэтому изменения, вносимые на различных узлах, могут конфликтовать друг с другом. Если строка изменяется на нескольких узлах, это может вызвать конфликт или даже потерю обновления, когда эта строка передается на другие узлы.
Одноранговая репликация в SQL Server 2008 предоставляет возможность включить обнаружение конфликтов во всей одноранговой топологии. Этот режим помогает избежать проблемы, которые вызываются необнаруженными конфликтами, в том числе недопустимым поведением приложения и потерянными обновлениями. При включенном режиме обнаружения конфликтов конфликтующее изменение по умолчанию рассматривается как критическая ошибка, вызывающая сбой агента распространителя. В случае конфликта топология остается в несогласованном состоянии, пока конфликт не будет разрешен, а данные согласованы во всей топологии.
Примечание |
---|
Чтобы избежать возможной несогласованности данных, убедитесь, что в одноранговой топологии отсутствуют конфликты, даже при включенном обнаружении конфликтов. Чтобы операции записи выполнялись только на одном узле, приложения, получающие доступ к данным и изменяющие их, должны секционировать операции вставки, обновления и удаления. Такое секционирование обеспечивает тот факт, что изменения конкретной строки на одном узле синхронизируются с остальными узлами в топологии, прежде чем эта строка будет изменена другим узлом. Если приложению требуется усложненное обнаружение конфликтов, используйте репликацию слиянием. Дополнительные сведения см. в разделах Обзор репликации слиянием и Обнаружение и разрешение конфликтов репликации слиянием. |
Основные сведения о конфликтах и обнаружении конфликтов
В одной базе данных изменения, вносимые в одну строку различными приложениями, не создают конфликта. Это происходит потому, что транзакции сериализуются, а для обработки параллельных изменений используются блокировки. В асинхронной распределенной системе, какой является одноранговая репликация, транзакции воздействуют на каждый узел независимо друг от друга, при этом механизм сериализации транзакций по нескольким узлам отсутствует. Здесь можно использовать протокол, такой как двухфазная фиксация, но это приводит к существенному снижению производительности.
В таких системах, как одноранговая репликация, конфликты не обнаруживаются, если изменения фиксируются на отдельных узлах. Но они обнаруживаются в случаях, когда эти изменения реплицируются и применяются на других узлах. При выполнении одноранговой репликации конфликты обнаруживаются с помощью хранимых процедур, которые применяют изменения к каждому узлу в соответствии с содержимым скрытого столбца в каждой опубликованной таблице. В этом скрытом столбце хранится идентификатор, сочетающий в себе идентификатор инициатора, указываемый пользователем для каждого узла, и версию строки. В ходе синхронизации агент распределителя выполняет процедуры для каждой таблицы. Эти процедуры выполняют операции вставки, обновления и удаления с других узлов. Если одна из этих процедур обнаруживает конфликт при считывании значения скрытого столбца, она фиксирует ошибку 22815 со степенью серьезности 16.
Конфликт типа '%s' был обнаружен на узле %d между узлом %d (входящий), идентификатор транзакции %s, и узлом %d (на диске), идентификатор транзакции %s.
По умолчанию при возникновении этой ошибки агент распространителя прекращает применение изменений к данному узлу. Сведения об обработке выявленных конфликтов см. ниже в разделе «Обработка конфликтов».
Примечание |
---|
Работать со скрытым столбцом может только пользователь, вошедший в систему через выделенное административное соединение. Дополнительные сведения о выделенных административных соединениях см. в разделе Использование выделенного административного соединения. |
При выполнении одноранговой репликации обнаруживаются следующие типы конфликтов.
Вставка-вставка
Все строки во всех таблицах, участвующих в одноранговой репликации, уникальным образом идентифицируются с помощью значений первичного ключа. Конфликт «вставка-вставка» имеет место тогда, когда вставка строки с одним и тем же значением ключа осуществляется более чем на одном узле.
Обновление-обновление
Происходит, когда одна и та же строка обновляется более чем на одном узле.
Вставка-обновление
Происходит, когда строка обновляется на одном узле, а на другом та же строка удаляется и затем вновь вставляется.
Вставка-удаление
Происходит, если строка удаляется на одном узле, а на другом та же строка удаляется и затем вновь вставляется.
Обновление-удаление
Происходит, когда строка обновляется на одном узле, а на другом та же строка удаляется.
Удаление-удаление
Происходит, когда строка удаляется более чем на одном узле.
Активизация функции обнаружения конфликтов
Чтобы использовать разрешение конфликтов, на всех узлах должен выполняться SQL Server 2008 или более поздняя версия, кроме того, для всех узлов необходимо разрешить обнаружение конфликтов. В SQL Server 2008 и более поздних версий по умолчанию средства обнаружения конфликтов активизированы в SQL Server Management Studio. Мы рекомендуем включать функцию обнаружения конфликтов — даже в тех случаях, когда возникновение конфликтов не ожидается. Средства обнаружения конфликтов могут быть включены и отключены с помощью среды Management Studio или хранимых процедур на языке Transact-SQL.
Включение и отключение средств обнаружения в Management Studio осуществляется либо на странице Параметры подписки диалогового окна Свойства публикации, либо на странице Настройка топологии мастера настройки одноранговой топологии. Дополнительные сведения см. в разделе Как настроить обнаружение конфликтов в одноранговой репликации транзакций (среда SQL Server Management Studio).
Если настройка режима обнаружения конфликтов осуществляется с помощью среды Management Studio, агент распределителя прекращает применение изменений при обнаружении конфликта.
Кроме того, режим обнаружения можно включать и отключать с помощью следующих хранимых процедур: sp_addpublication или sp_configure_peerconflictdetection. Дополнительные сведения см. в разделе Как настроить обнаружение конфликтов в одноранговой репликации транзакций (программирование репликации на языке Transact-SQL).
В случае настройки режима обнаружения конфликтов с помощью хранимых процедур пользователь может указать, должен ли агент распространителя прекратить применение изменений при обнаружении конфликта. По умолчанию агент прекращает применение изменений. Рекомендуется использовать настройки по умолчанию.
Обработка конфликтов
Когда в ходе одноранговой репликации имеет место конфликт, формируется предупреждение об обнаружении конфликтов в одноранговой репликации. Рекомендуется настраивать это предупреждение таким образом, чтобы оповещение происходило при возникновении конфликта. Дополнительные сведения о предупреждениях см. в разделе Применение предупреждений по событиям агента репликации.
По прекращении действий агента распространителя и после направления предупреждения обрабатывайте происшедший конфликт в соответствии с одним из следующих подходов.
Выполните повторную инициализацию узла, на котором был обнаружен конфликт, с резервной копии узла, содержащей необходимые данные (рекомендуемый подход). Этот метод гарантирует сохранение данных в согласованном состоянии. Дополнительные сведения см. в процедуре добавления узла в топологию в разделе Как настроить одноранговую репликацию транзакций (программирование репликации на языке Transact-SQL).
Попытайтесь вновь синхронизировать узел, дав возможность агенту распространителя продолжить применение изменений.
Выполните хранимую процедуру sp_changepublication: укажите в качестве параметра @property значение p2p_continue_onconflict, а в качестве параметра @value — значение true.
Перезапустите агент распространителя.
Проверьте обнаруженные конфликты с помощью средства просмотра конфликтов и определите вовлеченные в конфликты строки, тип конфликта, а также выигравшую сторону. Конфликт разрешается в соответствии со значением идентификатора инициатора, указанным пользователем во время настройки. Победителем в конфликте становится строка, инициированная на узле с самым высоким значением идентификатора. Дополнительные сведения см. в разделе Как просмотреть конфликты данных для публикаций транзакций (среда SQL Server Management Studio).
Выполните проверку и убедитесь в том, что конвергенция конфликтующих строк завершилась верно. Дополнительные сведения см. в разделе Проверка реплицированных данных.
Примечание Если по выполнении этого шага несогласованность данных сохраняется, необходимо вручную обновить строки узла с самым высоким приоритетом, а затем разрешить распространение изменений с этого узла. Если в топологии более нет конфликтующих изменений, все узлы будут приведены в согласованное состояние.
Выполните хранимую процедуру sp_changepublication: укажите в качестве параметра @property значение p2p_continue_onconflict, а в качестве параметра @value — значение false.