읽기 전용 복제본을 사용하여 읽기 전용 쿼리 워크로드의 오프로드

적용 대상:Azure SQL DatabaseAzure SQL Managed Instance

고가용성 아키텍처의 일부인 프리미엄 및 중요 비즈니스용 서비스 계층의 각 단일 데이터베이스, 탄력적 풀 데이터베이스는 주 읽기-쓰기 복제본과 하나 이상의 보조 읽기 전용 복제본으로 자동으로 프로비저닝됩니다. 보조 복제본은 주 복제본과 동일한 컴퓨팅 크기로 프로비저닝됩니다. 읽기 확장 기능을 사용하면 읽기 전용 복제본에서 실행하는 대신 읽기 전용 복제본 중 하나의 컴퓨팅 용량을 사용하여 읽기 전용 워크로드를 오프로드할 수 있습니다. 이러한 방식으로 일부 읽기 전용 워크로드는 읽기-쓰기 워크로드에서 격리될 수 있으며 성능은 그대로 유지됩니다. 이 기능은 분석과 같이 논리적으로 격리된 읽기 전용 워크로드를 포함한 애플리케이션을 위한 것입니다. 프리미엄 및 중요 비즈니스용 서비스 계층에서 애플리케이션은 추가 비용 없이 이 추가 용량을 사용하여 성능상의 이점을 얻을 수 있습니다.

또한 하나 이상의 보조 복제본이 추가되면 하이퍼스케일 서비스 계층에서 읽기 확장 기능을 사용할 수 있습니다. 하이퍼스케일 보조 명명된 복제본은 독립적인 크기 조정, 액세스 격리, 워크로드 격리, 다양한 읽기 확장 시나리오 및 기타 이점을 제공합니다. 하나의 보조 복제본에서 사용할 수 있는 것보다 더 많은 리소스가 필요한 읽기 전용 워크로드의 부하를 분산하기 위해 여러 개의 보조 HA 복제본을 사용할 수 있습니다.

기본, 표준 및 범용 서비스 계층의 고가용성 아키텍처에는 복제본이 포함되지 않습니다. 이러한 서비스 계층에서는 읽기 확장 기능을 사용할 수 없습니다. 그러나 Azure SQL Database를 사용하는 경우 지역 복제본은 이러한 서비스 계층에서 유사한 기능을 제공할 수 있습니다. Azure SQL Managed Instance 및 장애 조치 그룹을 사용하는 경우 장애 조치 그룹 읽기 전용 수신기는 각각 유사한 기능을 제공할 수 있습니다.

다음 다이어그램에서는 프리미엄 및 중요 비즈니스용 데이터베이스와 관리되는 인스턴스의 기능을 보여 줍니다.

Diagram showing readonly replicas.

읽기 확장 기능은 새 프리미엄, 중요 비즈니스용 및 하이퍼스케일 데이터베이스에서 기본적으로 사용하도록 설정됩니다.

참고

읽기 확장은 SQL Managed Instance의 중요 비즈니스용 서비스 계층 및 하나 이상의 보조 복제본이 있는 하이퍼스케일 데이터베이스에서 항상 사용하도록 설정됩니다.

SQL 연결 문자열이 ApplicationIntent=ReadOnly로 구성된 경우 해당 데이터베이스 또는 관리형 인스턴스의 읽기 전용 복제본으로 애플리케이션이 리디렉션됩니다. ApplicationIntent 속성을 사용하는 방법에 대한 자세한 내용은 애플리케이션 의도 지정을 참조하세요.

(Azure SQL Database에만 해당) SQL 연결 문자열의 ApplicationIntent 설정에 관계없이 애플리케이션이 주 복제본에 연결되도록 하려면 데이터베이스를 만들 때 또는 구성을 변경할 때 읽기 확장을 명시적으로 사용 중지해야 합니다. 예를 들어 데이터베이스를 표준 또는 범용 계층에서 프리미엄 또는 중요 비즈니스용으로 업그레이드하고, 모든 연결이 주 복제본으로 이동하도록 하려면 읽기 확장을 사용하지 않도록 설정합니다. 사용하지 않도록 설정하는 방법에 대한 자세한 내용은 읽기 확장 사용 및 사용 안 함을 참조하세요.

