Share via


분할된 다중 테넌트 애플리케이션 배포 및 탐색합니다.

적용 대상:Azure SQL Database

이 자습서에서는 Wingtip Tickets라는 샘플 다중 테넌트 SaaS 애플리케이션을 배포하고 탐색합니다. 이 Wingtip Tickets 앱은 SaaS 시나리오 실행을 단순화하는 Azure SQL Database의 기능을 보여 주도록 설계되었습니다.

Wingtip Tickets 앱의 이 구현에서는 분할된 다중 테넌트 데이터베이스 패턴을 사용합니다. 분할은 테넌트 식별자에 의한 것입니다. 테넌트 데이터는 테넌트 식별자 값에 따라 특정 데이터베이스에 배포됩니다.

이 데이터베이스 패턴을 사용하면 각 분할된 데이터베이스 또는 데이터베이스에 하나 이상의 테넌트만 저장할 수 있습니다. 각 데이터베이스를 여러 테넌트에서 공유하여 가장 낮은 비용을 최적화할 수 있습니다. 또는 각 데이터베이스가 하나의 테넌트만 저장하게 하여 격리를 최적화할 수 있습니다. 각 특정 테넌트에 대해 독립적으로 최적화를 선택할 수 있습니다. 테넌트가 처음 저장될 때 선택하거나 나중에 마음을 바꿀 수 있습니다. 애플리케이션은 어느 쪽이든 잘 작동하도록 설계되었습니다.

앱 빠르게 배포

앱은 Azure 클라우드에서 실행되고 Azure SQL Database를 사용합니다. 다음 배포 섹션에서는 파란색 Azure에 배포 단추를 제공합니다. 단추를 누르면 앱이 5분 내에 Azure 구독에 완전히 배포됩니다. 개별 애플리케이션 구성 요소를 작업할 수 있는 전체 액세스 권한이 있습니다.

응용 프로그램 데이터는 3개의 샘플 테넌트에서 배포됩니다. 테넌트는 하나의 다중 테넌트 데이터베이스에 함께 저장됩니다.

누구나 GitHub 리포지토리에서 Wingtip Tickets에 대한 C# 및 PowerShell 소스 코드를 다운로드할 수 있습니다.

이 자습서에서 알아봅니다.

  • Wingtip 티켓 SaaS 애플리케이션 배포 방법
  • 애플리케이션 소스 코드 및 관리 스크립트를 가져올 위치.
  • 앱을 구성하는 서버 및 데이터베이스 정보.
  • 카탈로그를 사용하여 데이터에 테넌트를 매핑하는 방법
  • 새 테넌트를 프로비전하는 방법.
  • 앱에서 테넌트 활동을 모니터링하는 방법입니다.

이 초기 배포 시 생성되는 일련의 관련 자습서를 이용할 수 있습니다. 이 자습서에서는 다양한 SaaS 디자인 및 관리 패턴을 살펴봅니다. 자습서를 통해, 제공된 스크립트를 단계별로 거치며 다양한 SaaS 패턴을 구현하는 방법을 확인할 수 있습니다.

필수 조건

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

Wingtip Tickets 앱 배포

이름 계획

이 섹션의 단계에서는 리소스 이름이 전역적으로 고유하도록 하는 데 사용되는 사용자 값과 앱 배포에서 만든 모든 리소스를 포함하는 리소스 그룹의 이름을 제공합니다. 앤 핀리라는 가상인물에게 제안합니다.

  • 사용자:af1(이니셜에 숫자를 더합니다. 앱을 두 번째로 배포하는 경우 다른 값(예: af2)을 사용합니다.)
  • 리소스 그룹:wingtip-mt-af1(wingtip-mt는 분할된 다중 테넌트 앱임을 나타냅니다. 사용자 이름 af1을 추가하면 리소스 그룹 이름과 해당 그룹에 포함된 리소스 이름이 연결됩니다.)

이제 이름을 선택하고, 기록합니다.

