다중 테넌트 SaaS 앱에서 Azure SQL Database의 성능 모니터링 및 관리

적용 대상:Azure SQL Database

이 자습서에서는 SaaS 애플리케이션에서 사용되는 몇 가지 주요 성능 관리 시나리오를 살펴봅니다. 부하 생성기를 사용하여 모든 테넌트 데이터베이스에서의 활동을 시뮬레이션하여 SQL Database 및 탄력적 풀의 기본 제공 모니터링 및 경고 기능을 보여 줍니다.

Wingtip Tickets SaaS 테넌트당 데이터베이스 앱은 단일 테넌트 데이터 모델을 사용하며, 각 장소(테넌트)에 자체 데이터베이스가 있습니다. 많은 SaaS 애플리케이션과 마찬가지로 예상 테넌트 워크로드 패턴은 예측하기 어렵고 간헐적입니다. 예를 들어 티켓 판매는 아무 때나 발생할 수 있습니다. 이러한 일반적인 데이터베이스 사용 패턴을 이용하기 위해 테넌트 데이터베이스가 탄력적 풀에 배포됩니다. 탄력적 풀은 많은 데이터베이스에 걸쳐 리소스를 공유하여 솔루션의 비용을 최적화합니다. 이 유형의 패턴에서는 풀 전체에 걸쳐 부하가 합리적으로 균형을 유지하도록 데이터베이스 및 풀 리소스 사용을 모니터링해야 합니다. 또한 개별 데이터베이스에 적합한 리소스가 있고 풀이 eDTU 한도에 도달하지 않도록 해야 합니다. 이 자습서에서는 데이터베이스와 풀을 모니터링하고 관리하는 방법과 워크로드 변화에 응답하여 정정 작업을 실행하는 방법을 탐색합니다.

이 자습서에서는 다음 방법에 대해 알아봅니다.

  • 제공된 부하 생성기를 실행하여 테넌트 데이터베이스에 대한 사용량 시뮬레이션
  • 부하 증가에 응답하여 테넌트 데이터베이스 모니터링
  • 증가된 데이터베이스 부하에 응답하여 탄력적 풀 강화
  • 데이터베이스 작업의 부하를 분산하도록 두 번째 탄력적 풀을 프로비전

이 자습서를 수행하려면 다음 필수 조건이 완료되었는지 확인합니다.

SaaS 성능 관리 패턴 소개

데이터베이스 성능 관리는 성능 데이터 컴파일 및 분석한 다음, 애플리케이션에 대해 허용되는 응답 시간을 유지하도록 매개 변수를 조정하여 이 데이터에 반응하는 과정으로 구성됩니다. 여러 테넌트를 호스트할 때 탄력적 풀을 사용하면 워크로드가 예측 불가능한 데이터베이스 그룹의 리소스를 경제적으로 제공하고 관리할 수 있습니다. 특정 워크로드 패턴의 경우 풀에서 관리하면 S3 데이터베이스 두 개만 이점을 얻을 수 있습니다.

application diagram

풀 및 풀에 있는 데이터베이스를 모니터링하여 성능의 허용 범위로 유지되는지 확인해야 합니다. 풀 구성을 모든 데이터베이스의 집계 워크로드에 대한 요구에 맞게 조정하여 풀 eDTU가 전체 워크로드에 적합하게 해야 합니다. 데이터베이스별 최소 및 데이터베이스별 최대 eDTU 값을 특정 애플리케이션 요구 사항에 적합한 값으로 조정합니다.