참고

읽기 전용 복제본에서는 쿼리 저장소 및 SQL Profiler 기능이 지원되지 않습니다.

데이터 일관성

주 복제본의 데이터 변경 내용은 복제본 유형에 따라 읽기 전용 복제본에 동기적으로 또는 비동기적으로 유지됩니다. 그러나 모든 복제본 형식에서 주 복제본에 대한 읽기 전용 복제본의 읽기는 항상 비동기입니다. 읽기 전용 복제본에 연결된 세션 내에서 읽기는 항상 트랜잭션 일관성이 있습니다. 데이터 전파 대기 시간은 가변적이므로 서로 다른 복제본이 기본 및 서로에 대해 약간 다른 시점에서 데이터를 반환할 수 있습니다. 읽기 전용 복제본을 사용할 수 없게 되어 세션이 다시 연결되면 원래 복제본과 다른 시점에 있는 복제본에 연결할 수 있습니다. 마찬가지로 주 복제본에서 애플리케이션이 읽기-쓰기 세션을 사용하여 데이터를 변경하고 즉시 읽기 전용 복제본에서 읽기 전용 세션을 사용하여 읽는 경우, 최신 변경 내용이 읽기 전용 복제본에 즉시 표시되지 않을 수 있습니다.

주 복제본과 읽기 전용 복제본 간의 일반적인 데이터 전파 대기 시간은 수십 밀리초에서 몇 초까지 다양합니다. 그러나 데이터 전파 대기 시간에 대한 고정된 상한은 없습니다. 복제본의 높은 리소스 사용률과 같은 조건은 대기 시간을 상당히 증가시킬 수 있습니다. 세션 간에 보장된 데이터 일관성이 필요하거나 커밋된 데이터를 즉시 읽을 수 있어야 하는 애플리케이션은 주 복제본을 사용해야 합니다.

참고 항목

데이터 전파 대기 시간에는 로그 레코드를 보조 복제본(replica)으로 보내고 유지하는 데 필요한 시간이 포함됩니다. 데이터 페이지에 이러한 로그 레코드를 다시 실행(적용)하는 데 필요한 시간도 포함됩니다. 데이터 일관성을 보장하기 위해 트랜잭션 커밋 로그 레코드가 적용될 때까지 변경 내용이 표시되지 않습니다. 워크로드가 더 큰 트랜잭션을 사용하는 경우 효과적인 데이터 전파 대기 시간이 증가합니다.

데이터 전파 대기 시간을 모니터링하려면 읽기 전용 복제본 모니터링 및 문제 해결을 참조하세요.

읽기 전용 복제본에 연결

데이터베이스에 대한 읽기 확장을 사용하도록 설정하면 클라이언트에서 제공하는 연결 문자열의 ApplicationIntent 옵션은 연결이 쓰기 복제본 또는 읽기 전용 복제본으로 라우팅되는지 여부를 나타냅니다. 특히 ApplicationIntent 값이 ReadWrite(기본값)이면 연결이 읽기/쓰기 복제본으로 전달됩니다. ApplicationIntent이 연결 문자열에 포함되지 않은 경우의 동작과 동일합니다. ApplicationIntent 값이 ReadOnly이면 연결이 읽기 전용 복제본으로 라우팅됩니다.

예를 들어 다음 연결 문자열은 클라이언트를 읽기 전용 복제본에 연결합니다(꺾쇠 괄호 안의 항목을 사용자 환경에 맞는 값으로 바꾸고 꺾쇠 괄호는 삭제함).

Server=tcp:<server>.database.windows.net;Database=<mydatabase>;ApplicationIntent=ReadOnly;User ID=<myLogin>;Password=<myPassword>;Trusted_Connection=False; Encrypt=True;

SSMS(SQL Server Management Studio)를 사용하여 읽기 전용 복제본에 연결하려면 옵션을 선택합니다.

Screenshot showing the SSMS Options button.

추가 연결 매개 변수를 선택하고 ApplicationIntent=ReadOnly를 입력한 다음 연결을 선택합니다.

Screenshot showing SSMS Additional Connection Parameters.

다음 연결 문자열 중 하나는 클라이언트를 읽기/쓰기 복제본에 연결합니다(꺾쇠 괄호 안의 항목을 사용자 환경에 맞는 값으로 바꾸고 꺾쇠 괄호는 삭제함).