단계

  1. 다음 파란색 Azure에 배포 단추를 클릭합니다.

    • Wingtip Tickets SaaS 배포 템플릿을 사용하여 Azure Portal을 엽니다.

      Button for Deploy to Azure.

  2. 배포에 필요한 매개 변수 값을 입력합니다.

    Important

    이 데모에서는 기존 리소스 그룹, 서버 또는 풀을 사용하지 마세요. 대신 새 리소스 그룹 만들기를 선택하세요. 관련된 결제를 중지하려면 애플리케이션을 완료할 때 이 리소스 그룹을 삭제합니다. 이 애플리케이션이나 여기에서 만든 리소스를 프로덕션에 사용하지 마세요. 인증의 일부 측면과 서버 방화벽 설정은 데모를 용이하게 하기 위해 앱에서 의도적으로 안전하지 않게 설정되어 있습니다.

    • 리소스 그룹 - 새로 만들기를 선택한 후 리소스 그룹의 이름을 입력합니다. (대/소분자 구분)
      • 드롭다운 목록에서 위치를 선택합니다.
    • 사용자의 경우 - 짧은 사용자 값을 선택하는 것이 좋습니다.
  3. 애플리케이션을 배포합니다.

    • 사용 약관에 동의하려면 클릭합니다.
    • 구매를 클릭합니다.
  4. 검색 상자 오른쪽의 벨 아이콘인 알림을 클릭하여 배포 상태를 모니터링합니다. Wingtip 앱을 배포하는 데 약 5분이 걸립니다.

    deployment succeeded

관리 스크립트 다운로드 및 차단 해제

애플리케이션이 배포되는 동안 응용 프로그램 소스 코드 및 관리 스크립트를 다운로드하세요.

참고 항목

외부 원본에서 zip 파일을 다운로드하고 추출할 때 Windows에서 실행 파일 내용(스크립트, DLLs)을 차단할 수 있습니다. Zip 파일에서 스크립트를 추출할 경우 아래 단계에 따라 추출하기 전에 .zip 파일을 차단 해제하세요. .zip 파일의 차단을 해제하면 스크립트를 실행할 수 있는지 확인합니다.

  1. WingtipTicketsSaaS-MultiTenantDb GitHub 리포지토리로 찾습니다.
  2. 복제 또는 다운로드를 클릭합니다.
  3. ZIP 다운로드를 클릭하고 파일을 저장하세요.
  4. WingtipTicketsSaaS-MultiTenantDb-master.zip 파일을 마우스 오른쪽 단추로 클릭한 다음 속성을 선택하세요.
  5. 일반 탭에서 차단 해제를 선택하고 적용을 클릭합니다.
  6. 확인을 클릭합니다.
  7. 파일을 추출합니다.

스크립트는 ..\WingtipTicketsSaaS-MultiTenantDb-master\Learning Modules\ 폴더에 있습니다.

배포에 대한 구성 파일 업데이트

스크립트를 실행하기 전에 UserConfig.psm1에서 리소스 그룹사용자 값을 업데이트하세요. 이러한 변수를 배포 중에 설정한 동일한 값으로 설정합니다.

  1. PowerShell ISE에서 ...\Learning Modules\UserConfig.psm1을 엽니다.
  2. ResourceGroupNameName을 배포에 대한 특정 값(줄 10 및 11에만 해당)으로 업데이트하세요.
  3. 변경 내용을 저장합니다.

이 파일에 설정된 값은 모든 스크립트에서 사용되므로 정확한 정보가 중요합니다. 앱을 다시 배포하는 경우 사용자 및 리소스 그룹에 대해 다른 값을 선택해야 합니다. 그런 다음 UserConfig.psm1 파일을 새 값으로 다시 업데이트합니다.

애플리케이션 실행

Wingtip 앱에서 테넌트는 장소입니다. 장소는 콘서트 홀, 스포츠 클럽 또는 이벤트를 개최하는 다른 위치일 수 있습니다. 장소는 고객으로 Wingtip에 등록하고 각 장소에 대해 테넌트 식별자가 생성됩니다. 각 장소는 Wingtip에 예정된 이벤트를 나열하므로 대중은 이벤트에 대한 티켓을 구입할 수 있습니다.