성능 관리 전략

  • 수동으로 성능을 모니터링할 필요가 없도록 하려면 데이터베이스 또는 풀이 정상 범위를 벗어난 경우 트리거되는 경고를 설정하는 것이 가장 효과적입니다.
  • 풀의 집계 컴퓨팅 크기의 단기적 변동에 대응하기 위해 풀 eDTU 수준을 확장하거나 축소할 수 있습니다. 이러한 변동이 정기적으로 또는 예측 가능한 단위로 발생하는 경우 풀 크기 조정을 자동으로 일어나도록 예약할 수 있습니다. 예를 들어 워크로드가 가볍다고 알고 있는 경우 야간 또는 주말 중으로 규모를 축소할 수 있습니다.
  • 더 장기적인 변동 또는 데이터베이스 수 변화에 대응하기 위해 개별 데이터베이스를 다른 풀로 이동할 수 있습니다.
  • 개별 데이터베이스 부하의 단기적 증가에 대응하기 위해 개별 데이터베이스를 풀에서 제외하고 개별 컴퓨팅 크기를 할당할 수 있습니다. 부하가 감소한 후 데이터베이스를 풀에 반환할 수 있습니다. 이러한 상황을 미리 안다면 데이터베이스에 언제나 필요한 리소스가 있도록 하고 풀에 있는 다른 데이터베이스에 영향을 미치지 않도록 데이터베이스를 선제적으로 이동할 수 있습니다. 이 요구 사항이 예측 가능하다면 인기 있는 이벤트에 대한 티켓 판매의 급격한 증가를 경험한 영역을 애플리케이션에 통합할 수 있습니다.

Azure Portal은 대부분의 리소스에 대한 기본 제공 모니터링 및 경고를 제공합니다. 데이터베이스 및 풀에 대한 모니터링 및 경고가 가능합니다. 이 기본 제공 모니터링 및 경고는 리소스별로 다르므로 소수의 리소스에 사용하면 편리하지만 많은 리소스를 가지고 작업하는 경우 그리 편리하지 않을 수 있습니다.

여러 리소스로 작업하는 대규모 시나리오의 경우 Azure Monitor 로그를 사용할 수 있습니다. 이는 Log Analytics 작업 영역에서 수집된, 내보낸 로그에 대한 분석을 제공하는 개별 Azure 서비스입니다. Azure Monitor 로그는 여러 서비스의 원격 분석을 수집할 수 있으며, 경고를 쿼리하고 설정하는 데 사용할 수 있습니다.

Wingtip Tickets SaaS Database Per Tenant 애플리케이션 스크립트 가져오기

Wingtip Tickets SaaS 다중 테넌트 데이터베이스 스크립트 및 애플리케이션 소스 코드는 WingtipTicketsSaaS-DbPerTenant GitHub 리포지토리에서 확인할 수 있습니다. Wingtip Tickets SaaS 스크립트를 다운로드하고 차단을 해제하는 단계는 일반 지침을 확인하세요.

추가 테넌트 프로비전

풀은 S3 데이터베이스가 단 두 개인 경우 비용 효율적일 수 있지만 풀에 있는 데이터베이스가 많을수록 평균 적용이 더 비용 효율적입니다. 성능 모니터링과 관리가 규모별로 작동하는 방법을 잘 이해하기 위해 이 자습서에서 적어도 20개의 데이터베이스를 배포해야 합니다.

이미 이전 자습서에서 테넌트의 배치를 프로비전한 경우 모든 테넌트 데이터베이스에 대한 사용량 시뮬레이션 섹션을 건너뛸 수 있습니다.

  1. PowerShell ISE에서…\Learning Modules\Performance Monitoring and Management\Demo-PerformanceMonitoringAndManagement.ps1을 엽니다. 이 자습서를 실행하는 동안 여러 시나리오를 실행할 때 이 스크립트를 열어 두세요.
  2. $DemoScenario = 1, Provision a batch of tenants 설정
  3. F5 키를 눌러 스크립트를 실행합니다.

이 스크립트는 테넌트 17개를 5분 이내에 배포합니다.

New-TenantBatch 스크립트는 테넌트의 배치를 만드는 Resource Manager 템플릿의 중첩 또는 연결된 집합을 사용하며, 기본적으로 basetenantdb 데이터베이스를 카탈로그 서버에 복사하여 새 테넌트 데이터베이스를 만든 다음 이들을 카탈로그에 등록하며, 끝으로 이들을 테넌트 이름과 장소 유형으로 초기화합니다. 이 방법은 앱이 새 테넌트를 프로비전하는 방법과 일치합니다. basetenantdb에 대해 실행한 변경은 이후 프로비전하는 새 테넌트에 모두 적용됩니다. 기존 테넌트 데이터베이스(basetenantdb 데이터베이스 포함)에 대해 스키마를 변경하는 방법은 스키마 관리 자습서를 참조하세요.

모든 테넌트 데이터베이스에 대한 사용 시뮬레이션

