2014-02-12 3 views
1

Postgres 9.3 DB (마스터)의 미러 인 iOS SQLite db가 있습니다. 인보이스 발행 앱입니다.두 데이터베이스 소스를 동기화하는 알고리즘?

이 응용 프로그램에는 몇 가지 SQLite DB가 업데이트되어 결국 마스터 DB와 동기화됩니다 (몇 시간 후 가끔). 주요 액티비티는 송장 헤더 - 송장 행 - 지급 관계입니다. 송장 생성입니다. 가장 최근의 데이터가 가장 선호되는 데이터이며, 각 장치가 자체 송장 세트를 생성하기 때문에 충돌 해결에 신경 쓰지 않으며 두 클라이언트가 동일한 레코드를 동시에 편집하는 경우는 거의 없습니다.

나는 거의 효과가 있지만 가장자리의 경우 테스트하기가 어렵다. 또한이 문제는 이미 해결 된 것으로 판단됩니다. 또한, 나는 수십 명의 마스터들과 이야기하는 수백 명의 고객을 테스트 할 수있는 테스트 스위트를 만들고 싶다. 즉석에서 일하는 것이 좋은 생각이 아니다.

  1. 하면 GUID를하고 버전 필드 (자동 증가 (Autoinc), int)에 그 기록의 마지막 버전을 만듭니다

    https://gist.github.com/mamcx/8958295

    내 코드는 다음을 수행합니다

    내가 지금 가지고있는 것입니다 표. 각 변경 사항은 버전을 증가시킵니다. 삭제는 모두 논리적입니다. 이것은 두 개의 DB에 :

    INSERT INTO "문서"( "버전" "CHANGEDATE" 가 "isDeleted를" "ID"

    ) VALUES ('2014- 02-11 16 : 16 : 49.775791-05 ' '0 ' '0771bc29-ac5e-49a1-b5d7-3e4f7dccd03a '

    );

  2. 클라이언트의 각 테이블에 대한 버전을 저장하십시오. 클라이언트 버전이있는 테이블을 요청하면 서버는 레코드> 버전을 반환 한 다음 로컬 DB와 병합합니다.

  3. 변경 사항은 클라이언트에서 수행됩니다. 서버의 각 행에 대해 기록 된 마지막 버전과 함께 서버에 레코드를 보냅니다. 레코드를 업데이트하고 각각에 대한 버전을 반환하십시오.

그러나 서버에서 클라이언트보다 많은 행을 얻거나 두 개의 다른 장치가 프로세스의 마지막에 데이터를 교환 할 때 데이터가 동일하지 않은 경우가 있습니다. 프로세스는 사용자 개입없이 백그라운드에서 진행됩니다.

+0

여기 실제 _question_은 어디에 있습니까? –

+0

동기화하는 방법을 설명하는 알고리즘이있는 경우 – mamcx

답변

0

나는 테이블이이 버전 번호와 시간이 쿼리가를 검색하는 시간 사이에 갱신 된 경우가 종종 server.py

sql = table.select().where(table.c.version >= version) 

에 있기 때문에이 라인의 너무 많은 행을 얻고있는 것으로 의심 실행이 끝나면 둘 이상의 테이블 버전을 얻을 수 있습니다. 쿼리가 완료된 후 중복 된 데이터를 필터링하거나 이전 버전 이후의 버전을 반복 할 수 있도록 버전 번호별로 데이터를 정렬 할 수 있습니다 - 여러 테이블을 한 번 이상 동기화 하겠지만 이전 버전 이후의 최신 버전을 동기화하므로 문제가되지 않습니다.

데이터가 동일하지 않은 문제는 동기화가 원자 적이지 않은 결과 일 수 있습니다. 동기화 중에 소스가 업데이트되고 동기화가 완료되면 대상보다 새로운 데이터가있을 수 있습니다. 이는 server.py의 31 행에있는 여러 버전의 테이블을 반환하는 이전 문제의 부작용 일 수도 있습니다. 이전 버전의 테이블을 이후 버전으로 덮어 쓸 수도 있습니다.이 버전은 쿼리를 필터링하거나 정렬하여 방지 할 수 있습니다 결과.

소스에서 동기화되는 데이터 (또는 테이블 ID와 버전 만)를 기록하고 여러 버전의 표가있는 경우 최신 버전을 제외한 모든 데이터를 필터링합니다. 그러면 데이터가 동기화되지 않은 경우 동기화 후 목적지의 데이터와 일치하면 뭔가 잘못되었다는 것을 알게됩니다.

+0

글쎄, 나는 브로테우스 힘에 의해 디버깅 할 수는 있지만 문제는 이것에 대해 잘 정의 된 알고리즘이 있는지에 관한 것입니다. – mamcx