피어 투 피어 - 피어 투 피어 복제에서 충돌 검색
적용 대상: SQL Server
피어 투 피어 트랜잭션 복제를 사용하면 토폴로지의 모든 노드에서 데이터를 삽입, 업데이트 및 삭제하고 데이터 변경 내용을 다른 노드로 전파할 수 있습니다. 모든 노드에서 데이터를 변경할 수 있으므로 각 노드에서의 변경이 서로 충돌할 수 있습니다. 행이 둘 이상의 노드에서 수정되면 행이 다른 노드로 전파될 때 충돌 또는 업데이트 손실이 발생할 수 있습니다.
피어 투 피어 복제는 피어 투 피어 토폴로지에서 충돌 검색을 사용하도록 설정하는 옵션을 제공합니다. 이 옵션을 사용하면 일관되지 않은 애플리케이션 동작 및 업데이트 손실을 포함하여 검색되지 않은 충돌로 인해 발생하는 문제를 방지할 수 있습니다. 이 옵션을 사용하도록 설정하면 기본적으로 충돌하는 변경 내용이 배포 에이전트 오류를 일으키는 심각한 오류로 처리됩니다. 충돌이 발생하면 충돌이 해결되고 데이터가 토폴로지 전체에서 일관성을 가질 때까지 토폴로지가 일관성 없는 상태로 유지됩니다.
참고 항목
잠재적인 데이터 불일치를 방지하려면 충돌 검색이 설정된 경우에도 피어 투 피어 토폴로지에서 충돌을 방지해야 합니다. 특정 행에 대한 쓰기 작업이 하나의 노드에서만 수행되도록 하려면 데이터에 액세스하고 변경하는 애플리케이션은 삽입, 업데이트 및 삭제 작업을 분할해야 합니다. 이렇게 분할하면 행이 다른 노드에서 수정되기 전에 한 노드에서 발생하는 지정된 행에 대한 수정이 토폴로지의 다른 모든 노드와 동기화됩니다. 애플리케이션에 정교한 충돌 감지 및 해결 기능이 필요한 경우 병합 복제를 사용합니다. 자세한 내용은 병합 복제 및 병합 복제 충돌 감지 및 해결을 참조하세요.
충돌 및 충돌 검색 이해
단일 데이터베이스에서 다른 애플리케이션에서 동일한 행을 변경해도 충돌이 발생하지 않습니다. 트랜잭션이 직렬화되고 잠금이 동시 변경 내용을 처리하기 때문입니다. 피어 투 피어 복제와 같은 비동기 분산형 시스템에서는 트랜잭션이 각 노드에서 독립적으로 활동하며 여러 노드 간에 트랜잭션을 직렬화하는 메커니즘이 없습니다. 2단계 커밋과 같은 프로토콜을 사용할 수 있지만 이 경우 성능이 크게 저하됩니다.
피어 투 피어 복제와 같은 시스템에서는 개별 피어에서 변경 내용이 커밋될 때 충돌이 감지되지 않습니다. 대신 이러한 변경 내용이 복제되어 다른 피어에서 적용될 때 검색됩니다. 피어 투 피어 복제에서는 게시된 각 테이블의 하나 이상의 숨겨진 열을 기반으로 각 노드에 변경 내용을 적용하는 저장 프로시저에서 충돌이 감지됩니다.
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에 대한 자세한 내용은 데이터베이스 관리자를 위한 진단 연결을 참조하세요.
피어 투 피어 복제는 다음과 같은 유형의 충돌을 감지합니다.
Insert-insert
피어 투 피어 복제에 참여하는 각 테이블의 모든 행은 기본 키 값을 사용하여 고유하게 식별됩니다. 키 값이 같은 행이 둘 이상의 노드에 삽입된 경우 insert-insert 충돌이 발생합니다.
업데이트-업데이트
둘 이상의 노드에서 동일한 행이 업데이트되었을 때 발생합니다.
Insert-update
하나의 노드에서 행이 업데이트되었지만 동일한 행이 삭제되었다가 다른 하나의 노드에서 다시 삽입된 경우 발생합니다.
Insert-delete
하나의 노드에서 행이 삭제되었지만 동일한 행이 삭제되었다가 다른 하나의 노드에서 다시 삽입된 경우 발생합니다.
Update-delete
하나의 노드에서 행이 업데이트되었지만 다른 노드에서 동일한 행이 삭제된 경우 발생합니다.
Delete-Delete
둘 이상의 노드에서 행이 삭제되었을 때 발생합니다.
충돌 검색 사용
충돌 검색을 사용하려면 모든 노드에 대해 검색을 활성화합니다. 기본적으로 SQL Server Management Studio에서 피어 투 피어 복제를 구성할 때 충돌 검색을 사용합니다. 충돌이 발생하지 않는 시나리오에서도 검색을 사용하도록 설정하는 것이 좋습니다. 충돌 검색은 Management Studio 또는 Transact-SQL 저장 프로시저를 통해 사용하거나 사용하지 않도록 설정할 수 있습니다.
게시 속성 대화 상자의 구독 옵션 페이지 또는 피어 투 피어 토폴로지 구성 마법사의 토폴로지 구성 페이지를 사용하여 Management Studio에서 검색을 사용하거나 사용하지 않도록 설정할 수 있습니다.
Management Studio를 사용하여 충돌 검색을 구성하면 충돌이 검색된 경우 변경 내용 적용을 중지하도록 배포 에이전트가 구성됩니다.
다음 저장 프로시저를 사용하여 검색을 사용하거나 사용하지 않도록 설정할 수도 있습니다.
sp_configure_peerconflictdetection
저장 프로시저를 사용하여 충돌 검색을 구성하면 충돌이 검색된 경우 변경 내용 적용을 중지하도록 배포 에이전트가 구성됩니다. 에이전트는 기본적으로 변경 내용 적용을 중지합니다. 기본 설정을 사용하는 것이 좋습니다.
충돌 처리
피어 투 피어 복제에서 충돌이 발생하면 피어 투 피어 충돌 검색 경고가 발생합니다. 충돌이 발생할 때 알림을 받도록 이 경고를 구성합니다. 경고에 대한 자세한 내용은 복제 에이전트 이벤트에 대한 경고 사용을 참조하세요.
배포 에이전트가 중단되고 경고가 발생된 후 다음 방법 중 하나를 사용하여 발생한 충돌을 처리하세요.
필요한 데이터를 포함하는 노드의 백업에서 충돌이 감지된 노드를 다시 초기화합니다(권장되는 방법). 이렇게 하면 데이터와 인덱스가 일관된 상태를 유지합니다.
배포 에이전트 변경 내용을 계속 적용할 수 있도록 하여 노드를 다시 동기화해 봅니다.
@property 매개 변수에 'p2p_continue_onconflict', @value 매개 변수에 true를 지정하여 sp_changepublication을 실행합니다.
배포 에이전트를 중지하고 다시 시작하세요.
충돌 뷰어를 사용하여 검색된 충돌을 확인하고 관련된 행, 충돌 유형 및 승자를 확인합니다. 충돌은 구성 중에 지정한 생성자 ID 값에 따라 해결됩니다. ID가 가장 높은 노드에서 시작된 행이 충돌에서 승리합니다. 자세한 내용은 트랜잭션 게시의 데이터 충돌 확인(SQL Server Management Studio)를 참조하세요.
유효성 검사를 실행하여 충돌하는 행이 올바르게 수렴되었는지 확인합니다. 자세한 내용은 복제된 데이터의 유효성 검사를 참조하세요.
참고 항목
이 단계 이후 데이터가 일치하지 않는 경우 우선 순위가 가장 높은 노드의 행을 수동으로 업데이트한 다음 변경 내용이 이 노드에서 전파되도록 해야 합니다. 토폴로지에서 더 이상 충돌하는 변경 내용이 없으면 모든 노드가 일관된 상태로 바뀝니다.
@property 매개 변수에 'p2p_continue_onconflict', @value 매개 변수에 false를 지정하여 sp_changepublication을 실행합니다.
자세한 내용은 마지막 쓰기 성공 시 충돌 자동 처리를 참조하세요.
SQL Server 2019 (15.x) CU 13부터 가장 최근의 삽입 또는 업데이트가 충돌에 우선하도록 허용하여 충돌을 자동으로 해결하도록 피어 투 피어 복제를 구성할 수 있습니다. 쓰기 중 하나가 행을 삭제하면 SQL Server에서 삭제가 충돌을 이길 수 있습니다. 이 방법을 마지막 쓰기 우선이라고 합니다.
저장 프로시저를 사용하여 마지막 쓰기 우선을 구성합니다. 마지막 기록기 충돌 검색 및 해결 구성을 참조하세요. SQL Server Management Studio에서 마지막 쓰기 우선을 구성할 수 없습니다.
참고 항목
마지막 기록기 Wins를 사용하는 피어 투 피어 복제는 안정적인 결과를 위해 참여하는 노드의 시계가 동기화된 상태에 따라 달라집니다. 참여하는 서버의 시계가 너무 멀리 동기화되지 않으면 충돌 해결의 결과가 예기치 않거나 원치 않을 수 있습니다. 예를 들어 서버 A에 정확한 시계가 있지만 서버 B가 일주일 뒤인 경우 서버 A는 행을 업데이트할 마지막이 아니더라도 모든 충돌에서 승리하도록 선택됩니다. 결과 해결에 필요한 허용 오차 내에서 시계를 유지할 수 없는 경우 다른 충돌 해결 전략을 선택할 수 있습니다.