1

하나의 중앙 노드와 SymmetricDS를 사용하는 많은 클라이언트에 대해 다중 마스터 양방향 동기화를 구현하려고합니다. 클라이언트는 중앙 노드 (스타 토폴로지)와 만 통신합니다. 기본 키의 충돌을 처리하는 데 문제가 있습니다. 예를 들어, 데이터베이스의SymmetricDS - 충돌 해결

은 열 ID, 이름, 테이블 "사람"을 포함 ... 중앙 DB에서 나는 열이 :

  1. AAA
  2. BBB
  3. CCC

먼저 클라이언트는 초기로드를 연결하고 다운로드하므로 동일한 db를가집니다. 두 번째 클라이언트도 마찬가지입니다.

이제 첫 번째 및 두 번째 클라이언트는 로컬 db에 새 행을 만듭니다. 첫째

  1. AAA BBB
  2. CCC
  3. DDD

둘째

  1. AAA BBB
  2. ,
  3. CCC
  4. EEE

그들은 동기화를 시도하지만, 4 행의 충돌이있다. 이 갈등은 쉽게 SymmetricDS에서 검출 될 수 있지만, 지금은이 삽입 될 때까지 증가 키를 해결하고 그래서 될 것입니다 결과 ... 클라이언트로 다시 변경을 보낼 :

  • BBB

    1. AAA
    2. CCC
    3. DDD 모든 데이터베이스에
    4. EEE

    . 어떻게 할 수 있습니까? 고맙습니다.

  • 답변

    3

    다중 마스터 양방향 시나리오를 다룰 때 자동 증가 PK를 사용하는 것은 좋지 않습니다.

    표준 연습은 클라이언트 간의 충돌을 피하기 위해 PK 용 GUID를 만드는 것입니다.

    자세한 내용은 다음 사이트를 참조하십시오.

    Selecting an Appropriate Primary Key for a Distributed Environment

    +0

    나는 것을 알고,하지만 불행히도 나는 기존 프로젝트 (학교 프로젝트)에 일하고 내가 제한 동기화를 기존의 대체 동기화 메커니즘을 개발하려는 경우에만 작은 부분을하고있는 중이 야. 누군가는 'INSERT'에 대한 충돌이 중앙 노드가있는 별 모양의 네트워크에서 공통적 인 문제라고 생각할 수 있습니다. 따라서 SymmetricDS는이를 해결할 수있는 간단한 메커니즘을 구현할 것입니다. 아마도 IDatabaseWriterFilter (5.10.2) 또는 변환 데이터 (4.8)를 사용하여 수행 할 수 있습니다. 그러나 나는 어떻게 발견 할 수 없다. – user2275785

    +0

    어떤 데이터베이스를 사용하고 있습니까? 레코드를 삽입하고 자신의 PK를 지정할 수 있습니까? 어떤 종류의 데이터를 사용하고 있습니까? 동일한 pk로 얼마나 자주 레코드가 삽입됩니까? 경우에 따라 자동 증가 PK 범위를 나눌 수 있으며 각 클라이언트 노드를 다른 시작 위치로 시작할 수 있습니다. 데이터베이스에 따라, 이것은 노드가 증가하기 시작할 위치에 포함 된 PK 컬럼으로 레코드를 삽입하는 것만 큼 쉽습니다. –

    +0

    중앙 노드가 PostgreSQL을 사용하고 클라이언트가 Apache Derby를 사용 중입니다. 한 클라이언트가 사용할 수있는 범위를 결정하는 것은 불가능합니다 (클라이언트의 수는 알려지지 않았습니다). 이전 버전의 클라이언트에서는 동기화 부족 (외부 키가없는 INSERT 만)이 매우 제한적이었습니다. 충돌은 중앙 노드에 의해 결정된 새로운 ID로 ID를 "다시 매핑"하여 해결되었으며 새 ID는 "remote_id"열에 저장된 클라이언트로 다시 전송되었습니다. 나는 데이터베이스가 미래에 많은 양의 데이터를 포함하고 많은 충돌이 발생할 것이라고 생각한다 ... 사용자는 웹 애플리케이션을 사용하여 중앙 데이터베이스와 직접 작업 할 수도있다. – user2275785