각 장소는 해당 이벤트를 나열하고 티켓을 판매하는 개인 설정된 웹앱을 얻게 됩니다. 각 웹앱은 독립적이며 다른 테넌트와 격리됩니다. 내부적으로 Azure SQL Database에서 각 테넌트의 각 데이터는 기본적으로 분할된 다중 테넌트 데이터베이스에 저장됩니다. 모든 데이터는 테넌트 식별자를 사용하여 태그가 지정됩니다.

중앙 이벤트 허브 웹페이지는 특정 배포에 있는 테넌트의 링크 목록을 제공합니다. 다음 단계를 사용하여 이벤트 허브 웹 페이지 및 개별 웹앱을 경험합니다.

  1. 웹 브라우저에서 이벤트 허브를 엽니다.

    • http://events.wingtip-mt.<user>.trafficmanager.net (<user>를 배포의 사용자 값으로 바꿉니다.)

      events hub

  2. 이벤트 허브에서 Fabrikam Jazz Club을 클릭하세요.

    Events

Azure Traffic Manager

들어오는 요청의 배포를 제어하기 위해 Wingtip 앱에서는 Azure Traffic Manager를 사용합니다. 각 테넌트에 대한 이벤트 페이지에는 해당 URL에 테넌트 이름이 포함됩니다. 각 URL에는 특정 사용자 값도 포함됩니다. 각 URL은 다음 단계를 사용하여 표시된 형식을 따릅니다.

  • http://events.wingtip-mt.<user>.trafficmanager.net/fabrikamjazzclub
  1. 이벤트 앱은 URL에서 테넌트 이름을 구문 분석합니다. 테넌트 이름은 앞의 예제 URL에서 fabrikamjazzclub 입니다.
  2. 이벤트 앱이 테넌트 이름을 해시하여 분할된 데이터베이스 맵 관리를 사용하는 카탈로그에 액세스하기 위한 키를 만듭니다.
  3. 앱은 카탈로그에서 키를 찾고 테넌트 데이터베이스의 해당 위치를 가져옵니다.
  4. 앱은 위치 정보를 사용하여 테넌트에 대한 모든 데이터를 포함하는 하나의 데이터베이스를 찾고 액세스합니다.

이벤트 허브

  1. 이벤트 허브는 카탈로그와 장소에 등록된 모든 테넌트를 나열합니다.
  2. 이벤트 허브는 URL을 구성하기 위해 카탈로그의 확장 메타데이터를 사용하여 각 매핑과 연결된 테넌트의 이름을 검색합니다.

프로덕션 환경에서는 일반적으로 CNAME DNS 레코드를 만들어 회사 인터넷 도메인이 트래픽 관리자 프로필을 가리키도록 합니다.

테넌트 데이터베이스에서 부하 생성 시작

이제 앱이 배포되었으므로 작동해 보도록 하겠습니다! Demo-LoadGenerator PowerShell 스크립트는 각 테넌트에 대해 실행 중인 워크로드를 시작합니다. 많은 SaaS 앱의 실제 로드는 일반적으로 산발적이며 예측할 수 없습니다. 이러한 유형의 로드를 시뮬레이션하기 위해 부하 생성기에서 모든 테넌트에 대해 분산된 부하를 생성합니다. 부하에는 임의 간격으로 발생하는 각 테넌트의 임의 버스트가 포함됩니다. 로드 패턴을 병합하는 데에는 몇 분이 소요되므로 부하를 모니터링하기 전에 생성기를 최소한 3~4분 실행하는 것이 가장 좋습니다.

  1. PowerShell ISE에서 ...\Learning Modules\Utilities\Demo-LoadGenerator.ps1 스크립트를 엽니다.
  2. F5 키를 눌러 스크립트를 실행하고 부하 생성기를 시작합니다(지금은 기본 매개 변수 값을 그대로 둡니다).

Demo-LoadGenerator.ps1 스크립트는 부하 생성기가 실행되는 다른 PowerShell 세션을 엽니다. 부하 생성기는 이 세션에서 각 테넌트에 대해 하나씩 백그라운드 부하 생성 작업을 호출하는 포그라운드 작업으로 실행됩니다.

포그라운드 작업이 시작되면 작업 호출 상태로 유지합니다. 이 작업은 이후에 프로비전되는 새 테넌트에 대한 추가 백그라운드 작업을 시작합니다.

