피어 투 피어 - 피어 투 피어 복제에서 충돌 검색Peer-to-Peer - Conflict Detection in Peer-to-Peer Replication

이 항목 적용 대상: 예SQL Server없습니다Azure SQL 데이터베이스없습니다Azure SQL 데이터 웨어하우스 없습니다 병렬 데이터 웨어하우스THIS TOPIC APPLIES TO: yesSQL ServernoAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse 피어 투 피어 트랜잭션 복제를 사용하면 토폴로지의 모든 노드에서 데이터를 삽입, 업데이트 및 삭제하고 데이터 변경 내용을 다른 노드로 전파할 수 있습니다. Peer-to-peer transactional replication lets you insert, update, or delete data at any node in a topology and have data changes propagated to the other nodes. 모든 노드에서 데이터를 변경할 수 있으므로 각 노드에서의 변경이 서로 충돌할 수 있습니다.Because you can change data at any node, data changes at different nodes could conflict with each other. 두 개 이상의 노드에서 행이 수정되면 이 행이 다른 노드에 전파될 때 충돌이 발생하거나 업데이트가 손실될 수 있습니다.If a row is modified at more than one node, it can cause a conflict or even a lost update when the row is propagated to other nodes.

SQL Server 2008SQL Server 2008 이상 버전의 피어 투 피어 복제에서는 피어 투 피어 토폴로지에서 충돌을 검색할 수 있는 옵션을 제공합니다.Peer-to-peer replication in SQL Server 2008SQL Server 2008 and later versions provides the option to enable conflict detection across a peer-to-peer topology. 이 옵션을 사용하면 일관성 없는 응용 프로그램 동작, 업데이트 손실과 같은 검색되지 않는 충돌로 인해 발생하는 문제를 방지할 수 있습니다.This option would help prevent the issues that are caused by undetected conflicts, including inconsistent application behavior and lost updates. 이 옵션을 설정하면 기본적으로 충돌을 일으키는 변경이 배포 에이전트 오류를 유발하는 치명적 오류로 취급됩니다.With this option enabled, by default a conflicting change is treated as a critical error that causes the failure of the Distribution Agent. 충돌이 발생할 경우 충돌이 해결되고 데이터가 토폴로지 전체에서 일관성을 가질 때까지 토폴로지가 일관성 없는 상태로 유지됩니다.In the event of a conflict, the topology remains in an inconsistent state until the conflict is resolved and the data is made consistent across the topology.

참고

데이터 불일치의 가능성을 배제하려면 충돌 검색이 설정되어 있는 경우라도 피어 투 피어 토폴로지에서 충돌이 발생하지 않도록 해야 합니다.To avoid potential data inconsistency, make sure that you avoid conflicts in a peer-to-peer topology, even with conflict detection enabled. 특정 행에 대한 쓰기 작업이 하나의 노드에서만 수행되도록 하려면 데이터에 액세스하여 변경하는 응용 프로그램에서 삽입, 업데이트 및 삭제 작업을 분할해야 합니다.To ensure that write operations for a particular row are performed at only one node, applications that access and change data must partition insert, update, and delete operations. 이렇게 분할하면 한 노드에서 발생한 지정된 행에 대한 수정이 다른 노드에서 해당 행을 수정하기 전에 토폴로지의 모든 노드와 동기화됩니다.This partitioning ensures that modifications to a given row that is originating at one node are synchronized with all other nodes in the topology before the row is modified by a different node. 응용 프로그램에 정교한 충돌 검색 및 해결 기능이 필요한 경우 병합 복제를 사용하세요.If an application requires sophisticated conflict detection and resolution capabilities, use merge replication. 자세한 내용은 병합 복제병합 복제 충돌 감지 및 해결을 참조하세요.For more information, see Merge Replication and Detect and Resolve Merge Replication Conflicts.

충돌 및 충돌 검색 이해Understanding Conflicts and Conflict Detection