Demo-PerformanceMonitoringAndManagement.ps1 스크립트는 모든 테넌트 데이터베이스에 대해 실행되는 워크로드를 시뮬레이션하는 경우 제공됩니다. 사용 가능한 부하 시나리오 중 하나를 사용하여 부하가 생성됩니다.

데모 시나리오
2 표준 강도 부하 생성(약 40 DTU)
3 데이터베이스별로 버스트가 더 길고 더 잦은 부하 생성
4 데이터베이스별로 DTU 버스트가 더 높은 부하 생성(약 80 DTU)
5 단일 테넌트에 표준 부하와 높은 부하 생성(약 95 DTU)
6 여러 풀에 걸쳐 불균형 부하 생성

부하 생성기는 가상 CPU만의 부하를 모든 테넌트 데이터베이스에 적용합니다. 이 생성기는 각 테넌트 데이터베이스에 대해 작업을 시작하여 부하를 생성하는 저장 프로세서를 주기적으로 호출합니다. 부하 수준(eDTU 단위), 기간 및 간격은 모든 데이터베이스에 걸쳐 변화하여 예측 불가능한 테넌트 작업을 시뮬레이션합니다.

  1. PowerShell ISE에서…\Learning Modules\Performance Monitoring and Management\Demo-PerformanceMonitoringAndManagement.ps1을 엽니다. 이 자습서를 실행하는 동안 여러 시나리오를 실행할 때 이 스크립트를 열어 두세요.
  2. $DemoScenario = 2를 설정하고, 일반 강도 부하를 생성합니다.
  3. F5를 눌러 모든 테넌트 데이터베이스에 부하를 적용합니다.

Wingtip Tickets SaaS 테넌트당 데이터베이스는 SaaS 앱이며 SaaS 앱상의 실제 부하는 일반적으로 간헐적이고 예측할 수 없습니다. 이를 시뮬레이션하기 위해 부하 생성기에서 모든 테넌트에 대해 분산된 임의의 부하를 생성합니다. 부하 패턴이 나타나기 위해서는 몇 분 정도 걸리므로, 다음 섹션의 부하 모니터링을 수행하기 전에 약 3~5분 동안 부하 생성기를 실행합니다.

중요

부하 생성기는 로컬 PowerShell 세션에서 일련의 작업으로 실행 중입니다. Demo-PerformanceMonitoringAndManagement.ps1 탭을 열어 두세요! 탭을 닫거나 컴퓨터를 일시 중단하면 부하 생성기가 중단됩니다. 부하 생성기는 job-invoking 상태로 유지되어 부하 생성기가 시작된 후에 프로비전되는 모든 새 테넌트에서 부하를 생성합니다. Ctrl-C를 사용하여 새 작업 호출을 중지하고 스크립트를 종료합니다. 부하 생성기는 계속 실행되지만 기존 테넌트에만 실행됩니다.

Azure Portal을 사용하여 리소스 사용 모니터링

적용 중인 부하 때문에 발생하는 리소스 사용을 모니터링하려면 테넌트 데이터베이스가 포함된 풀에 대해 포털을 엽니다.

  1. Azure Portal을 열고 tenants1-dpt-<USER> 서버를 찾습니다.
  2. 아래로 스크롤하여 탄력적 풀을 찾은 다음 Pool1을 클릭합니다. 이 풀에는 지금까지 만든 모든 테넌트 데이터베이스가 포함되어 있습니다.

탄력적 풀 모니터링Elastic Database 모니터링 차트를 확인합니다.

풀의 리소스 사용률은 풀에 있는 모든 데이터베이스에 대한 집계 데이터베이스 사용률입니다. 데이터베이스 차트에는 가장 많이 사용되는 5개의 데이터베이스가 표시됩니다.

database chart

풀에는 상위 5개 데이터베이스 이외에 추가 데이터베이스가 있으므로 풀 사용률은 상위 5개 데이터베이스 차트에 반영되지 않은 작업을 표시합니다. 추가 세부 정보를 보려면 데이터베이스 리소스 사용률을 클릭합니다.

database resource utilization

풀에 대한 성능 경고 설정

