보조-주 복제본 읽기/쓰기 연결 리디렉션(Always On 가용성 그룹)

적용 대상: SQL Server 2019(15.x)

SQL Server 2019(15.x) CTP 2.0에는 Always On 가용성 그룹의 보조-주 복제본 읽기/쓰기 연결 리디렉션이 도입되었습니다. 읽기/쓰기 연결 리디렉션은 모든 운영 체제 플랫폼에서 사용할 수 있습니다. 연결 문자열에 지정된 대상 서버에 관계없이 클라이언트 애플리케이션 연결을 주 복제본에 연결할 수 있습니다.

예를 들어, 연결 문자열은 보조 복제본을 대상으로 지정할 수 있습니다. AG(가용성 그룹) 복제본(replica) 구성 및 연결 문자열 설정에 따라 연결이 자동으로 주 복제본에 리디렉션될 수 있습니다.

사용 사례

SQL Server 2019(15.x) 이전에는 장애 조치(Failover) 후에 다시 연결되도록 하기 위해 AG 수신기 및 해당 클러스터 리소스가 사용자 트래픽을 주 복제본으로 리디렉션합니다. SQL Server 2019(15.x)에서는 AG 수신기 기능을 계속 지원하고 수신기를 포함할 수 없는 시나리오를 위해 복제본 연결 리디렉션을 추가합니다. 예시:

  • SQL Server 가용성 그룹과 통합되는 클러스터 기술은 기능과 같은 수신기를 제공하지 않음
  • 구성이 복잡하고 오류가 발생하기 쉬우며 여러 구성 요소가 연관되어 문제를 해결하기 어려운 Pacemaker를 사용하는 클라우드 또는 다중 서브넷 부동 IP와 같은 다중 서브넷 구성
  • 수동 장애 조치(failover) 시 투명한 재연결을 보장하는 간단한 메커니즘이 없기 때문에 읽기 확장 또는 재해 복구 및 클러스터 유형이 NONE

요건

보조 복제본이 읽기/쓰기 연결 요청을 리디렉션하려면 다음이 충족되어야 합니다.

  • 보조 복제본이 온라인 상태여야 합니다.
  • 복제본 사양 PRIMARY_ROLE에는 READ_WRITE_ROUTING_URL이 포함되어야 합니다.
  • ApplicationIntentReadWrite로 정의하거나 ApplicationIntent를 설정하지 않고 기본값(ReadWrite)이 적용되도록 하여 연결 문자열이 ReadWrite가 되도록 해야 합니다.

READ_WRITE_ROUTING_URL 옵션 설정

읽기/쓰기 연결 리디렉션을 구성하려면 AG를 만들 때 주 복제본에 대해 READ_WRITE_ROUTING_URL을 설정합니다.

SQL Server 2019(15.x)에서는 READ_WRITE_ROUTING_URL<add_replica_option> 사양에 추가되었습니다. 다음 항목을 참조하십시오.

PRIMARY_ROLE(READ_WRITE_ROUTING_URL)가 설정되지 않음(기본값)

기본적으로 읽기/쓰기 복제본(replica) 연결 리디렉션은 복제본(replica)에 대해 설정되지 않습니다. 보조 복제본이 연결 요청을 처리하는 방법은 보조 복제본이 연결을 허용하도록 설정되었는지 여부와 연결 문자열의 ApplicationIntent 설정에 따라 달라집니다. 다음 표에서는 보조 복제본이 SECONDARY_ROLE (ALLOW CONNECTIONS = )ApplicationIntent에 따라 연결을 처리하는 방법을 보여 줍니다.

ApplicationIntent SECONDARY_ROLE (ALLOW CONNECTIONS = NO) SECONDARY_ROLE (ALLOW CONNECTIONS = READ_ONLY) SECONDARY_ROLE (ALLOW CONNECTIONS = ALL)
ApplicationIntent=ReadWrite
기본값
연결 실패 연결 실패 연결 성공
읽기 성공
쓰기 실패
ApplicationIntent=ReadOnly 연결 실패 연결 성공 연결 성공

위의 표에서는 SQL Server 2019(15.x) 이전 버전의 SQL Server와 동일한 기본 동작을 보여 줍니다.

PRIMARY_ROLE(READ_WRITE_ROUTING_URL)이 설정됨

읽기/쓰기 연결 리디렉션을 설정하면 복제본(replica)이 연결 요청을 처리하는 방식이 다르게 동작합니다. 연결 동작은 여전히 SECONDARY_ROLE (ALLOW CONNECTIONS = )ApplicationIntent 설정에 따라 달라집니다. 다음 표에서는 READ_WRITE_ROUTING이 설정되어 있는 보조 복제본이 SECONDARY_ROLE (ALLOW CONNECTIONS = )ApplicationIntent에 따라 연결을 처리하는 방법을 보여 줍니다.