Server=tcp:<server>.database.windows.net;Database=<mydatabase>;ApplicationIntent=ReadWrite;User ID=<myLogin>;Password=<myPassword>;Trusted_Connection=False; Encrypt=True;

Server=tcp:<server>.database.windows.net;Database=<mydatabase>;User ID=<myLogin>;Password=<myPassword>;Trusted_Connection=False; Encrypt=True;

읽기 전용 복제본에 대한 연결인지 확인

데이터베이스 컨텍스트에서 다음 쿼리를 실행하여 읽기 전용 복제본에 연결되어 있는지 여부를 확인할 수 있습니다. 읽기 전용 복제본에 연결된 경우 READ_ONLY가 반환됩니다.

SELECT DATABASEPROPERTYEX(DB_NAME(), 'Updateability');

참고 항목

프리미엄 및 중요 비즈니스용 서비스 계층에서는 지정된 시간에 읽기 전용 복제본 중 하나에만 액세스할 수 있습니다. 하이퍼스케일은 여러 읽기 전용 복제본을 지원합니다.

읽기 전용 복제본 모니터링 및 문제 해결

읽기 전용 복제본에 연결된 경우 DMV(동적 관리 뷰)는 복제본의 상태를 반영하며 모니터링 및 문제 해결을 위해 쿼리할 수 있습니다. 데이터베이스 엔진은 다양한 모니터링 데이터를 표시하기 위해 다양한 뷰를 제공합니다.

다음 보기는 일반적으로 복제본 모니터링 및 문제 해결에 사용됩니다.

속성 목적
sys.dm_db_resource_stats CPU, 데이터 IO, 서비스 목표 한도와 관련된 로그 쓰기 사용률을 포함하여 지난 1시간 동안 리소스 사용률 메트릭을 제공합니다.
sys.dm_os_wait_stats 데이터베이스 엔진 인스턴스에 대한 집계 대기 통계를 제공합니다.
sys.dm_database_replica_states 복제본 성능 상태 및 동기화 통계를 제공합니다. 읽기 전용 복제본의 데이터 전파 대기 시간의 지표로 다시 실행 큐 크기 및 다시 실행 속도 제공이 표시됩니다.
sys.dm_os_performance_counters 데이터베이스 엔진 성능 카운터를 제공합니다.
sys.dm_exec_query_stats 실행 수, CPU 사용 시간 등 쿼리별 실행 통계를 제공합니다.
sys.dm_exec_query_plan() 캐시된 쿼리 계획을 제공합니다.
sys.dm_exec_sql_text() 캐시된 쿼리 계획에 대한 쿼리 텍스트를 제공합니다.
sys.dm_exec_query_profiles 쿼리가 실행되는 동안 실시간 쿼리 진행 현황을 제공합니다.
sys.dm_exec_query_plan_stats() 쿼리의 런타임 통계를 포함하여 마지막으로 알려진 실제 실행 계획을 제공합니다.
sys.dm_io_virtual_file_stats() 모든 데이터베이스 파일에 대한 스토리지 IOPS, 처리량, 대기 시간 통계를 제공합니다.

참고

논리적 master 데이터베이스의 sys.resource_statssys.elastic_pool_resource_stats DMV는 주 복제본의 리소스 사용률 데이터를 반환합니다.

확장 이벤트를 사용하여 읽기 전용 복제본 모니터링

읽기 전용 복제본에 연결된 경우에는 확장 이벤트 세션을 만들 수 없습니다. 그러나 Azure SQL Database에서는, 주 복제본에서 만들어지고 변경된 데이터베이스 범위 지정 확장 이벤트 세션의 정의가 지역 복제본을 포함한 읽기 전용 복제본에 복제되고 읽기 전용 복제본에 대한 이벤트를 캡처합니다.

주 복제본의 세션 정의를 기반으로 하는 읽기 전용 복제본에서 확장 이벤트 세션을 주 복제본의 세션과 별개로 시작하고 중지할 수 있습니다.

