2010-08-19 4 views
0

약간의 문제가 있습니다. 이야기는 다음과 같습니다 :클라이언트에서 마스터로 mysql 테이블 데이터를 동기화하십시오.

나는 여러 클라이언트 (현재 23)에서 실행되는 문서 보관 시스템 (PHP로 작성)을 가지고 있습니다. 그들의 시스템에는 문서 만 있습니다. 매일 밤 사이트의 마스터 데이터베이스 (중앙 서버)에 '동기화'해야합니다. 중앙 서버에서 각 MySQL 데이터베이스에 액세스 할 수 있으므로 연결하는 데 아무런 문제가 없습니다.

클라이언트 데이터베이스에 연결하고 동기화 열이 '0000-00-00 00:00:00'(기본값은 동기화되지 않았 음을 나타냄) 인 테이블에서 모든 항목을 선택합니다. 그런 다음 각 레코드를 반복하여 중앙 서버에 삽입하고 클라이언트 데이터베이스 레코드의 동기화 시간을 스크립트가 실행 된 시간으로 설정합니다. 이 작동하지만, 분명히 여러 쿼리와 큰 오버 헤드가 있으며 지금 막 문제를 발견했습니다.

각 클라이언트는 하루에 최대 2000 - 3000 개의 홀수 문서를 생성 할 수 있습니다. 이 큰 번호로 너무 오래 걸립니다 (1 초/2 문서).

내 문제는 더 나은 해결책이 있습니까? 모든 것이 성공했는지 확인하기 위해 로그를 수행해야하는 PHP 스크립트 솔루션이 바람직합니다.

감사

편집 : 나의 현재 프로세스는 다음과 같습니다

  1. 트랜잭션 시작하는 모든 않은 동기화 된 데이터
  2. 를 선택
  3. 중앙 데이터베이스 서버에
  4. 삽입 기록
  5. 선택 클라이언트의 문서 기록
  6. 이 중앙 서버에서 실행되는 스크립트입니다

