문제

내 웹 앱은 SQL Server 2008에 대한 ADO.NET을 사용합니다. 데이터베이스는 기본 (게시자) 데이터베이스에 대해 발생하지만 기본 및 보조 (가입자) 데이터베이스에서로드 균형을 유지합니다. 우리는 SQL Server의 내장 트랜잭션 복제를 사용하여 2 차를 최신 상태로 유지합니다. 대부분의 경우, 몇 초의 대기 시간은 문제가되지 않습니다.

그러나 거래가 2 차 사이트에서 커밋 될 때까지 차단하고 싶은 경우가 있습니다. 몇 초 동안 차단하는 것은 괜찮지 만, 오래된 페이지를 사용자에게 반환하는 것은 아닙니다. Ado.net 또는 TSQL에는 복제가 완료 될 때까지 기다릴 수있는 방법이 있습니까? 또는 게시자로부터 보조 서버에 수동으로 연결하지 않고 트랜잭션의 복제 상태를 확인할 수 있습니다.

편집] 99.9%의 시간, 가입자의 데이터는 "충분히 신선합니다". 그러나 그것을 무효화하는 하나의 작업이 있습니다. 유효하지 않을 것이라는 오프 기회에 매번 게시자로부터 읽을 수 없습니다. 트랜잭션 복제 에서이 문제를 해결할 수 없다면 대체 아키텍처를 제안 할 수 있습니까?

도움이 되었습니까?

해결책

SQL Server에 대한 그러한 솔루션은 없지만 다른 환경에서 제가 작업하는 방법은 다음과 같습니다.

애플리케이션에서 세 개의 별도 연결 문자열을 사용하고 쿼리의 요구에 따라 올바른 연결 문자열을 선택하십시오.

  • 실시간 - 하나의 마스터 서버를 직접 가리 킵니다. 모든 쓰기는이 연결 문자열로 이동하며 가장 미션 크리티컬 한 독서 만 여기로 이동합니다.
  • 근거리 - 가입자의로드 밸런스 풀에서 점수. 여기에 글이 없으면 읽습니다. 대부분의 OLTP 읽기에 사용됩니다.
  • 보고 지연-현재 환경에서는 현재 동일한로드 균형 잡힌 가입자 풀을 가리킬 것이지만 도로 아래로 로그 배송과 같은 기술을 사용하여 8-24 시간 뒤에 서버 풀을 가질 수 있습니다. 이것들은 정말 잘 축소되지만 데이터는 훨씬 뒤쳐져 있습니다. 보고, 검색, 장기 역사 및 기타 비실한 시간 요구에 적합합니다.

처음부터 해당 3 개의 연결 문자열을 사용하도록 앱을 디자인하는 경우 특히 겪고있는 경우 스케일링이 훨씬 쉽습니다.

다른 팁

동기 거울 상황을 설명하고 있습니다. 복제는 정의상 귀하의 요구 사항을 지원할 수 없습니다. 복제 ~ 해야 하다 로그에서 읽고 로그에서 저지를 받고 유통 업체와 가입자에게 전달하기 전에 트랜잭션이 커밋 될 때까지 기다리십시오. 이는 정의에 의한 복제에 데이터가 동기화되지 않는 기회의 창이 있음을 의미합니다.

데이터의 저작권 사본을 읽어야하는 작업이 필요하다면, 고객의 해당 사본을 작성하고 해당 경우 게시자의 읽기를 읽도록해야합니다.

3 번의 거래에서 특정 트랜잭션이 가입자에게 배포되었는지 여부를 확인할 수는 있지만 디자인을 기반으로해서는 안됩니다. 트랜잭션 복제는 설계별로 대기 시간을 보장하지 않으므로 '완벽한 날'작동 모드에 의존 할 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top