고가용성 및 재해 복구에 대한 SqlClient 지원

이 문서에서는 SQL Server 2012 이상에서 Always On AG(가용성 그룹) 및 Always On FCI(장애 조치(failover) 클러스터 인스턴스) 등 Always On 기능을 사용하는 고가용성 재해 복구를 위한 SqlClient 지원(.NET Framework 4.5에 추가됨)을 설명합니다.

이제 연결 속성에서 가용성 그룹 수신기 또는 FCI 이름을 지정할 수 있습니다. SqlClient 애플리케이션이 장애 조치되는 데이터베이스에 연결되면 원래 연결이 끊어지고 애플리케이션이 장애 조치 후 작업을 계속할 수 있도록 새 연결을 열어야 합니다.

AG 또는 FCI에에 연결하지 않는 경우와 여러 IP 주소가 하나의 호스트 이름에 연결되어 있는 경우에는 SqlClient가 DNS 항목과 연결된 모든 IP 주소를 순차적으로 반복합니다. DNS 서버가 반환한 첫 번째 IP 주소가 NIC(네트워크 인터페이스 카드)에 바인딩되지 않은 경우 시간이 오래 걸릴 수 있습니다. FCI 또는 가용성 그룹의 수신기에 연결하는 경우 SqlClient는 모든 IP 주소에 대한 연결을 병렬로 설정하려고 시도합니다. 연결 시도에 성공하면 드라이버가 모든 보류 중인 연결 시도를 삭제합니다.

참고

연결 제한 시간을 늘리고 연결 재시도 논리를 구현하면 애플리케이션이 가용성 그룹에 연결될 가능성이 증가합니다. 또한 장애 조치(failover)로 인해 연결이 실패할 수 있으므로 실패한 연결을 다시 연결할 때까지 다시 시도하는 연결 재시도 논리를 구현해야 합니다.

.NET Framework 4.5에서 SqlClient에 다음 연결 속성이 추가되었습니다.

  • ApplicationIntent

  • MultiSubnetFailover

다음과 같은 방법으로 프로그래밍 방식으로 이러한 연결 문자열 키워드를 수정할 수 있습니다.

참고

.NET Framework 버전 4.6.1에서는 MultiSubnetFailovertrue로 설정할 필요가 없습니다. .NET Core 및 .NET 5 이상에서는 이 설정이 필요합니다.

MultiSubnetFailover로 연결

FCI 또는 AG의 수신기에 연결할 때 항상 MultiSubnetFailover=True를 합니다. MultiSubnetFailover를 사용하면 SQL Server 2012 이상의 모든 AG 및 FCI에 대한 장애 조치를 더 빠르게 수행할 수 있고 단일 및 다중 서브넷 Always On 토폴로지의 장애 조치 시간이 크게 감소합니다. 다중 서브넷 장애 조치(failover) 중에는 클라이언트가 병렬로 연결을 시도합니다. 서브넷 장애 조치 동안 클라이언트는 TCP 연결을 적극적으로 다시 시도합니다.

MultiSubnetFailover 연결 속성은 애플리케이션이 AG 또는 FCI를 사용하고 있으며 SqlClient가 모든 IP 주소에 대한 연결을 시도하여 주 SQL Server 인스턴스의 데이터베이스에 대한 연결을 시도할 것임을 나타냅니다. 연결에 대해 MultiSubnetFailover=True가 지정되면 클라이언트는 운영 체제의 기본 TCP 재전송 간격보다 빠르게 TCP 연결을 다시 시도합니다. 이렇게 하면 AG 또는 FCI를 장애 조치한 후 더 빠르게 다시 연결할 수 있으며 이 작업은 단일 및 다중 서브넷 AG 및 FCI 모두에 적용할 수 있습니다.

SqlClient의 연결 문자열 키워드에 대한 자세한 내용은 ConnectionString을 참조하세요.

AG 또는 FCI 이외의 다른 항목에 연결하는 경우 MultiSubnetFailover=True를 지정하면 성능에 부정적인 영향을 줄 수 있으므로 이 기능은 지원되지 않습니다.

다음 지침을 사용하여 Always On 기능 중 하나를 사용하여 서버에 연결합니다.

  • 단일 또는 다중 서브넷에 연결할 때 MultiSubnetFailover 연결 속성을 사용하십시오. 그러면 두 경우 모두 성능이 향상됩니다.

  • AG에 연결하려면 가용성 그룹의 수신기를 연결 문자열의 서버로 지정합니다.

  • IP 주소가 64개 이상으로 구성된 SQL Server 인스턴스에 연결하면 연결 오류가 발생합니다.

  • MultiSubnetFailover 연결 속성을 사용하는 애플리케이션 동작은 SQL Server 인증, Kerberos 인증, Windows 인증 등의 인증 유형에 영향을 받지 않습니다.

  • 장애 조치 시간을 수용하도록 Connect Timeout 값을 늘리고 애플리케이션 연결 재시도 횟수를 줄입니다.

  • 분산된 트랜잭션은 지원되지 않습니다.