풀에 대해 다음과 같이 사용률 >75%일 때 트리거되는 경고를 설정합니다.

  1. Azure Portal에서 Pool1(tenants1-dpt-<user> 서버에 있음)을 엽니다.

  2. 경고 규칙, + 경고 추가를 차례로 클릭합니다.

    add alert

  3. 높은 DTU 등과 같은 이름을 제공

  4. 다음 값을 설정합니다.

    • 메트릭 = eDTU 백분율
    • 조건 = 보다 큼
    • 임계값 = 75.
    • 기간 = 지난 30분 동안
  5. 추가 관리자 전자 메일 상자에 메일 주소를 추가하고 확인을 클릭합니다.

    set alert

사용 중인 풀 확장

풀에 대한 집계 부하 수준이 풀에서 최대로 출력되는 지점까지 증가하고 eDTU 사용률이 100%에 도달한 경우 개별 데이터베이스 성능에 영향을 주며 풀에 있는 모든 데이터베이스에 대한 쿼리 응답 시간이 느려질 가능성이 있습니다.

단기적으로 추가 리소스를 제공하도록 풀을 확장하거나 풀에서 데이터베이스를 제거할 것을 생각할 수 있습니다(다른 풀로 이동 또는 풀에서 독립형 서비스 계층으로).

장기적으로 데이터베이스 성능을 개선하기 위해 쿼리 또는 인덱스의 최적화를 생각할 수 있습니다. 성능에 대한 애플리케이션의 민감도에 따라 풀이 사용률 100% eDTU에 도달하기 전에 풀을 확장하는 자체의 모범 사례를 발행합니다. 경고를 사용하여 미리 경고합니다.

생성기에 의해 생성된 부하를 증가시켜 사용 중인 풀을 시뮬레이션할 수 있습니다. 데이터베이스가 더 자주 그리고 더 오래 버스트하도록 하면 개별 데이터베이스의 요구 사항을 변경하지 않고 풀에 대한 집계 부하가 증가합니다. 풀 확장은 포털 내에서 또는 PowerShell에서 쉽게 수행됩니다. 이 연습에서는 포털을 사용합니다.

  1. $DemoScenario = 3를 설정하고, 데이터베이스별로 더 오래 더 잦은 버스트를 사용하여 부하를 생성하여 각 데이터베이스에서 요구하는 최고 부하를 변경하지 않고 풀에 대한 집계 부하의 강도를 증가시킵니다.

  2. F5를 눌러 모든 테넌트 데이터베이스에 부하를 적용합니다.

  3. Azure Portal에서 Pool1로 이동합니다.

상위 차트에 대해 증가한 풀 eDTU 사용량을 모니터링합니다. 더 높은 새 부하를 시작하려면 몇 분 걸리지만 풀이 최대 사용률에 도달하기 시작하는 것을 보고 바로 알 수 있으며 부하가 새로운 패턴으로 안정됨에 따라 풀에 빠르게 과부하가 걸립니다.

  1. 풀을 강화하려면 Pool1 페이지 위쪽의 풀 구성을 클릭합니다.
  2. 풀 eDTU 설정을 100으로 조정합니다. 풀 eDTU를 변경해도 데이터베이스별 설정은 변경되지 않습니다(여전히 데이터베이스별로 최대 50 eDTU). 풀 구성 페이지의 오른쪽에서 데이터베이스별 설정을 볼 수 있습니다.
  3. 저장을 클릭하여 풀 크기 조정 요청을 제출합니다.

Pool1>개요로 돌아가 모니터링 차트를 볼 수 있습니다. 풀에 더 많은 리소스를 제공한 효과를 모니터링합니다(데이터베이스 수가 적고 임의 부하이지만 일정 시간 동안 실행할 때까지 최종적으로 보는 것이 언제나 쉽지는 않음). 차트를 보는 동안 하위 차트 100%가 여전히 50 eDTU이지만 데이터베이스별 최대값이 여전히 50 eDTU이므로 상위 차트의 100%가 이제 100 eDTU를 나타낸다는 것을 염두에 둡니다.

데이터베이스는 프로세스 전체에 걸쳐 온라인이고 완전하게 사용할 수 있도록 남아 있습니다. 마지막 순간에 각 데이터베이스가 새 풀 eDTU에 대해 사용할 수 있는 준비가 되어 있고 활성 연결은 끊어집니다. 애플리케이션 코드는 언제나 끊어진 연결을 재시도하도록 작성해야 하므로 확장된 풀의 데이터베이스에 다시 연결합니다.

풀 간의 부하 분산

