Always On 가용성 그룹의 복구 큐 문제 해결
이 문서에서는 복구 큐와 관련된 문제에 대한 해결 방법을 제공합니다.
복구 큐란?
가용성 그룹 데이터베이스의 주 복제본(replica) 변경한 내용은 동일한 가용성 그룹에 정의된 모든 보조 복제본으로 전송됩니다. 이러한 변경 내용이 보조 복제본에 도착하면 가용성 그룹 데이터베이스의 트랜잭션 로그 파일에 먼저 기록됩니다. 그런 다음 Microsoft SQL Server 복구 또는 다시 실행 작업을 사용하여 데이터베이스 파일을 업데이트합니다.
가용성 그룹에 대한 변경 내용이 도착하여 데이터베이스 트랜잭션 로그 파일에서 복구할 수 있는 것보다 더 빠르게 강화되면 복구 큐 가 형성됩니다. 이 큐는 데이터베이스에 복구 및 복원되지 않은 강화된 트랜잭션 로그 트랜잭션으로 구성됩니다.
복구(다시 실행) 큐의 증상 및 효과
주 복제본과 보조 복제본을 쿼리하면 다른 결과가 반환됩니다.
보조 복제본을 쿼리하는 읽기 전용 워크로드는 부실 데이터를 쿼리할 수 있습니다. 복구 큐가 발생하는 경우 동일한 데이터를 쿼리할 때 주 복제본(replica) 데이터베이스의 데이터 변경 내용이 보조 데이터베이스에 반영되지 않을 수 있습니다.
변경 내용은 보조 데이터베이스에 도착하여 데이터베이스 로그 파일에 기록되지만 변경 내용이 복구되고 데이터베이스 파일로 복원될 때까지 쿼리되지 않습니다. 복구 작업은 이러한 변경 내용을 읽을 수 있게 만드는 것입니다.
자세한 내용은 "Always On 가용성 그룹에 대한 가용성 모드 간의 차이점"의 보조 복제본(replica) 데이터 대기 시간 섹션을 참조하세요.
장애 조치(failover) 시간이 길거나 RTO가 초과됨
RTO(복구 시간 목표)는 organization 처리할 수 있는 최대 데이터베이스 가동 중지 시간입니다. RTO는 또한 중단 후 organization 데이터베이스에 대한 액세스 권한을 얼마나 빨리 회복할 수 있는지도 설명합니다. 장애 조치(failover)가 발생할 때 보조 복제본(replica) 상당한 복구 큐가 있는 경우 복구에 더 오래 걸릴 수 있습니다. 복구 후 데이터베이스는 기본 역할로 전환되고 장애 조치(failover) 전에 존재한 데이터베이스의 상태를 나타냅니다. 복구 시간이 길어지면 장애 조치(failover) 후 프로덕션이 얼마나 빨리 다시 시작되는지 지연할 수 있습니다.
다양한 진단 기능 보고서 가용성 그룹 복구 큐
복구 큐의 경우 SQL Server Management Studio(SSMS)의 Always On dashboard 비정상 가용성 그룹을 보고할 수 있습니다.
복구(다시 실행) 큐에 검사 방법
복구 큐는 주 복제본(replica) Always On dashboard 사용하거나 주 또는 보조 복제본(replica) sys.dm_hadr_database_replica_states DMV(동적 관리 뷰)를 사용하여 확인할 수 있는 데이터베이스별 측정값입니다. 성능 모니터 카운터는 복구 큐 및 복구 속도를 검사. 이러한 카운터는 보조 복제본(replica) 대해 확인해야 합니다.
다음 몇 가지 섹션에서는 가용성 그룹 데이터베이스 복구 큐를 적극적으로 모니터링하는 방법을 제공합니다.
쿼리 sys.dm_hadr_database_replica_states
DMV는 sys.dm_hadr_database_replica_states
각 가용성 그룹 데이터베이스에 대한 행을 보고합니다. 보고서의 한 열은 입니다 redo_queue_size
. 이 값은 킬로바이트 단위로 측정된 복구 큐 크기입니다. 다음 쿼리와 유사한 쿼리를 설정하여 30초마다 복구 큐 크기의 추세를 모니터링할 수 있습니다. 쿼리는 기본 복제본(replica) 실행됩니다. 조건자를 is_local=0
사용하여 및 가 관련된 보조 복제본(replica) redo_queue_size
redo_rate
대한 데이터를 보고합니다.
WHILE 1=1
BEGIN
SELECT drcs.database_name, ars.role_desc, drs.redo_queue_size, drs.redo_rate,
ars.recovery_health_desc, ars.connected_state_desc, ars.operational_state_desc, ars.synchronization_health_desc, *
FROM sys.dm_hadr_availability_replica_states ars JOIN sys.dm_hadr_database_replica_cluster_states drcs ON ars.replica_id=drcs.replica_id
JOIN sys.dm_hadr_database_replica_states drs ON drcs.group_database_id=drs.group_database_id
WHERE ars.role_desc='SECONDARY' AND drs.is_local=0
waitfor delay '00:00:30'
END
출력은 다음과 같습니다.
Always On 대시보드에서 복구 큐 검토
복구 큐를 검토하려면 다음 단계를 수행합니다.
SSMS 개체 탐색기 가용성 그룹을 마우스 오른쪽 단추로 클릭하여 SSMS에서 Always On 대시보드를 엽니다.
대시보드 표시를 선택합니다.
가용성 그룹 데이터베이스는 마지막으로 나열되며 데이터베이스에 보고된 일부 데이터가 있습니다. 다시 실행 큐 크기(KB) 및 다시 실행 속도(KB/초)는 기본적으로 나열되지 않지만 다음 단계의 스크린샷과 같이 이 보기에 추가할 수 있습니다.
이러한 카운터를 추가하려면 데이터베이스 보고서 위의 헤더를 마우스 오른쪽 단추로 클릭하고 사용 가능한 열 목록에서 선택합니다.
다시 실행 큐 크기(KB) 및 다시 실행 속도(KB/초)를 추가하려면 다음 스크린샷에서 빨간색으로 강조 표시된 헤더를 마우스 오른쪽 단추로 클릭합니다.
기본적으로 Always On dashboard 60초마다 다시 실행 큐 크기(KB) 및 다시 실행 속도(KB/초)를 자동으로 새로 고칩니다.
성능 모니터 복구 큐 검토
복구 큐 크기는 각 보조 복제본(replica) 및 데이터베이스에 고유합니다. 따라서 가용성 그룹 데이터베이스의 복구 큐를 검토하려면 다음 단계를 수행합니다.
보조 복제본(replica) 성능 모니터 엽니다.
추가(카운터) 단추를 선택합니다.
사용 가능한 카운터에서 SQLServer:Database 복제본을 선택한 다음, 복구 큐 및 다시 실행 바이트/초 카운터를 선택합니다.
인스턴스 목록 상자에서 복구 큐에 대해 모니터링할 가용성 그룹 데이터베이스를 선택합니다.
확인추가>를 선택합니다.
복구 큐가 증가하는 모양은 다음과 같습니다.
복구 큐 값 해석
이 섹션에서는 이전 섹션에서 결정한 복구 큐와 관련된 값을 해석하는 방법을 설명합니다.
복구 큐에 문제가 있는 경우는 언제인가요? 얼마나 많은 복구 큐를 허용해야 하나요?
복구 큐가 값을 0으로 보고하는 경우 이는 해당 보고서 당시 복구 큐가 발생하지 않는다는 것을 의미합니다. 그러나 프로덕션 환경이 사용 중인 경우 정상 AlwaysOn 환경에서도 복구 큐가 0 이외의 값을 자주 보고하는 것을 관찰해야 합니다. 일반적인 프로덕션 중에는 이 값이 0과 0이 아닌 값 사이에서 변동하는 것을 관찰해야 합니다.
시간이 지남에 따라 복구 큐가 증가하는 것을 관찰하는 경우 추가 조사가 보장됩니다. 이 추가 작업은 무언가가 변경되었음을 나타냅니다. 복구 큐의 급격한 증가를 관찰하는 경우 다음 측정값은 문제 해결에 유용합니다.
- 로그 다시 실행 속도(KB/초)(AlwaysOn dashboard)
- DMV sys.dm_hadr_database_replica_states Redo_rate
다시 실행 속도에 대한 기준 요금 가져오기
정상 AlwaysOn 성능 중에 사용 중인 가용성 그룹 데이터베이스의 다시 실행 속도를 모니터링합니다. 일반적으로 바쁜 업무 시간에는 어떤 모습일까요? 대규모 트랜잭션(인덱스 다시 빌드, ETL 프로세스)이 시스템에서 더 높은 트랜잭션 처리량을 유도하는 유지 관리 기간 동안 이러한 비율은 어떻게 됩니까? 복구 큐 증가를 관찰할 때 이러한 값을 비교하여 변경된 내용을 확인할 수 있습니다. 워크로드가 평소보다 클 수 있습니다. 다시 실행 속도가 낮으면 이유를 확인하기 위해 추가 조사가 필요할 수 있습니다.
워크로드 볼륨이 중요합니다.
대규모 워크로드(예: 100만 행에 대한 UPDATE 문, 1테라바이트 테이블의 인덱스 다시 빌드 또는 수백만 개의 행을 삽입하는 ETL 일괄 처리)가 있는 경우 즉시 또는 시간이 지남에 따라 일부 복구 큐 증가가 예상되어야 합니다. 이는 가용성 그룹 데이터베이스에서 갑자기 많은 수의 변경이 수행될 때 예상됩니다.
복구(다시 실행) 큐를 진단하는 방법
특정 보조 복제본(replica) 가용성 그룹 데이터베이스에 대한 복구 큐를 식별한 후 보조 복제본(replica) 연결한 다음 쿼리 sys.dm_exec_requests
하여 및 복구 스레드를 확인 wait_type
wait_time
합니다. 루프에서 실행할 수 있는 쿼리는 다음과 같습니다. 하나 이상의 대기 형식의 빈도가 높고 이러한 대기 유형에 대한 대기 시간도 찾고 있습니다. 다음은 매 초마다 실행되고 가용성 그룹 "agdb"에 대한 대기 유형 및 대기 시간을 보고하는 샘플 쿼리입니다.
WHILE (1=1)
BEGIN
SELECT db_name(database_id) AS dbname, command, session_id, database_id, wait_type, wait_time,
os.runnable_tasks_count, os.pending_disk_io_count FROM sys.dm_exec_requests der JOIN sys.dm_os_schedulers os
ON der.scheduler_id=os.scheduler_id
WHERE command IN('PARALLEL REDO HELP TASK', 'PARALLEL REDO TASK', 'DB STARTUP')
AND database_id= db_id('agdb')
waitfor delay '00:00:05.000'
END
중요
의미 있는 대기 유형 출력의 경우 이전에 설명한 방법 중 하나를 사용하여 이 조건을 모니터링할 때 복구 큐가 증가하는 것을 관찰해야 합니다.
이 예제에서는 일부 I/O 관련 대기 유형이 보고됩니다(PAGEIOLATCH_UP
, PAGEIOATCH_EX
). 다음 열에 보고된 대로 이러한 대기 형식의 값이 계속 가장 wait_times
큰지 검사 모니터링합니다.
다시 실행 대기 유형 SQL Server
대기 유형이 식별되면 다음 문서 SQL Server 2016/2017: 가용성 그룹 보조 복제본(replica) 다시 실행 모델 및 성능 - 복구 큐를 유발하는 일반적인 대기 유형에 대한 상호 참조로 Microsoft Tech Community 문제를 resolve 도움말을 검토합니다.
보조 보고 서버에서 차단된 다시 실행 스레드
솔루션이 보조 복제본(replica) 가용성 그룹 데이터베이스에 대해 보고(쿼리)를 지시하는 경우 이러한 읽기 전용 쿼리는 Sch-S(스키마 안정성) 잠금을 획득합니다. 이러한 Sch-S 잠금은 다시 실행 스레드가 스키마 수정(Sch-M) 잠금("스키마 수정 잠금" 또는 LCK_M_SCH_M
)을 획득하여 또는 ALTER INDEX
와 같은 ALTER TABLE
DDL(데이터 정의 언어) 변경을 수행하지 못하도록 차단할 수 있습니다. 차단된 다시 실행 스레드는 차단 해제될 때까지 로그 레코드를 적용할 수 없습니다. 이로 인해 복구 큐가 발생할 수 있습니다.
차단된 다시 실행의 기록 증거를 검사 SSMS를 사용하여 보조 복제본(replica) AlwaysOn_health Xevent 추적 파일을 엽니다.
lock_redo_blocked
이벤트를 찾습니다.
성능 모니터 사용하여 복구 큐에 대한 차단된 다시 실행 영향을 적극적으로 모니터링합니다.
SQL Server::D atabase Replica::Redo blocked/sec 및 SQL Server::D atabase Replica::Recovery Queue 카운터를 추가합니다. 다음 스크린샷은 주 복제본(replica) 대해 실행되는 명령을 보여 ALTER TABLE ALTER COLUMN
주며 장기 실행 쿼리는 보조 복제본(replica) 동일한 테이블에 대해 실행됩니다.
Redo blocked/sec 카운터는 명령이 실행 중임을 ALTER TABLE ALTER COLUMN
나타냅니다. 장기 실행 쿼리가 보조 복제본(replica) 동일한 테이블에서 실행되는 동안 주 데이터베이스의 후속 변경으로 인해 복구 큐가 증가합니다.
다시 실행 스레드가 획득하려고 시도하는 스키마 수정 잠금 대기 유형을 모니터링합니다. 이렇게 하려면 앞에서 설명한 쿼리를 사용하여 에 대한 다시 실행 작업에 대해 보고된 대기 유형을 검사.sys.dm_exec_requests
진행 중인 다시 실행 차단에서 에 LCK_M_SCH_M
대한 대기 시간이 증가하는 것을 관찰할 수 있습니다.
단일 스레드 다시 실행
SQL Server Microsoft SQL Server 2016에서 보조 복제본(replica) 데이터베이스에 대한 병렬 복구를 도입했습니다. SQL Microsoft Server 2012 또는 Microsoft SQL Server 2014를 실행할 때 복구 큐가 발생하는 경우 이후 버전의 프로그램으로 업그레이드하여 프로덕션 환경에서 다시 실행 성능을 향상시킬 수 있습니다.
단일 스레드 다시 실행은 병렬 복구 아키텍처가 사용되는 고급 SQL Server 버전에서도 발생할 수 있습니다. 이러한 버전에서는 SQL Server instance 병렬 다시 실행에 최대 100개의 스레드를 사용할 수 있습니다. 프로세서 및 가용성 그룹 데이터베이스 수에 따라 병렬 다시 실행 스레드는 최대 100개의 총 스레드까지 할당됩니다. 100개 스레드 다시 실행 제한에 도달하면 가용성 그룹의 일부 데이터베이스에 단일 다시 실행 스레드가 할당됩니다.
가용성 그룹 데이터베이스가 병렬 복구를 사용하고 있는지 확인하려면 보조 복제본(replica) 연결하고 다음 쿼리를 사용하여 가용성 그룹 데이터베이스에 대한 복구를 적용하는 행(스레드) 수를 확인합니다. 다음 예제에서 "agdb" 데이터베이스가 단일 스레드이고 해당 명령이 DB STARTUP
인 경우 복구 워크로드는 병렬 복구의 이점을 얻을 수 있습니다.
SELECT db_name(database_id) AS dbname, command, session_id, database_id, wait_type, wait_time,
os.runnable_tasks_count, os.pending_disk_io_count FROM sys.dm_exec_requests der JOIN sys.dm_os_schedulers os
ON der.scheduler_id=os.scheduler_id
WHERE command IN ('PARALLEL REDO HELP TASK', 'PARALLEL REDO TASK', 'DB STARTUP')
AND database_id= db_id('agdb')
데이터베이스가 단일 스레드 다시 실행을 사용하는지 확인하는 경우 앞에서 설명한 알고리즘을 검토하여 SQL Server 병렬 복구 전용 작업자 스레드 100개 수를 초과하는지 확인합니다. 이러한 조건은 "agdb" 데이터베이스가 복구를 위해 단일 스레드만 사용하는 이유일 수 있습니다.
이제 SQL Server 2022에서는 워크로드에 따라 병렬 복구를 위해 작업자 스레드가 할당되도록 새 병렬 복구 알고리즘을 사용합니다. 이렇게 하면 사용 중인 데이터베이스가 단일 스레드 복구에 남아 있을 가능성이 없습니다. 자세한 내용은 "Always On 가용성 그룹에 대한 필수 구성 요소, 제한 사항 및 권장 사항"의 가용성 그룹별 스레드 사용량 섹션을 참조하세요.