읽기 전용 복제본(replica) 이벤트 세션을 삭제하려면 다음 단계를 수행합니다.

  1. SSMS 개체 탐색기 또는 쿼리 창을 읽기 전용 복제본(replica)에 연결.
  2. 개체 탐색기 세션 상황에 맞는 메뉴에서 세션 중지를 선택하거나 쿼리 창에서 ALTER EVENT SESSION [session-name-here] ON DATABASE STATE = STOP;을(를) 실행하여 읽기 전용 복제본(replica) 세션을 중지합니다.
  3. 개체 탐색기 또는 쿼리 창을 주 복제본(replica)에 연결.
  4. 세션 상황에 맞는 메뉴에서 삭제를 선택하거나 DROP EVENT SESSION [session-name-here] ON DATABASE;을(를) 실행하여 기본 복제본(replica) 세션을 삭제합니다.

읽기 전용 복제본의 트랜잭션 격리 수준

읽기 전용 복제본의 트랜잭션은 세션의 트랜잭션 격리 수준 및 쿼리 힌트에 관계없이 항상 스냅샷 트랜잭션 격리 수준을 사용합니다. 스냅샷 격리는 판독기에서 작성기를 차단하는 차단 시나리오를 방지하기 위해 행 버전 관리를 사용합니다.

드문 경우지만, 스냅샷 격리 트랜잭션이 다른 동시 트랜잭션에서 수정된 개체 메타데이터에 액세스하는 경우, 다음과 같은 3961 오류 메시지가 표시될 수 있습니다. “이 트랜잭션이 시작된 이후 다른 동시 트랜잭션의 DDL 문에 의해 ‘%.*ls’ 데이터베이스에서 스냅샷 격리 트랜잭션이 실패했습니다. 메타데이터 버전이 관리되지 않기 때문에 허용되지 않습니다. 메타데이터에 대한 동시 업데이트로 인해 스냅샷 격리와 혼동되면 불일치가 발생할 수 있습니다.”

읽기 전용 복제본에 대한 장기 실행 쿼리

읽기 전용 복제본에서 실행되는 쿼리는 쿼리에서 참조되는 개체의 메타데이터(테이블, 인덱스, 통계 등)에 액세스해야 합니다. 드문 경우지만, 쿼리가 읽기 전용 복제본의 동일한 개체에 대한 잠금을 유지하는 동안 주 복제본에서 개체 메타데이터가 수정되면 쿼리가 주 복제본의 변경 내용을 읽기 전용 복제본에 적용하는 프로세스를 차단할 수 있습니다. 이러한 쿼리가 오랜 시간 동안 실행되는 경우 읽기 전용 복제본이 주 복제본과 동기화되지 않을 수 있습니다. 잠재적 장애 조치(failover) 대상인 복제본(프리미엄 및 중요 비즈니스용 서비스 계층의 보조 복제본, 하이퍼스케일 HA 복제본 및 모든 지역 복제본)의 경우 장애 조치(failover)가 발생하면 데이터베이스 복구가 지연되어 가동 중지 시간이 예상보다 더 길어질 수 있습니다.

읽기 전용 복제본에 대한 장기 실행 쿼리로 인해 이러한 종류의 차단이 직접 또는 간접적으로 발생하면 과도한 데이터 대기 시간과 잠재적인 데이터베이스 가용성 영향을 방지하기 위해 자동으로 종료될 수 있습니다. 오류 1219, “높은 우선 순위 DDL 작업으로 인해 세션의 연결이 해제되었습니다.” 또는 오류 3947, “보조 컴퓨팅에서 다시 실행을 캐치업하지 못해 트랜잭션이 중단되었습니다. 트랜잭션을 다시 시도하세요.” 메시지가 세션에 표시됩니다.

참고

읽기 전용 복제본에 대해 쿼리를 실행할 때 오류 3961, 1219 또는 3947이 발생하면 쿼리를 다시 시도합니다. 또는 장기 실행 쿼리가 보조 복제본에서 실행되는 동안 네이티브 복제본에서 개체 메타데이터(스키마 변경, 인덱스 유지 관리, 통계 업데이트 등)를 수정하는 작업을 방지합니다.

프리미엄 및 중요 비즈니스용 서비스 계층에서 읽기 전용 복제본에 연결된 경우, sys.dm_database_replica_states DMV의 redo_queue_sizeredo_rate 열을 사용하여 읽기 전용 복제본의 데이터 전파 대기 시간 지표로 제공되는 데이터 동기화 프로세스를 모니터링할 수 있습니다.

