2010-06-08 2 views
4

표준 트랜잭션 복제로 업데이트 된 두 개의 마스터 데이터베이스와 두 개의 읽기 전용 복사본이 있습니다. 읽기 전용 데이터베이스의 일부 엔티티를 매핑하는 데 필요합니다. A 데이터베이스에는 주문이 있고 B 데이터베이스에는 라인이 들어 있습니다.SQL Server 데이터베이스의 복제 프로세스를 두 개 (또는 n 개) 동기화하는 방법은 무엇입니까?

Replication http://i46.tinypic.com/1tacsx.png

문제는 하나의 데이터베이스에 복제가 두 번째 데이터베이스의 복제 뒤쳐 수 있으며, 매핑 R-데이터베이스의 순간에 일치하지 않는 데이터를해야합니다. 예를 들어.

우리는 19:00와 19:03에 줄이있는 2 개의 주문을 저장했습니다. 매핑 프로세스는 19:05에서 시작되었지만 매핑 순간까지 시작됨 데이터베이스 복제는 19:03까지 모든 변경 사항을 처리했지만 B 데이터베이스 복제 처리는 19:00까지만 변경됩니다. 매핑이 끝나면 19시 3 분부터 주문하고 19시 방향으로 주문한 주문 엔티티를 갖게됩니다. 문제는 보장됩니다 :)

두 데이터베이스 모두 임시 모델을 가지고 있으므로 모든 시간 조각에 대해 데이터를 가져올 수 있지만 문제는 최신 복제 시간을 확인하는 것입니다.

질문 : 위에서 설명한 상황을 피하기 위해 여러 데이터베이스의 복제 프로세스를 동기화하는 방법은 무엇입니까? 또는 다른 말로하면, 각 데이터베이스의 마지막 복제 시간을 비교하는 방법은 무엇입니까?

UPD :

내가 동기화 볼 수있는 유일한 방법은 지속적으로 각 데이터베이스에 서비스 테이블에 타임 스탬프를 작성하고 복제 된 서버에서 이러한 타임 스탬프를 확인하는 것입니다. 수용 가능한 해결책인가?

+0

귀하의 의견을 아래에 적어 두 DB에 신선한 datetime을 정기적으로 삽입하고 공유 DB에 복제하고 그 날짜 이전에 데이터를 가져 오는 것만으로도 갈 것입니다. 당신이 당신의 질문에 답한 것처럼 보입니다. –

답변

1

주어진 작업이 주어진 제약 조건에서 해결 될 수없는 것처럼 보입니다. 정확하게 이해했다면, 데이터베이스와 행의 스키마의 수는 상수입니다.

그래서

, 왼쪽 변수 :

  • 추가 "주사"를 데이터베이스에
  • 임시 트릭을
  • 는 트릭을 트리거
  • 시간에하지 복제 변화의 "늦은 바인딩"

현재 하나의 아이디어 만 찾았습니다. 작동하는 것으로 보입니다.

시간과 라인, 표시 last_line_time에 달할 때까지
  1. 는 "주문"레코드의 타임 스탬프 (last_line_time) 복제에서
  2. 을 수정 기다릴, "선"테이블에 트리거를 추가합니다.
    • 맥스 (lines.line_time)이> 주문보다 order.last_line_time 구식이면
    • 라인보다 최대 (lines.line_time) < order.last_line_time 쓸모 경우
    • 경우 최대 (lines.line_time) == 모든 것보다 order.last_line_time이 라인은 지속적으로 수정이 경우는, 무한 루프에 실패 할 수 있고, 라인 테이블 복제는 항상 뒤에 지연, :) 지금,

OK입니다하지만.

+0

이 접근 방식은 데이터베이스와 응용 프로그램 측면에서 상당한 개발이 필요합니다. 그러나 문제를 해결합니다. –

1

수 없습니다. 유일한 해결책은 단 하나의 마스터를 갖는 것입니다. 에 복제가 없어도 문제가있는 경우 응용 프로그램을 다른 데이터베이스로 분할해서는 안됩니다.. A 및 B 모두을 일관된 상태로 복원 할 수 없습니다. 데이터베이스는 복구 단위이며 별도의 엔티티로 분리해서는 안됩니다.

가장 좋은 방법은 드로잉 보드로 돌아가서 모든 응용 프로그램과 같이 하나의 데이터베이스에만 상태를 유지하는 응용 프로그램을 재 설계하는 것입니다. 이 작업을 수행 할 수 없다면 복제본의 일관성을 포기해야합니다.

+0

나는 많은 문제가 있음을 알고 있지만, 불행하게도 이미 약 10 년 생방송이고 주위에 응용 프로그램을 개발하는 개발자가 약 1000 명이므로 시스템을 재 설계 할 수 없습니다. –

+0

물리적 (테이블) 대신 논리적 복제 (작업)를 수행 할 수있는 경우가 있습니다. 예 : 마스터에서는 트랜잭션이 A에 송장 헤더를, B에 송장 상세 정보를 작성합니다. 두 개의 인서트를 복제하는 대신 주어진 헤더 및 세부 사항이있는 인보이스 작성 작업을 하나의 단일 작업으로 복제합니다. 복제는 저장 프로 시저를 통해 작업이 수행되는 경우이를 수행 할 수 있습니다. 즉, 효과와 달리 * 호출을 복제 할 수 있습니다. 다른 해결책은 SSB 메시지를 발송하는 것입니다. 그러나 구현 및 유지 관리가 매우 어렵습니다. –

+0

다시 말하면 내가 영향을 미칠 수없는 것들에 대해 이야기하고 있습니다. 이미 마스터와 복제 데이터베이스에 많은 수의 응용 프로그램을 작성하고 있습니다.이 응용 프로그램을 읽어야합니다. 내가 할 수있는 유일한 방법은 일종의 동기화 메커니즘을 주입하는 것이다. SSB 메시지는 어떻게 도움이 될 수 있습니까? 데이터가 마스터 상태이고 SSM 메시지가 전송되었지만 복제본에서 데이터를 사용할 수없는 상황이 여전히 있습니다. –

0

데이터베이스 A에서 적절한 상태의 테이블을 조인하는 뷰를 생성하지 마십시오 & 데이터베이스 B는 데이터를 동기화 한 다음 복제합니다. 나는 당신이 일관된 데이터를 가질 것이라고 생각합니다.

+0

좋은 지적. 그러나 소스 데이터베이스의 복제는 많은 양의 데이터를 가져 오는 동안 막대한로드를 피하기위한 것입니다. 그것은 당신의 경우 db A와 db b가 여전히 부하를 받고 있습니다. (나는 이것이 내 결정이 아니라는 것을 강조하고 싶다. 그러나 이것은 내가 참아 내야 만한다.) –

+0

어쩌면 당신은 상대적으로 db A와 db B의 부하를 줄일 수있는 "인덱싱 된"뷰로 갈 수있다. – Baaju

관련 문제