풀을 확장하는 대안으로 두 번째 풀을 만들고 데이터베이스를 해당 풀로 이동하여 두 풀 사이에 부하를 분산합니다. 이렇게 하려면 첫 번째와 같은 서버에 새 풀을 만들어야 합니다.

  1. Azure Portal에서 tenants1-dpt-<USER> 서버를 엽니다.

  2. + 새 풀을 클릭하고 현재 서버에 풀을 만듭니다.

  3. 탄력적 풀 템플릿에서 다음을 수행합니다.

    1. 이름Pool2로 설정합니다.

    2. 가격 책정 계층을 표준 풀로 남겨 둡니다.

    3. 구성 풀을 클릭합니다.

    4. 풀 eDTU50 eDTU로 설정합니다.

    5. 데이터베이스 추가를 클릭하여 서버에서 Pool2에 추가할 수 있는 데이터베이스 목록을 확인합니다.

    6. 데이터베이스 10개를 선택하여 새 풀로 이동하고 선택을 클릭합니다. 부하 생성기를 실행한 경우 서비스에서 성능 프로필에 기본 50 eDTU 크기보다 더 큰 풀이 필요한 것을 이미 알고 있으며 100 eDTU 설정으로 시작하도록 권장합니다.

      recommendation

    7. 이 자습서에서는 기본값 50 eDTU를 유지하고 선택을 다시 클릭합니다.

    8. 확인을 클릭하여 새 풀을 만들고 선택한 데이터베이스를 이동합니다.

풀을 만들고 데이터베이스를 해당 풀로 이동하는 데 몇 분이 걸립니다. 이동 중인 데이터베이스는 열려 있는 모든 연결이 닫히는 시점인 마지막 순간까지 온라인이고 완전히 액세스할 수 있는 상태로 남아 있습니다. 몇 가지 다시 시도 논리가 있는 경우 클라이언트는 새 풀의 데이터베이스에 연결합니다.

Pool2(tenants1-dpt-<user> 서버에 있음)로 이동하여 풀을 열고 성능을 모니터링합니다. 표시되지 않는 경우 새 풀의 프로비전이 완료될 때까지 기다립니다.

이제 Pool1의 리소스 사용량이 떨어지고 Pool2에 유사한 부하가 걸려 있는 것으로 나타나야 합니다.

개별 데이터베이스의 성능 관리

풀에 있는 개별 데이터베이스의 부하가 지속적으로 높은 경우 풀 구성에 따라 풀의 리소스를 압도적으로 차지하고 다른 데이터베이스에 영향을 주는 경향이 있을 수 있습니다. 작업이 일정 시간 동안 계속되는 것으로 보이면 데이터베이스를 잠시 풀에서 밖으로 이동할 수 있습니다. 이를 통해 데이터베이스에 필요한 추가 리소스를 유지하고 다른 데이터베이스와 격리할 수 있습니다.

이 연습에서는 인기 있는 콘서트에 대한 티켓을 판매할 때 높은 부하를 경험하는 Contoso 콘서트 홀의 영향을 시뮬레이션합니다.

  1. PowerShell ISE에서 …\Demo-PerformanceMonitoringAndManagement.ps1 스크립트를 엽니다.

  2. $DemoScenario = 5, 단일 테넌트에 표준 부하와 높은 부하 생성(약 95 DTU) 을 설정합니다.

  3. $SingleTenantDatabaseName = contosoconcerthall 설정

  4. F5를 사용하여 스크립트를 실행합니다.

  5. Azure Portal에서 tenants1-dpt-<user> 서버의 데이터베이스 목록으로 이동합니다.

  6. contosoconcerthall 데이터베이스를 클릭합니다.

  7. contosoconcerthall이 나열된 풀을 클릭합니다. 탄력적 풀 섹션에서 풀을 찾습니다.

  8. 탄력적 풀 모니터링 차트를 검사하고 증가된 풀 eDTU 사용량을 확인합니다. 1~2분 후 더 높은 부하가 시작되어야 하며 곧 이어 풀이 100% 사용률에 도달하는 것을 확인해야 합니다.

  9. 지난 시간에 가장 많이 사용한 데이터베이스를 나타내는 Elastic Database 모니터링을 검사합니다. contosoconcerthall 데이터베이스는 곧 가장 많이 사용한 데이터베이스 5개 중 하나로 나타나야 합니다.

  10. Elastic Database 모니터링차트를 클릭하면 아무 데이터베이스나 모니터링할 수 있는 데이터베이스 리소스 사용률 페이지가 열립니다. 이 기능을 사용하여 contosoconcerthall 데이터베이스에 대한 화면을 격리할 수 있습니다.

  11. 데이터베이스 목록을 보려면 contosoconcerthall을 클릭합니다.

  12. 가격 책정 계층(DTU 조정)을 클릭하여 성능 구성 페이지를 엽니다. 여기에서 데이터베이스에 대한 독립 실행형 컴퓨팅 크기를 설정할 수 있습니다.

  13. 표준 탭을 클릭하여 표준 계층에서 규모 옵션을 엽니다.

  14. DTU 슬라이드를 오른쪽으로 밀어 100 DTU를 선택합니다. 이는 서비스 목표 S3에 해당합니다.

  15. 적용을 클릭하여 데이터베이스를 풀에서 밖으로 이동하고 표준 S3 데이터베이스로 만듭니다.

  16. 크기 조정이 완료되면 탄력적 풀과 데이터베이스 블레이드에서 contosoconcerthall 데이터베이스 및 Pool1에 대한 영향을 모니터링합니다.