PowerShell 세션을 닫으면 모든 작업이 중지됩니다.

다른 매개 변수 값을 사용하도록 부하 생성기 세션을 다시 시작할 수 있습니다. 이 경우 PowerShell 생성 세션을 닫은 다음 Demo-LoadGenerator.ps1을 다시 실행합니다.

분할된 데이터베이스에 새 테넌트 프로비전

초기 배포에는 Tenants1 데이터베이스에 세 개의 샘플 테넌트가 포함됩니다. 다른 테넌트 만들기 및 배포된 애플리케이션에 미치는 영향을 살펴보겠습니다. 이 단계에서는 하나의 키를 눌러 새 테넌트를 만듭니다.

  1. PowerShell ISE에서 ...\Learning Modules\Provision and Catalog\Demo-ProvisionTenants.ps1을 엽니다.

  2. F8이 아닌 F5 키를 눌러 스크립트를 실행합니다(지금은 기본값을 그대로 둡니다).

    참고 항목

    F5 키를 눌러서만 PowerShell 스크립트를 실행해야 하며, F8 키를 눌러서 스크립트의 선택한 부분을 실행하면 안 됩니다. F8 키의 문제는 $PSScriptRoot 변수가 평가되지 않는다는 것입니다. 이 변수는 폴더를 탐색하거나, 다른 스크립트를 호출하거나, 모듈을 가져오기 위해 많은 스크립트에서 필요합니다.

새로운 Red Maple Racing 테넌트가 Tenants1 데이터베이스에 추가되고 카탈로그에 등록됩니다. 새 테넌트의 티켓 판매 이벤트 사이트가 브라우저에 열립니다.

New tenant

이벤트 허브를 새로 고치고, 이제 목록에 새 테넌트가 나타납니다.

새로운 테넌트를 자체 데이터베이스에서 프로비전

분할된 다중 테넌트 모델을 사용하면 다른 테넌트가 포함된 데이터베이스로 새 테넌트를 프로비전할지 아니면 자체 데이터베이스로 새 테넌트를 프로비전할지 선택할 수 있습니다. 자체 데이터베이스에서 격리된 테넌트는 다음과 같은 이점을 활용할 수 있습니다.

  • 테넌트 데이터베이스의 성능은 다른 테넌트의 요구 사항과 타협할 필요 없이 관리할 수 있습니다.
  • 필요한 경우 다른 테넌트가 영향을 받지 않으므로 데이터베이스를 이전 시점으로 복원할 수 있습니다.

평가판 고객 또는 경제 고객을 다중 테넌트 데이터베이스에 배치하도록 선택할 수 있습니다. 각 프리미엄 테넌트는 자체 전용 데이터베이스에 넣을 수 있습니다. 테넌트가 하나만 포함된 많은 데이터베이스를 만드는 경우 모든 데이터베이스를 탄력적 풀에서 전체적으로 관리하여 리소스 비용을 최적화할 수 있습니다.

다음으로 이번에는 자체 데이터베이스에서 다른 테넌트를 프로비전합니다.

  1. ...\Learning Modules\Provision and Catalog\Demo-ProvisionTenants.ps1에서 $TenantNameSalix Salsa로 수정하고, $VenueTypedance로 수정하고, $Scenario2로 수정합니다.

  2. F5 키를 눌러 스크립트를 다시 실행합니다.

    • F5 키를 누르면 새 테넌트가 별도의 데이터베이스에 프로비전됩니다. 테넌트와 데이터베이스가 카탈로그에 등록됩니다. 그러면 브라우저가 테넌트의 이벤트 페이지로 열립니다.

    Salix Salsa events page

    • 페이지 아래쪽으로 스크롤합니다. 배너에 테넌트 데이터가 저장되는 데이터베이스 이름이 표시됩니다.
  3. 이벤트 허브를 새로 고치면 이제 목록에 두 개의 새 테넌트가 나타납니다.

서버 및 테넌트 데이터베이스 탐색