단일 데이터베이스에서는 서로 다른 응용 프로그램에 의해 수행된 동일한 행에 대한 변경이 충돌을 일으키지 않습니다.In a single database, changes that are made to the same row by different applications do not cause a conflict. 트랜잭션이 직렬화되고, 동시 변경 처리를 위해 잠금이 사용되기 때문입니다.This is because transactions are serialized, and locks are used to handle concurrent changes. 피어 투 피어 복제와 같은 비동기 분산형 시스템에서는 트랜잭션이 각 노드에서 독립적으로 활동하며 여러 노드 간에 트랜잭션을 직렬화하는 메커니즘이 없습니다.In an asynchronous distributed system such as peer-to-peer replication, transactions act independently on each node; and there is no mechanism to serialize transactions across multiple nodes. 2단계 커밋과 같은 프로토콜을 사용할 수 있지만 이 경우 성능이 크게 저하됩니다.A protocol like two-phase commit could be used, but this affects performance significantly.

피어 투 피어 복제와 같은 시스템에서는 개별 피어에서 변경 내용이 커밋될 때 충돌이 검색되지 않습니다.In systems such as peer-to-peer replication, conflicts are not detected when changes are committed at individual peers. 대신 이러한 변경 내용이 복제되어 다른 피어에 적용될 때 충돌이 검색됩니다.Instead, they are detected when those changes are replicated and applied at other peers. 피어 투 피어 복제에서 충돌은 각 게시된 테이블의 숨겨진 열을 기반으로 각 노드에 변경 내용을 저장하는 저장 프로시저에 의해 검색됩니다.In peer-to-peer replication, conflicts are detected by the stored procedures that apply changes to each node, based on a hidden column in each published table. 이 숨겨진 열은 각 노드에 대해 지정되는 송신자 ID 와 행의 버전을 결합하는 ID를 저장합니다.This hidden column stores an ID that combines an originator ID that you specify for each node and the version of the row. 동기화 중에 배포 에이전트는 각 테이블에 대해 프로시저를 실행합니다.During synchronization, the Distribution Agent executes procedures for each table. 이러한 프로시저는 다른 피어의 삽입, 업데이트 및 삭제 작업을 적용합니다.These procedures apply insert, update, and delete operations from other peers. 숨겨진 열 값을 읽을 때 충돌을 검색하면 프로시저는 다음과 같은 심각도 수준 16의 오류 22815를 일으킵니다.If one of the procedures detects a conflict when it reads the hidden column value, it raises error 22815 that has a severity level of 16:

A conflict of type '%s' was detected at peer %d between peer %d (incoming), transaction id %s and peer %d (on disk), transaction id %s

기본적으로 이 오류가 발생하면 배포 에이전트는 노드에 변경 내용을 적용하는 작업을 중지합니다.By default, this error causes the Distribution Agent to stop applying changes to that node. 검색된 충돌을 처리하는 방법은 이 항목의 뒷부분에 나오는 "충돌 처리"를 참조하세요.For information about how to handle the conflicts that are detected, see "Handling Conflicts" later in this topic.

참고

숨겨진 열에는 DAC(관리자 전용 연결)를 통해 로그인한 사용자만 액세스할 수 있습니다.The hidden column can be accessed only by a user that is logged in through the Dedicated Administrator Connection (DAC). DAC에 대한 자세한 내용은 데이터베이스 관리자를 위한 진단 연결을 참조하세요.For information about DAC, see Diagnostic Connection for Database Administrators.