SQL Database에 대한 읽기 확장 사용 및 사용 안 함

SQL Managed Instance 경우 읽기 확장은 중요 비즈니스용 서비스 계층에서 자동으로 사용하도록 설정되며 범용 서비스 계층에서는 사용할 수 없습니다. 읽기 확장을 사용하지 않도록 설정한 후 다시 설정할 수는 없습니다.

SQL Database의 경우 읽기 확장은 프리미엄, 중요 비즈니스용, 하이퍼스케일 서비스 계층에서 기본적으로 사용하도록 설정됩니다. 기본, 표준 또는 범용 서비스 계층에서는 읽기 확장을 사용하도록 설정할 수 없습니다. 보조 복제본이 0개로 구성된 하이퍼스케일 데이터베이스에서 읽기 확장은 자동으로 사용하지 않도록 설정됩니다.

Azure SQL Database에 있는 단일 및 풀링된 데이터베이스의 경우, Azure Portal 및 Azure PowerShell을 사용하여 프리미엄 또는 중요 비즈니스용 서비스 계층에서 읽기 확장을 사용하지 않도록 설정한 다음 다시 사용하도록 설정할 수 있습니다. 읽기 확장 기능은 사용하지 않도록 설정할 수 없으므로 이러한 옵션은 SQL Managed Instance에서는 사용할 수 없습니다.

참고 항목

이전 버전과의 호환성을 위해, 단일 데이터베이스 및 탄력적 풀 데이터베이스의 경우 읽기 확장을 사용 중지하는 기능이 제공됩니다. 중요 비즈니스용 관리형 인스턴스에서는 읽기 확장을 사용 중지할 수 없습니다.

Azure Portal

Azure SQL Database의 경우 설정의 사용할 수 있는 컴퓨팅 + 스토리지 데이터베이스 창에서 읽기 확장 설정을 관리할 수 있습니다. Azure Portal을 사용하여 읽기 확장을 사용하거나 사용하지 않도록 설정하는 것은 Azure SQL Managed Instance에서는 불가능합니다.

PowerShell

중요

PowerShell Azure Resource Manager 모듈은 여전히 지원되지만 향후 모든 개발은 Az.Sql 모듈에 집중됩니다. Azure Resource Manager 모듈에는 적어도 2020년 12월까지 버그 수정이 계속될 예정입니다. Az 모듈 및 Azure Resource Manager 모듈의 명령에 대한 인수는 사실상 동일합니다. 호환성에 대한 자세한 내용은 새로운 Azure PowerShell Az 모듈 소개를 참조하세요.

Azure PowerShell에서 읽기 확장을 관리하려면 2016년 12월 Azure PowerShell 릴리스 이상이 필요합니다. 최신 PowerShell 버전은 Azure PowerShell을 참조하세요.

Azure SQL Database에서는 Azure PowerShell에서 Set-AzSqlDatabase cmdlet을 호출하고 -ReadScale 매개 변수에 대해 원하는 값(Enabled 또는 Disabled)을 전달하여 읽기 확장을 사용 중지하거나 다시 사용 설정할 수 있습니다. SQL Managed Instance에 대해 읽기 확장을 사용하지 않도록 설정할 수는 없습니다.

기존 데이터베이스에 대해 읽기 확장을 사용하지 않도록 설정하려면 다음을 수행합니다(꺾쇠 괄호 안의 항목을 사용자 환경에 맞는 값으로 바꾸고 꺾쇠 괄호는 삭제함).

Set-AzSqlDatabase -ResourceGroupName <resourceGroupName> -ServerName <serverName> -DatabaseName <databaseName> -ReadScale Disabled

새로운 데이터베이스에 대해 읽기 확장을 사용하지 않도록 설정하려면 다음을 수행합니다(꺾쇠 괄호 안의 항목을 사용자 환경에 맞는 값으로 바꾸고 꺾쇠 괄호는 삭제함).

New-AzSqlDatabase -ResourceGroupName <resourceGroupName> -ServerName <serverName> -DatabaseName <databaseName> -ReadScale Disabled -Edition Premium

