2009-03-04 2 views
1

장애 조치 시나리오에서 두 개의 Microsoft SQL 2005 데이터베이스 설치가 있습니다. 응용 프로그램 연결 문자열에는 연결 문자열에 "장애 조치 파트너"가 지정되어 있습니다.데이터베이스 장애시 SqlClient.SqlException이 발생합니다.

현재 라이브 데이터베이스가 슬레이브 데이터베이스로 장애 조치 (failover)되면 사용자가 "원격 호스트에서 기존 연결을 강제로 닫았습니다"라는 메시지와 함께 SqlClient.SqlException을 얻을 수있는 작은 시간이 있습니다.

이것은 주로 데이터베이스가 장애 조치를 수행하는 속도 때문입니까, 아니면 이러한 오류를 방지하기 위해 수행 할 수있는 다른 작업입니까?

답변

2

당신이 맞습니다. 데이터베이스를 복구하는 데 걸리는 시간과 관련이 있습니다.

동기 미러링 장애 조치 타임 라인은 이런 식입니다 :

  1. 주 서버 A가 종료되고 모든 연결을 닫습니다. 이 시점에서 앞으로 서버 A에 연결하려고하는 클라이언트는 연결을 강제 종료합니다.
  2. 주 서버 A는 로그가 보조 서버 B와 완전히 동기화되는지 확인합니다.
  3. 서버 B의 SQL 서비스가 시작됩니다.
  4. 서버 B의 SQL 서비스가 연결 수락을 시작하고 그 시점에서 클라이언트가 다시 연결할 수 있습니다.

서버가 아무리 빠르면 연결이 폭탄이 될 때까지 (최소한 1 초) 짧은 기간이 있습니다. Steven Lowe가 말했듯이, 당신은 그 예외를 잡아서 기다렸다가 다시 시도해야합니다. 앱이 대규모 거래의 일부로 여러 검색어를 연속적으로 발행하면 거래가 실패 할 수 있다는 점을 염두에 두어야합니다.

0

이것은 응용 프로그램이 연결 풀에서 기존 연결을 사용하려고하기 때문에 발생합니다. 이 오류가 발생한 후에야 응용 프로그램 풀이 지워지고 새 연결은 장애 조치 상자를 사용합니다.

1

주의하십시오 '장애 조치 파트너'옵션은 몇 년 전에 사용할 수 없습니다 (또는 적어도 나는 그것을 알고 아니었다!) 그래서 다음과 같은 솔루션은 우리는 함정에 있었다

진부 할 수있다 연결-손실 예외 (몇 가지 다른 맛), 몇 초 기다렸다가 다시 시도하십시오. 이로 인해 대기 및 재시도 논리를 자동화하는 모든 데이터베이스 작업을위한 래퍼가 필요했습니다. 이는 많은 작업이 아니었고 매우 편리하다고 판명되었습니다. 노력은 오류 코드와 예외 유형을 검토하고 작업을 안전하게 재 시도 할 수 있는지 여부에 대한 의사 결정 테이블을 작성했습니다.

관련 문제