읽기 전용 라우팅이 적용되지 않으면 다음과 같은 경우 보조 복제본 위치에 대한 연결이 실패합니다.

  • 보조 복제본 위치가 연결을 허용하도록 구성되어 있지 않은 경우

  • 애플리케이션에서 ApplicationIntent=ReadWrite(아래 설명 참조)를 사용하고 보조 복제본 위치가 읽기 전용 액세스용으로 구성되어 있는 경우

SqlDependency는 읽기 전용 보조 복제본에서 지원되지 않습니다.

주 복제본이 읽기 전용 작업을 거부하도록 구성되어 있고 연결 문자열에 ApplicationIntent=ReadOnly가 포함되어 있으면 연결이 실패합니다.

데이터베이스 미러링에서 다중 서브넷 클러스터를 사용하도록 업그레이드

연결 문자열에 MultiSubnetFailoverFailover Partner 연결 키워드가 있거나 MultiSubnetFailover=True와 TCP가 아닌 프로토콜이 사용되면 연결 오류(ArgumentException)가 발생합니다. MultiSubnetFailover가 사용되고 SQL Server에서 데이터베이스 미러링 쌍의 일부임을 나타내는 장애 조치(Failover) 파트너 응답을 반환하는 경우에도 오류(SqlException)가 발생합니다.

현재 데이터베이스 미러링을 사용 중인 SqlClient 애플리케이션을 다중 서브넷 시나리오로 업그레이드할 경우에는 Failover Partner 연결 속성을 제거하고 이를 MultiSubnetFailover로 설정된 True로 바꾸고, 연결 문자열에서 서버 이름을 가용성 그룹 수신기로 바꿔야 합니다. 연결 문자열에 Failover PartnerMultiSubnetFailover=True가 사용될 경우 드라이버에서 오류가 발생합니다. 하지만 연결 문자열에 Failover PartnerMultiSubnetFailover=False(또는 ApplicationIntent=ReadWrite)가 사용될 경우 애플리케이션에 데이터베이스 미러링이 사용됩니다.

AG의 기본 데이터베이스에서 데이터베이스 미러링이 사용되고 가용성 그룹 수신기 대신 주 데이터베이스에 연결하는 연결 문자열에 MultiSubnetFailover=True가 사용된 경우 드라이버에서 오류를 반환합니다.

애플리케이션 의도 지정

ApplicationIntent=ReadOnly인 경우 클라이언트는 AlwaysOn이 설정된 데이터베이스에 연결할 때 읽기 작업을 요청합니다. 서버는 연결 시 그리고 USE 데이터베이스 문 중에 AlwaysOn이 설정된 데이터베이스에 한하여 의도를 강제 적용합니다.

ApplicationIntent 키워드는 레거시 읽기 전용 데이터베이스에 적용되지 않습니다.

데이터베이스는 대상 AlwaysOn 데이터베이스에 대한 읽기 작업을 허용하거나 허용하지 않을 수 있습니다. (이 설정은 PRIMARY_ROLESECONDARY_ROLETransact-SQL 문의 ALLOW_CONNECTIONS 절로 수행됩니다.)

ApplicationIntent 키워드는 읽기 전용 라우팅을 설정하는 데 사용됩니다.

읽기 전용 라우팅

읽기 전용 라우팅은 데이터베이스의 읽기 전용 복사본의 가용성을 유지할 수 있는 기능입니다. 읽기 전용 라우팅을 활성화하려면:

  1. AlwaysOn 가용성 그룹의 가용성 그룹 수신기에 연결해야 합니다.

  2. ApplicationIntent 연결 문자열 키워드를 ReadOnly로 설정해야 합니다.

  3. 읽기 전용 라우팅을 설정하려면 데이터베이스 관리자가 가용성 그룹을 구성해야 합니다.

읽기 전용 라우팅을 사용하는 여러 연결 중 일부가 동일한 읽기 전용 복사본에 연결되지 않을 수 있습니다. 데이터베이스 동기화를 변경하거나 서버 라우팅 구성을 변경하면 클라이언트를 다른 읽기 전용 복사본에 연결할 수 있습니다. 모든 읽기 전용 요청을 동일한 읽기 전용 복제본에 연결하려면 가용성 그룹 수신기를 Data Source 연결 문자열 키워드에 전달하지 마십시오. 대신, 읽기 전용 인스턴스의 이름을 지정합니다.

읽기 전용 라우팅은 먼저 주 데이터베이스에 연결한 후 사용 가능한 최선의 읽기 가능한 보조 데이터베이스를 검색하기 때문에 주 데이터베이스에 연결할 때보다 시간이 더 많이 걸릴 수 있습니다. 따라서 로그인 제한 시간을 늘려야 합니다.

참고 항목