ApplicationIntent SECONDARY_ROLE (ALLOW CONNECTIONS = NO) SECONDARY_ROLE (ALLOW CONNECTIONS = READ_ONLY) SECONDARY_ROLE (ALLOW CONNECTIONS = ALL)
ApplicationIntent=ReadWrite
기본값
연결 실패 연결 실패 연결이 주 복제본으로 라우팅됨
ApplicationIntent=ReadOnly 연결 실패 연결 성공 연결 성공

앞의 표에서는 주 복제본에 READ_WRITE_ROUTING_URL이 설정된 경우 SECONDARY_ROLE (ALLOW CONNECTIONS = ALL)이면 보조 복제본이 연결을 주 복제본으로 리디렉션하고 연결이 ReadWrite를 지정한다는 것을 보여 줍니다.

예시

이 예제에서 가용성 그룹에는 다음 3개의 복제본이 있습니다.

  • COMPUTER01의 주 복제본
  • COMPUTER02의 동기 보조 복제본
  • COMPUTER03의 동기 보조 복제본

다음 그림은 가용성 그룹을 나타냅니다.

Availability group with primary, secondary, and asynchronous secondary

다음 Transact-SQL 스크립트는 이 AG를 만듭니다. 이 예에서 각 복제본(replica)은 READ_WRITE_ROUTING_URL을 지정합니다.

CREATE AVAILABILITY GROUP MyAg   
     WITH ( CLUSTER_TYPE =  NONE )  
   FOR   
     DATABASE  [<Database1>]   
   REPLICA ON   
      'COMPUTER01' WITH   
         (  
         ENDPOINT_URL = 'TCP://COMPUTER01.<domain>.<tld>:5022',  
         AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,  
         FAILOVER_MODE = MANUAL,  
         SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL,   
            READ_ONLY_ROUTING_URL = 'TCP://COMPUTER01.<domain>.<tld>:1433' ),
         PRIMARY_ROLE (ALLOW_CONNECTIONS = READ_WRITE,   
            READ_ONLY_ROUTING_LIST = ('COMPUTER02', 'COMPUTER03'),
            READ_WRITE_ROUTING_URL = 'TCP://COMPUTER01.<domain>.<tld>:1433' ),   
         SESSION_TIMEOUT = 10  
         ),   
      'COMPUTER02' WITH   
         (  
         ENDPOINT_URL = 'TCP://COMPUTER02.<domain>.<tld>:5022',  
         AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,  
         FAILOVER_MODE = MANUAL, 
         SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL,   
            READ_ONLY_ROUTING_URL = 'TCP://COMPUTER02.<domain>.<tld>:1433' ),  
         PRIMARY_ROLE (ALLOW_CONNECTIONS = READ_WRITE,   
            READ_ONLY_ROUTING_LIST = ('COMPUTER01', 'COMPUTER03'),  
            READ_WRITE_ROUTING_URL = 'TCP://COMPUTER02.<domain>.<tld>:1433' ),
         SESSION_TIMEOUT = 10  
         ),   
      'COMPUTER03' WITH   
         (  
         ENDPOINT_URL = 'TCP://COMPUTER03.<domain>.<tld>:5022',  
         AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,  
         FAILOVER_MODE = MANUAL,  
         SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL,   
            READ_ONLY_ROUTING_URL = 'TCP://COMPUTER03.<domain>.<tld>:1433' ),  
         PRIMARY_ROLE (ALLOW_CONNECTIONS = READ_WRITE,   
            READ_ONLY_ROUTING_LIST = ('COMPUTER01', 'COMPUTER02'),  
            READ_WRITE_ROUTING_URL = 'TCP://COMPUTER03.<domain>.<tld>:1433' ),
         SESSION_TIMEOUT = 10  
         );
GO  
  • <domain>.<tld>
    • 정규화된 도메인 이름의 도메인 및 최상위 도메인. 예들 들어 corporation.com입니다.

연결 동작

다음 다이어그램에서 클라이언트 응용 프로그램은 ApplicationIntent=ReadWrite를 사용하여 COMPUTER02에 연결합니다. 주 복제본으로 연결이 리디렉션됩니다.

Connection to computer 2 is re-directed to the primary replica

보조 복제본이 읽기/쓰기 호출을 주 복제본으로 리디렉션합니다. 두 복제본(replica)에 대한 읽기 쓰기 연결은 주 복제본으로 리디렉션됩니다.

다음 다이어그램에서 주 복제본은 COMPUTER02로 수동으로 장애 조치(failover)되었습니다. 클라이언트 응용 프로그램은 ApplicationIntent=ReadWrite를 사용하여 COMPUTER01에 연결합니다. 주 복제본으로 연결이 리디렉션됩니다.

Connection redirected to new primary replica on computer2

참고 항목

Always On 가용성 그룹 개요(SQL Server)

가용성 복제본에 대한 클라이언트 연결 액세스 정보(SQL Server)

가용성 그룹 수신기, 클라이언트 연결 및 애플리케이션 장애 조치(failover)(SQL Server)