기존 데이터베이스에 대해 읽기 확장을 다시 사용하도록 설정하려면 다음을 수행합니다(꺾쇠 괄호 안의 항목을 사용자 환경에 맞는 값으로 바꾸고 꺾쇠 괄호는 삭제함).

Set-AzSqlDatabase -ResourceGroupName <resourceGroupName> -ServerName <serverName> -DatabaseName <databaseName> -ReadScale Enabled

REST API

읽기 확장을 사용하지 않도록 설정된 데이터베이스를 만들거나 기존 데이터베이스에 대한 설정을 변경하려면 다음 샘플 요청과 같이 readScale 속성이 Enabled 또는 Disabled로 설정된 다음 메서드를 사용합니다.

Method: PUT
URL: https://management.azure.com/subscriptions/{SubscriptionId}/resourceGroups/{GroupName}/providers/Microsoft.Sql/servers/{ServerName}/databases/{DatabaseName}?api-version= 2014-04-01-preview
Body: {
   "properties": {
      "readScale":"Disabled"
   }
}

자세한 내용은 데이터베이스 - 만들기 또는 업데이트를 참조하세요.

읽기 전용 복제본에서 tempdb 데이터베이스 사용

주 복제본의 tempdb 데이터베이스는 읽기 전용 복제본으로 복제되지 않습니다. 각 복제본마다 복제본을 만들 때 tempdb 데이터베이스가 생성됩니다. 이를 통해 tempdb를 업데이트할 수 있고 쿼리를 실행하는 동안 수정할 수 있습니다. 읽기 전용 워크로드가 tempdb 개체 사용에 따라 달라지는 경우 읽기 전용 복제본에 연결된 상태에서 이러한 개체를 동일한 워크로드의 일부로 만들어야 합니다.

지역에서 복제된 데이터베이스에서 읽기 확장 사용

지역에서 복제된 보조 데이터베이스에는 주 데이터베이스와 동일한 고가용성 아키텍처가 있습니다. 읽기 확장을 사용하도록 설정된 지역에서 복제된 보조 데이터베이스에 연결하는 경우에는 ApplicationIntent=ReadOnly을(를) 사용하는 세션이 기본 쓰기 가능 데이터베이스에서 라우팅되는 것과 같은 방식으로 고가용성 복제본 중 하나로 라우팅됩니다. ApplicationIntent=ReadOnly이(가) 없는 세션은 역시 읽기 전용인 지역 복제된 보조 데이터베이스의 주 복제본으로 라우팅됩니다.

지역 복제본을 이 방식으로 만들면 여러 개의 추가 읽기 전용 복제본을 읽기-쓰기 주 데이터베이스에 제공할 수 있습니다. 각 추가 지역 복제본은 다른 읽기 전용 복제본 세트를 제공합니다. 주 데이터베이스의 지역을 포함하여 모든 Azure 지역에서 지역 복제본을 만들 수 있습니다.

참고

둘 이상의 HA 복제본이 있는 하이퍼스케일 지역 복제본을 제외하고 지역에서 복제된 보조 데이터베이스의 복제본 간에는 자동 라운드 로빈 또는 부하가 분산된 다른 라우팅이 없습니다. 이 경우 읽기 전용 의도가 있는 세션은 지역 복제본의 모든 HA 복제본에 분산됩니다.

읽기 전용 복제본에 대한 기능 지원

읽기 전용 복제본의 일부 기능 동작 목록은 다음과 같습니다.

  • 읽기 전용 복제본에 대한 감사는 자동으로 사용하도록 설정됩니다. 스토리지 폴더의 계층 구조, 명명 규칙 및 로그 형식에 대한 자세한 내용은 SQL Database 감사 로그 형식을 참조하세요.
  • Query Performance Insight는 현재 읽기 전용 복제본에 대한 작업을 추적하지 않는 쿼리 저장소의 데이터를 사용합니다. Query Performance Insight는 읽기 전용 복제본에서 실행되는 쿼리를 표시하지 않습니다.
  • 자동 튜닝은 자동 튜닝 문서에서 자세히 설명한 대로 쿼리 저장소를 사용합니다. 자동 튜닝은 주 복제본에서 실행되는 워크로드에만 작동합니다.

다음 단계