피어 투 피어 - 피어 간 복제에서 충돌 검색

적용 대상:SQL Server

피어 투 피어 트랜잭션 복제본(replica)tion을 사용하면 토폴로지의 모든 노드에서 데이터를 삽입, 업데이트 또는 삭제하고 데이터 변경 내용을 다른 노드로 전파할 수 있습니다. 모든 노드에서 데이터를 변경할 수 있으므로 각 노드에서의 변경이 서로 충돌할 수 있습니다. 행이 둘 이상의 노드에서 수정되면 행이 다른 노드로 전파될 때 충돌 또는 업데이트 손실이 발생할 수 있습니다.

피어 투 피어 복제본(replica)tion은 피어 투 피어 토폴로지에서 충돌 검색을 사용하도록 설정하는 옵션을 제공합니다. 이 옵션을 사용하면 일관되지 않은 애플리케이션 동작 및 업데이트 손실을 포함하여 검색되지 않은 충돌로 인해 발생하는 문제를 방지할 수 있습니다. 이 옵션을 사용하도록 설정하면 기본적으로 충돌하는 변경 내용이 배포 에이전트 오류를 일으키는 심각한 오류로 처리됩니다. 충돌이 발생할 경우 토폴로지는 충돌이 해결되고 토폴로지 전체에서 데이터가 일관될 때까지 일관성 없는 상태로 다시 기본.

참고 항목

잠재적인 데이터 불일치를 방지하려면 충돌 검색이 설정된 경우에도 피어 투 피어 토폴로지에서 충돌을 방지해야 합니다. 특정 행에 대한 쓰기 작업이 하나의 노드에서만 수행되도록 하려면 데이터에 액세스하고 변경하는 애플리케이션은 삽입, 업데이트 및 삭제 작업을 분할해야 합니다. 이렇게 분할하면 행이 다른 노드에서 수정되기 전에 한 노드에서 발생하는 지정된 행에 대한 수정이 토폴로지의 다른 모든 노드와 동기화됩니다. 애플리케이션에 정교한 충돌 감지 및 해결 기능이 필요한 경우 병합 복제본(replica) 사용하세요. 자세한 내용은 병합 복제 및 병합 복제 충돌 검색 및 해결을 참조하세요.

충돌 및 충돌 검색 이해

단일 데이터베이스에서 다른 애플리케이션에서 동일한 행을 변경해도 충돌이 발생하지 않습니다. 트랜잭션이 직렬화되고 잠금이 동시 변경 내용을 처리하기 때문입니다. 피어 투 피어 복제와 같은 비동기 분산형 시스템에서는 트랜잭션이 각 노드에서 독립적으로 활동하며 여러 노드 간에 트랜잭션을 직렬화하는 메커니즘이 없습니다. 2단계 커밋과 같은 프로토콜을 사용할 수 있지만 이 경우 성능이 크게 저하됩니다.

피어 투 피어 복제본(replica)와 같은 시스템에서는 개별 피어에서 변경 내용이 커밋될 때 충돌이 감지되지 않습니다. 대신 해당 변경 내용이 복제본(replica)ted 및 다른 피어에서 적용될 때 검색됩니다. 피어 투 피어 복제본(replica) 각 게시된 테이블의 숨겨진 열을 기반으로 각 노드에 변경 내용을 적용하는 저장 프로시저에서 충돌이 감지됩니다.

SQL Server 2019(15.x) CU 13 이전에는 SQL Server가 게시된 각 테이블에 $sys_p2p_cd_id숨겨진 열을 하나씩 추가합니다. 이 숨겨진 열은 각 노드 및 행의 버전에 대해 지정하는 시작자 ID를 결합 하는 ID 를 저장합니다.

SQL Server 2019(15.x) CU 13 이상에서 피어 투 피어 게시를 @p2p_conflictdetection_policy = 'lastwriter' 만든 경우 SQL Server는 게시된 각 테이블에 $sys_md_cd_id숨겨진 열을 추가합니다. 이 숨겨진 열은 날짜/시간을 데이터 형식으로 datetime2 저장합니다.

동기화하는 동안 배포 에이전트 각 테이블에 대한 프로시저를 실행합니다. 이러한 프로시저는 다른 피어의 삽입, 업데이트 및 삭제 작업을 적용합니다. 숨겨진 열 값 또는 값을 읽을 때 충돌을 검색하면 프로시저는 다음과 같은 심각도 수준 16의 오류 22815를 일으킵니다.

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

기본적으로 이 오류가 발생하면 배포 에이전트는 노드에 변경 내용을 적용하는 작업을 중지합니다. 검색된 충돌을 처리하는 방법은 충돌 처리를 참조하세요.

참고 항목

숨겨진 열에는 DAC(관리자 전용 연결)를 통해 로그인한 사용자만 액세스할 수 있습니다. DAC에 대한 자세한 내용은 Database 관리istrators에 대한 진단 커넥트ion을 참조하세요.

피어 투 피어 복제본(replica) 다음 유형의 충돌을 검색합니다.

  • Insert-insert

    피어 투 피어 복제본(replica) 참여하는 각 테이블의 모든 행은 기본 키 값을 사용하여 고유하게 식별됩니다. 키 값이 같은 행이 둘 이상의 노드에 삽입된 경우 삽입 삽입 충돌이 발생합니다.

  • 업데이트-업데이트

    둘 이상의 노드에서 동일한 행이 업데이트되었을 때 발생합니다.

  • Insert-update

    한 노드에서 행이 업데이트되었지만 동일한 행이 삭제된 다음 다른 노드에 다시 삽입된 경우에 발생합니다.

  • Insert-delete

    한 노드에서 행이 삭제되었지만 동일한 행이 삭제된 다음 다른 노드에 다시 삽입된 경우에 발생합니다.

  • Update-delete

    하나의 노드에서 행이 업데이트되었지만 다른 노드에서 동일한 행이 삭제된 경우 발생합니다.

  • 삭제-삭제

    둘 이상의 노드에서 행이 삭제되었을 때 발생합니다.