피어 투 피어 복제는 다음과 같은 충돌 유형을 검색합니다.Peer-to-peer replication detects the following types of conflicts:

  • 삽입-삽입Insert-insert

    피어 투 피어 복제에 참여하는 각 테이블의 모든 행은 기본 키 값을 사용하여 고유하게 식별됩니다.All rows in each table participating in peer-to-peer replication are uniquely identified by using primary key values. 삽입-삽입 충돌은 동일한 키 값을 가진 행이 둘 이상의 노드에 삽입될 때 발생합니다.An insert-insert conflict occurs when a row with the same key value was inserted at more than one node.

  • 업데이트-업데이트Update-update

    동일한 행이 둘 이상의 노드에서 업데이트될 때 발생합니다.Occurs when the same row was updated at more than one node.

  • 삽입-업데이트Insert-update

    하나의 노드에서 행이 업데이트되었지만 다른 노드에서 동일한 행이 삭제된 후 다시 삽입되는 경우 발생합니다.Occurs if a row was updated at one node, but the same row was deleted and then reinserted at another node.

  • 삽입-삭제Insert-delete

    하나의 노드에서 행이 삭제되었지만 다른 노드에서 동일한 행이 삭제된 후 다시 삽입된 경우 발생합니다.Occurs if a row was deleted at one node, but the same row was deleted and then reinserted at another node.

  • 업데이트-삭제Update-delete

    하나의 노드에서 행이 업데이트되었지만 다른 노드에서 동일한 행이 삭제된 경우 발생합니다.Occurs if a row was updated at one node, but the same row was deleted at another node.

  • 삭제-삭제Delete-delete

    둘 이상의 노드에서 행이 삭제된 경우 발생합니다.Occurs when a row was deleted at more than one node.

충돌 검색 사용Enabling Conflict Detection

충돌 검색을 사용하려면 모든 노드에서 SQL Server 2008SQL Server 2008 이상 버전이 실행되어야 하고 모든 노드에 대해 충돌 검색을 사용하도록 설정되어 있어야 합니다.To use conflict detection, all nodes must be running SQL Server 2008SQL Server 2008 or a later version; and detection must be enabled for all nodes. SQL Server 2008SQL Server 2008 이상 버전에서는 SQL Server Management StudioSQL Server Management Studio에서 충돌 검색이 기본적으로 사용되도록 설정됩니다.In SQL Server 2008SQL Server 2008 and later versions, by default, conflict detection is enabled in SQL Server Management StudioSQL Server Management Studio. 충돌 발생 가능성이 낮은 경우라도 충돌 검색을 사용하도록 설정하는 것이 좋습니다.We recommend that you have detection enabled, even in scenarios in which you do not expect any conflicts. 충돌 검색은 Management StudioManagement Studio 또는 Transact-SQLTransact-SQL 저장 프로시저를 사용하여 사용하거나 사용하지 않도록 설정할 수 있습니다.Conflict detection can be enabled and disabled by using Management StudioManagement Studio or Transact-SQLTransact-SQL stored procedures:

  • Management StudioManagement Studio 게시 속성 대화 상자의 구독 옵션 페이지를 사용하거나 피어 투 피어 토폴로지 구성 마법사의 토폴로지 구성 페이지를 사용하여 에서 충돌 검색을 사용하거나 사용하지 않도록 설정할 수 있습니다.You can enable and disable detection in Management StudioManagement Studio either by using the Subscription Options page of the Publication Properties dialog box or the Configure Topology page of the Configure Peer-to-Peer Topology Wizard. 자세한 내용은 Conflict Detection in Peer-to-Peer Replication을 참조하세요.For more information, see Conflict Detection in Peer-to-Peer Replication.

    Management StudioManagement Studio를 사용하여 충돌 검색을 구성하면 충돌이 검색된 경우 변경 내용 적용을 중지하도록 배포 에이전트가 구성됩니다.If you configure conflict detection by using Management StudioManagement Studio, the Distribution Agent is configured to stop applying changes when a conflict is detected.

  • 또한 sp_addpublication 또는 sp_configure_peerconflictdetection저장 프로시저를 이용하여 검색 활성화 및 비활성화도 실행할 수 있습니다.You can also enable and disable detection by using the following stored procedures: sp_addpublication or sp_configure_peerconflictdetection.

    저장 프로시저를 사용하여 충돌 검색을 구성하면 충돌이 검색된 경우 배포 에이전트가 변경 내용 적용을 중지할지 여부를 지정할 수 있습니다.If you configure conflict detection by using stored procedures, you can specify whether the Distribution Agent should stop applying changes when a conflict is detected. 에이전트는 기본적으로 변경 내용 적용을 중지합니다.The default is for the agent to stop. 기본 설정을 사용하는 것이 좋습니다.We recommend that you use the default setting.