비용을 줄이기 위해 contosoconcerthall 데이터베이스에 대해 높은 부하가 진정되면 지체 없이 풀로 반환해야 합니다. 이러한 상황이 일어나는 시기를 확실히 모르는 경우 DTU 사용량이 풀의 데이터베이스별 최댓값보다 낮게 떨어질 때 트리거되는 데이터베이스에 대한 경고를 설정할 수 있습니다. 풀로 데이터베이스 이동은 연습 5에서 설명합니다.

기타 성능 관리 패턴

선제적 크기 조정 위 연습에서는 찾는 데이터베이스가 어느 것인지 알고 있는 격리된 데이터베이스를 크기 조정하는 방법을 탐색했습니다. Contoso 콘서트 홀의 관리 부서에서 티켓 판매가 임박했음을 Wingtips에 알리면 데이터베이스가 선제적으로 풀에서 밖으로 이동될 수 있습니다. 그렇지 않으면 풀 또는 데이터베이스에 무슨 일이 일어나고 있는지 파악하라는 경고가 필요했을 가능성이 있습니다. 성능 저하에 대해 불평하는 풀에 있는 다른 테넌트에서 이에 관하여 알아보기를 원하지 않을 수 있습니다. 테넌트가 추가 리소스를 필요로 하는 기간을 예측할 수 있는 경우 Azure Automation Runbook을 설정하여 데이터베이스를 풀에서 밖으로 이동한 다음 정의된 일정에 다시 안으로 이동할 수 있습니다.

테넌트 셀프 서비스 크기 조정 크기 조정은 관리 API가 통해 쉽게 호출되는 작업이므로 테넌트 데이터베이스를 테넌트가 마주치는 애플리케이션으로 크기 조정하는 기능을 쉽게 만들어 SaaS 서비스의 기능으로 제공할 수 있습니다. 예를 들어 테넌트가 확장과 축소를 직접 관리하게 할 수 있으며, 이는 아마도 테넌트의 대금 청구에 직접 연결될 것입니다!

풀을 사용량 패턴에 맞게 일정에 따라 확장 및 축소

집계 테넌트 사용량이 예측 가능한 사용량 패턴을 따르는 경우 Azure Automation을 사용하여 풀을 일정에 따라 확장 및 축소할 수 있습니다. 예를 들어 리소스 요구 사항이 떨어지는 것으로 알고 있는 평일 오후 6시 후에 풀을 축소하고 오전 6시 전에 다시 확장할 수 있습니다.

다음 단계

이 자습서에서는 다음 방법에 대해 알아봅니다.

  • 제공된 부하 생성기를 실행하여 테넌트 데이터베이스에 대한 사용량 시뮬레이션
  • 부하 증가에 응답하여 테넌트 데이터베이스 모니터링
  • 증가된 데이터베이스 부하에 응답하여 탄력적 풀 강화
  • 데이터베이스 작업의 부하를 분산하도록 두 번째 탄력적 풀을 프로비전

단일 테넌트 복원 자습서

추가 리소스