이제 배포된 리소스 중 일부를 살펴보겠습니다.

  1. Azure Portal에서 리소스 그룹 목록으로 이동합니다. 애플리케이션을 배포할 때 만든 리소스 그룹을 엽니다.

    resource group

  2. catalog-mt<user> 서버를 클릭합니다. 카탈로그 서버에는 tenantcatalogbasetenantdb라는 두 개의 데이터베이스가 포함되어 있습니다. basetenantdb 데이터베이스는 빈 템플릿 데이터베이스입니다. 여러 테넌트에 사용하든 하나의 테넌트에만 사용하든 새 테넌트 데이터베이스를 만들기 위해 복사됩니다.

    Screenshot of the server Overview page that shows tenant catalog and base tenant db databases.

  3. 리소스 그룹으로 돌아가서 테넌트 데이터베이스가 있는 tenants1-mt 서버를 선택합니다.

    • tenants1 데이터베이스는 원래 세 개의 테넌트 및 추가한 첫 번째 테넌트가 저장되는 다중 테넌트 데이터베이스입니다. 50 DTU 표준 데이터베이스로 구성됩니다.
    • salixsalsa 데이터베이스는 살릭스 살사 댄스 장소를 유일한 테넌트로 보유하고 있습니다. 기본적으로 DTU가 50개인 Standard Edition 데이터베이스로 구성됩니다.

    Screenshot of the tenants1-mt server Overview page that shows the salixsalsa and tenants1 databases.

데이터베이스의 성능 수준 모니터링

몇 분 동안 부하 생성기를 실행한 경우 Azure Portal에 기본 제공되는 데이터베이스 모니터링 기능을 확인할 정도의 충분한 원격 분석을 이용할 수 있습니다.

  1. tenants1-mt<user> 서버로 이동하고 tenants1을 클릭하여 네 개의 테넌트가 포함되어 있는 데이터베이스의 리소스 사용률을 확인합니다. 각 테넌트에는 부하 생성기에서 산발적으로 많은 부하가 발생합니다.

    monitor tenants1

    DTU 사용률 차트는 다중 테넌트 데이터베이스가 많은 테넌트에서 예측할 수 없는 워크로드를 어떻게 지원할 수 있는지 적절하게 설명합니다. 이 경우 부하 생성기는 각 테넌트에 약 30개의 DTU를 산발적으로 로드합니다. 이 부하는 50 DTU 데이터베이스의 60% 사용률과 같습니다. 60%를 초과하는 최대값은 부하가 동시에 둘 이상의 테넌트에 적용된 결과입니다.

  2. tenants1-mt<user> 서버로 이동하고 salixsalsa 데이터베이스를 클릭합니다. 테넌트가 하나만 포함된 이 데이터베이스에서 리소스 사용률을 확인할 수 있습니다.

    salixsalsa database

부하 생성기는 각 테넌트가 있는 데이터베이스에 상관없이 각 테넌트에 유사한 부하를 적용하고 있습니다. salixsalsa 데이터베이스에 하나의 테넌트만 있으면 데이터베이스가 여러 테넌트가 있는 데이터베이스보다 훨씬 더 높은 부하를 유지할 수 있음을 알 수 있습니다.

리소스 할당은 워크로드에 따라 다릅니다.

경우에 따라 다중 테넌트 데이터베이스에는 단일 테넌트 데이터베이스보다 성능이 좋은 리소스가 더 많이 필요하지만 항상 필요한 것은 아닙니다. 최적의 리소스 할당은 시스템의 테넌트에 대한 특정 워크로드 특성에 따라 달라집니다.

부하 생성기 스크립트에서 생성된 워크로드는 설명용으로만 사용됩니다.

추가 리소스

다음 단계

이 자습서에서는 다음에 대해 알아보았습니다.

  • Wingtip Tickets SaaS 다중 테넌트 데이터베이스 앱을 배포하는 방법
  • 앱을 구성하는 서버 및 데이터베이스 정보.
  • 카탈로그를 사용하여 데이터에 매핑된 테넌트
  • 새로운 단일 테넌트 및 다중 테넌트 데이터베이스에 새로운 테넌트를 프로비전하는 방법
  • 풀 사용률을 보고 테넌트 활동을 모니터링하는 방법입니다.
  • 샘플 리소스를 삭제하여 관련 결제를 중지하는 방법

이제 프로비전 및 카탈로그 자습서를 사용해 보세요.