충돌 처리Handling Conflicts

피어 투 피어 복제에서 충돌이 일어나면 피어 투 피어 충돌 검색 경고가 발생됩니다.When a conflict occurs in peer-to-peer replication, the Peer-to-peer conflict detection alert is raised. 충돌이 발생할 때 알 수 있도록 이 경고를 구성하는 것이 좋습니다.We recommend that you configure this alert so that you are notified when a conflict occurs. 경고에 대한 자세한 내용은 복제 에이전트 이벤트에 대한 경고 사용을 참조하세요.For more information about alerts, see Use Alerts for Replication Agent Events.

배포 에이전트가 중단되고 경고가 발생된 후 다음 방법 중 하나를 사용하여 발생한 충돌을 처리하세요.After the Distribution Agent stops and the alert is raised, use one of the following approaches to handle the conflicts that occurred:

  • 충돌이 검색된 노드를 필요한 데이터가 포함된 노드의 백업에서 다시 초기화합니다(권장되는 방법).Reinitialize the node where the conflict was detected from the backup of a node that contains the required data (the recommended approach). 이 방법을 사용하면 데이터 상태의 일관성을 확보할 수 있습니다.This method ensures that data is in a consistent state.

  • 배포 에이전트에서 변경 내용 적용을 계속하도록 하여 노드를 다시 동기화합니다.Try to synchronize the node again by enabling the Distribution Agent to continue to apply changes:

    1. @property 매개 변수에 'p2p_continue_onconflict', @value 매개 변수에 true를 지정하여 sp_changepublication을 실행합니다.Execute sp_changepublication: specify 'p2p_continue_onconflict' for the @property parameter and true for the @value parameter.

    2. 배포 에이전트를 시작합니다.Restart the Distribution Agent.

    3. 충돌 뷰어를 사용하여 충돌이 검색되었는지 확인하고 충돌에 관련된 행, 충돌의 유형 및 충돌 시 우선 적용 사항을 확인합니다.Verify the conflicts that were detected by using the conflict viewer and determine the rows that were involved, the type of conflict, and the winner. 충돌은 구성 중에 지정된 송신자 ID 값을 기반으로 해결됩니다. 가장 높은 ID의 노드를 출처로 하는 행이 충돌에서 우선 적용됩니다.The conflict is resolved based on the originator ID value that you specified during configuration: the row that originated at the node with the highest ID wins the conflict. 자세한 내용은 트랜잭션 게시의 데이터 충돌 확인(SQL Server Management Studio)을 참조하세요.For more information, see View Data Conflicts for Transactional Publications (SQL Server Management Studio).

    4. 유효성 검사를 실행하여 충돌 행이 올바르게 일치되었는지 확인합니다.Run validation to ensure that the conflicting rows converged correctly. 자세한 내용은 복제된 데이터의 유효성 검사를 참조하세요.For more information, see Validate Replicated Data.

      참고

      이 단계를 수행한 이후에도 데이터에 일관성이 없는 경우에는 우선 순위가 가장 높은 노드의 행을 수동으로 업데이트한 후 이 노드에서 변경 내용이 전파되도록 해야 합니다.If data is inconsistent after this step, you must manually update rows on the node that has the highest priority, and then let the changes propagate from this node. 토폴로지에 더 이상 충돌하는 변경 내용이 없으면 모든 노드가 일관적인 상태가 됩니다.If there are no further conflicting changes in the topology, all nodes will be brought to a consistent state.

    5. @property 매개 변수에 'p2p_continue_onconflict', @value 매개 변수에 false를 지정하여 sp_changepublication을 실행합니다.Execute sp_changepublication: specify 'p2p_continue_onconflict' for the @property parameter and false for the @value parameter.

참고 항목See Also

@loopback_detectionPeer-to-Peer Transactional Replication