트랜잭션을 커밋 서버에 클라이언트에서 중앙 데이터베이스 서버

  • 업데이트 동기화 열에
  • 업데이트 동기화 열을 문서를 넣습니다. 이제 생각해 보니 7 단계를 제거하고 5 단계에 포함시킬 수 있지만 처리 시간을 많이 줄일 수는 없습니다.

  • 답변

    1

    모든 서버에서 모든 ID를 고유하게 유지하려면 auto_increment_increment을 사용하는 것이 좋습니다. 그런 다음 수행해야 할 작업은 SELECT * FROM blah WHERE sync = '0000-00-00 00:00:00'입니다. 그런 다음 insert 문을 생성하고 실행합니다. 충돌하는 기본 키에 대해 모든 종류의 충돌 해결을 처리 할 필요가 없습니다.

    긴 쿼리 시간은 데이터 크기를 확인해야합니다. 각 레코드가 꽤 큰 경우 (몇백 kb +), 시간이 걸릴 것입니다 ...

    하나의 옵션은 각 하위 서버의 테이블에 대해 federated 테이블을 만드는 것일 수 있습니다. 그런 다음 마스터에서 SQL로 전체 작업을 수행하십시오. INSERT INTO master_table SELECT * FROM child_1_table WHERE sync = '0000-00-00 00:00:00' ... 모든 데이터를 PHP로 가져 오지 않도록하십시오. 여전히 모든 것이 잘되었는지 확인하기 위해 몇 가지 검사를 수행 할 수 있으며, PHP 토지에서 모든 것이 여전히 실행되기 때문에 계속 로그 할 수 있습니다 ...

    +0

    ID는 문제가되지 않습니다. 동기화 할 필요가 없습니다. 다른 여러 열을 통해 올바른 레코드를 얻습니다. 필자는 ID를 사용하여 docarch_printout (문서에 관한 모든 세부 사항) 테이블을 docarch_printout_docs 테이블 (1 - 1 문서 만 포함)에 연결합니다. 다른 문제는 우리가 클라이언트에 영구적으로 연결되어 있지 않다는 것입니다. 일부는 온 디맨드 ISDN 회선입니다. 필자는 연합 테이블이 작동하지 않을 것이라고 생각합니다. 좋은 생각 이군요, MySQL에는 그 옵션이 있다는 것을 전혀 몰랐습니다. – Skippy

    +0

    글쎄, 당신이 프로그램에 페더레이션 테이블에 대한 SQL을 만들 수 있다고 가정합니다. 그런 다음 클라이언트에 연결할 때 작성 스크립트를 실행하십시오. 일단 끝나면 놓습니다. (따라서 사용자가 적극적으로 동기화 할 때만 연결을 사용합니다.) – ircmaxell

    +0

    True. 나는 그 아이디어를 정말 좋아한다. Everythng 멋지지만, 2 테이블 (1-1 관계) ID 필드에 의해 참조되는 동기화해야합니다. 하나는 세부 정보이고 다른 하나는 실제 문서입니다. 그것은 단지 하나의 테이블이었습니다. 그것에 대한 더 이상의 생각은 없습니까? 감사. – Skippy

    0

    기본 방법은 정상적으로 들리지만 한 작업을 수행하는 데 0.5 초가 걸리므로 과도하게 과도합니다. - 네트워크를 통해 얼마나 많은 데이터를 가져오고 있습니까? 전체 이미지?수술 중 다른 일을하고 있습니까? 동기화 열에 색인이 있습니까?

    당신은 데이터베이스에서 해제 동기화 된 데이터의 내보내기를 수행하여 작은 이익을 얻을 수있는이 3 스크립트를 필요로

    1) mark all records available for sync with a transaction id in a new column 
    2) extract all records flagged in first step into a flat file 
    3) copy the file across the network 
    4) load the data into the master DB 
    5) if successful notify the origin server 
    6) origin server then sets the sync time for all records flagged with that transaction id 
    

    - 준비하고 데이터를 전송 (원본 서버에 2 일을 하나는 완료로 표시) 및 복제 된 서버에서 하나는 데이터를 폴링하고 결과를 통지합니다.

    는 그러나 이것은 아마 당신이 이미지 (아닌 이미지 자체)에 대한 메타 데이터를 복제 을 경우 터무니없이 높은 것 같다 성능에 큰 교두보를 만들려고하지 않습니다.

    C.는

    +0

    내 논리를 볼 수 있도록 스크립트를 단계별로 실행하여 steb을 사용하여 초기 게시물을 업데이트했습니다. – Skippy

    +0

    이것은 여전히 ​​레코드 당 0.5 초가 걸리는 이유를 설명하지 않습니다. 트랜잭션은 2 개의 독립적 인 DBMS를 스팬 할 수 없으므로 여기에 값을 추가하지 마십시오. 기록은 얼마나 큽니까? – symcbean

    +0

    그것은 클라이언트가 ADSL (ISDN을 통해 몇 가지)에 의해 우리에게 연결되어 있기 때문입니다. 기록 문서는 수 킬로바이트에 지나지 않습니다. – Skippy

    0

    난 당신이 PHP 기반의 솔루션을 선호 알고 있지만, 당신은 마이크로 소프트 싱크 프레임 워크를 체크 아웃 할 수 있습니다 -

    http://msdn.microsoft.com/en-in/sync/default(en-us).aspx

    이 작성 될 동기화 모듈을 필요로합니다. net이지만 동기화 로직 및 예외 처리 (네트워크 장애, 동기화 충돌 등)면에서 큰 이점이 있으므로 시간이 절약됩니다.

    프레임 워크는 .net 용 데이터베이스 커넥터가있는 한 non-sql 서버 데이터베이스도 처리합니다. 다만 다음의 링크에서 샘플을 채취 - - MySQL은 아주 쉽게 지원한다

    http://code.msdn.microsoft.com/sync/Release/ProjectReleases.aspx?ReleaseId=4835

    와 MySQL에 동일하게 적용.

    +0

    그게 좋겠지 만 CentOS에서 돌아 가야한다. 우리는 마이크로 소프트 서버를 가지고 있지 않다. – Skippy

    +0

    흠 .. 정말로 문제가있다. 실제로는이 목적을 위해 실제로 하나를 실행하는 것이 싸다. 우리는 실제로 이것에 많은 개발 노력을 기울여 비용/이익 분석을하고 결정할 수있었습니다. –

    0

    Theres는 당신이 동기화 프레임 워크를 사용하지 못할 경우 또 다른 가능성 - 당신이 하루 종일 부하를 분산하는 대신 하루의 끝의,

    그것이 가능을? 10 개의 새 문서가 들어 오거나 10 개의 편집 작업이 완료 될 때마다 동기화가 시작됩니다. (동기화가 클라이언트 측에서 시작된 경우이 작업을 수행 할 수 있습니다).

    동기화 논리를 서버 측으로 가져 가려는 경우 클라이언트가 동기화해야 할 때마다 메시징 큐를 사용하여 클라이언트에서 서버로 알림을 보내도록 고려할 수 있습니다. 그런 다음 서버가 데이터를 가져올 수 있습니다. 사내 서비스 버스 또는 azure appfabric/Amazon SQS와 같은 주문형 플랫폼을 사용할 수 있습니다.

    +0

    보관 처리 된 문서는 해당 날짜의 다른 응용 프로그램에서 생성됩니다. 문서 보관 시스템은 디렉토리에서 새 파일을 모니터링하고 처리합니다. 이로 인해 가져 오기가 일괄 적으로 수행됩니다. ISDN 회선을 사용하는 클라이언트가 다른 용도로 우리에게 연결될 때 연결하기 위해 동기화를 끝내야합니다. – Skippy

    +0

    좋아 .. 이미 답변을 얻었으니 .. 환호! –

    관련 문제