충돌 검색 사용

충돌 검색을 사용하려면 모든 노드에 대해 검색을 활성화합니다. 기본적으로 SQL Server Management Studio에서 피어 투 피어 복제본(replica)tion을 구성할 때 충돌 검색이 사용됩니다. 충돌이 발생하지 않는 시나리오에서도 검색을 사용하도록 설정하는 것이 좋습니다. Management Studio 또는 Transact-SQL 저장 프로시저를 사용하여 충돌 검색을 사용하도록 설정하고 사용하지 않도록 설정할 수 있습니다.

  • 게시 속성 대화 상자의 구독 옵션 페이지 또는 피어 투 피어 토폴로지 구성 마법사의 토폴로지 구성 페이지를 사용하여 Management Studio에서 검색을 사용하거나 사용하지 않도록 설정할 수 있습니다.

    Management Studio를 사용하여 충돌 검색을 구성하는 경우 충돌이 감지될 때 변경 내용 적용을 중지하도록 배포 에이전트 구성됩니다.

  • 다음 저장 프로시저를 사용하여 검색을 사용하거나 사용하지 않도록 설정할 수도 있습니다.

    • sp_addpublication

    • sp_configure_peerconflictdetection.

      저장 프로시저를 사용하여 충돌 검색을 구성하는 경우 충돌이 감지될 때 배포 에이전트 변경 내용 적용을 중지할지 여부를 지정할 수 있습니다. 에이전트는 기본적으로 변경 내용 적용을 중지합니다. 기본 설정을 사용하는 것이 좋습니다.

충돌 처리

피어 투 피어 복제본(replica) 충돌이 발생하면 피어 투 피어 충돌 검색 경고가 발생합니다. 충돌이 발생할 때 알림을 받도록 이 경고를 구성합니다. 경고에 대한 자세한 내용은 복제 에이전트 이벤트에 대한 경고 사용을 참조하세요.

배포 에이전트가 중단되고 경고가 발생된 후 다음 방법 중 하나를 사용하여 발생한 충돌을 처리하세요.

  • 필요한 데이터를 포함하는 노드의 백업에서 충돌이 감지된 노드를 다시 초기화합니다(권장되는 방법). 이 메서드는 데이터가 일관된 상태인지 확인합니다.

  • 배포 에이전트 변경 내용을 계속 적용할 수 있도록 하여 노드를 다시 동기화해 봅니다.

    1. sp_changepublication 실행: 매개 변수에 'p2p_continue_onconflict'을 @property 지정하고 매개 변수에 대해 true를 @value 지정합니다.

    2. 배포 에이전트 다시 시작합니다.

    3. 충돌 뷰어를 사용하여 검색된 충돌을 확인하고 관련된 행, 충돌 유형 및 승자를 확인합니다. 충돌은 구성 중에 지정한 생성자 ID 값에 따라 해결됩니다. ID가 가장 높은 노드에서 시작된 행이 충돌에서 승리합니다. 자세한 내용은 트랜잭션 게시에 대한 데이터 충돌 보기(SQL Server Management Studio)를 참조하세요.

    4. 유효성 검사를 실행하여 충돌하는 행이 올바르게 수렴되었는지 확인합니다. 자세한 내용은 복제된 데이터의 유효성 검사를 참조하세요.

      참고 항목

      이 단계 이후 데이터가 일치하지 않는 경우 우선 순위가 가장 높은 노드의 행을 수동으로 업데이트한 다음 변경 내용이 이 노드에서 전파되도록 해야 합니다. 토폴로지에서 더 이상 충돌하는 변경 내용이 없으면 모든 노드가 일관된 상태로 바뀝니다.

    5. @property 매개 변수에 'p2p_continue_onconflict', @value 매개 변수에 false를 지정하여 sp_changepublication을 실행합니다.

마지막 쓰기 우선과 충돌 자동 처리

SQL Server 2019(15.x) CU 13부터는 가장 최근의 삽입 또는 업데이트가 충돌을 해결하도록 허용하여 충돌을 자동으로 해결하도록 피어 투 피어 복제본(replica)tion을 구성할 수 있습니다. 쓰기 중 하나가 행을 삭제하면 SQL Server에서 삭제가 충돌을 이길 수 있습니다. 이 방법을 마지막 쓰기 우선이라고 합니다.

저장 프로시저를 사용하여 마지막 쓰기 우선을 구성합니다. 마지막 기록기 충돌 검색 및 해결 구성을 참조하세요. SQL Server Management Studio에서 마지막 쓰기 우선을 구성할 수 없습니다.

참고 항목

마지막 기록기 Wins를 사용하는 피어 투 피어 복제는 안정적인 결과를 위해 참여하는 노드의 시계가 동기화된 상태에 따라 달라집니다. 참여하는 서버의 시계가 너무 멀리 동기화되지 않으면 충돌 해결의 결과가 예기치 않거나 원치 않을 수 있습니다. 예를 들어 서버 A에 정확한 시계가 있지만 서버 B가 1주일 뒤인 경우 서버 A는 행을 업데이트할 마지막이 아니더라도 모든 충돌에서 승리하도록 선택됩니다. 결과 해결에 필요한 허용 오차 내에서 시계를 유지할 수 없는 경우 다른 충돌 해결 전략을 선택할 수 있습니다.

참고 항목

피어 투 피어 트랜잭션 복제