부하 분산 IIS 웹 서버 배포


이 가이드는 Microsoft Active Directory, SQL Server, 인터넷 정보 서비스(IIS)를 포함하는 가용성이 높은 Windows 아키텍처를 배포하는 데 도움이 되는 시리즈 중 3부입니다. 이 가이드에서는 동일한 리전 내의 서로 다른 영역에서 실행되는 두 가지 IIS 웹 서버를 설정합니다. 그런 다음 웹 서버를 SQL Server 가용성 그룹 및 도메인 컨트롤러에 연결합니다. 부하 분산기 뒤에 웹 서버를 설정하면 개별 서버에 대한 부하를 줄일 수 있습니다. 또한 서버 중 하나가 오프라인 상태가 되어도 앱을 계속 실행할 수 있습니다.

이 시리즈는 다음 가이드로 구성됩니다.

Google Cloud 프로젝트에서 도메인 컨트롤러 및 SQL Server 인스턴스를 설정합니다. 이 배포의 각 구성요소는 도메인 컨트롤러에서 제공하는 Windows 인증과 안전하게 통합되도록 설계되었습니다.

이 가이드에서 설명하는 아키텍처는 Google Cloud에서 실행되도록 설계되었습니다. 하지만 Active Directory 및 SQL Server와 같은 일부 구성요소는 온프레미스에서 실행될 수 있습니다. 이 가이드에서는 Google Cloud에서 모든 구성요소를 실행하는 시나리오만 다룹니다.

목표

  • 두 영역을 포괄하는 두 개의 네트워크 서브넷을 만듭니다.
  • 각 영역에 Microsoft SQL Server 가상 머신(VM)을 배포합니다.
  • 각 SQL Server 인스턴스가 내 Active Directory 도메인에 참가하도록 구성합니다.
  • Windows Server 장애 조치 클러스터를 만듭니다.
  • SQL Server bookshelf 샘플 데이터베이스를 만들고 구성합니다.
  • SQL Server Always On 가용성 그룹을 설정합니다.

비용

이 가이드에서는 이전 가이드에서 구성한 Google Cloud 리소스를 계속 사용하며, 비용이 청구될 수 있는 다음과 같은 구성요소를 사용합니다.

가격 계산기는 하루 약 $4로 이 환경의 비용을 예상합니다.

시작하기 전에

이 튜토리얼에서 사용하는 구성에는 Windows 도메인 컨트롤러 및 작동 중인 Active Directory 도메인에 대한 액세스 권한이 있어야 합니다. 이 환경이 없는 경우 다음 튜토리얼의 단계를 완료하세요.

이 가이드에서 사용자는 Windows 워크스테이션에서 태스크를 수행합니다. 로컬 컴퓨터도 되며, IIS 웹 서버에 사용하는 VPC 네트워크 내부에 있지 않아도 됩니다. 워크스테이션에 다음이 설치되어 있는지 확인합니다.

공통 변수 초기화

이 시리즈의 1부에서는 인프라의 요소가 Google Cloud에 배포되는 위치를 제어하는 변수를 정의했습니다. 변수가 여전히 올바르게 설정되어 있고 이전에 설정한 값과 일치하는지 확인합니다.

  1. Cloud Shell을 엽니다.

    Cloud Shell 열기

  2. Cloud Shell에서 다음 환경 변수를 만들어 가이드의 후반부에 필요한 값을 설정합니다.

    명령어는 리전을 us-east1로 설정합니다. 이전 가이드에서 다른 리전을 사용한 경우 해당 리전과 일치하도록 이 스크립트의 지역을 변경합니다.

    region=us-east1
    zone_1=${region}-b
    zone_2=${region}-c
    vpc_name=webappnet
    project_id=your-project-id
    

    your-project-id를 사용 중인 Google Cloud 프로젝트 ID로 바꿉니다.

네트워크 인프라 만들기

이 섹션에서는 기존 Virtual Private Cloud(VPC) 네트워크에 서브네트워크를 추가합니다. (이전 가이드에서 VPC 네트워크를 만들었습니다.) 이러한 서브넷은 웹 서버 인스턴스에 할당되고 나중에 서브넷을 기반으로 선택적 방화벽 정책을 제공할 수 있는 고유 IP 주소 범위를 제공합니다.

  1. Cloud Shell에서 서브넷을 기존 VPC 네트워크에 추가합니다.

    gcloud compute networks subnets create public-webapp-zone \
        --network $vpc_name \
        --region $region \
        --range 10.5.0.0/24 \
        --project $project_id
    
  2. 내부 IP 주소 간의 트래픽을 허용하는 내부 방화벽 규칙을 만듭니다.

    gcloud compute firewall-rules create  allow-internal-ports-public-webapp \
        --network $vpc_name \
        --allow tcp:1-65535,udp:1-65535,icmp \
        --source-ranges 10.5.0.0/24 \
        --project $project_id
    

웹 서버 실행

Google Cloud Marketplace의 이미지를 사용하여 웹 서버를 프로비저닝합니다. 웹 서버를 프로비저닝한 후 이를 대상으로 사용하여 웹 앱을 배포할 수 있습니다.

첫 번째 서버 만들기

  1. Google Cloud Marketplace로 이동합니다.

    Google Cloud Marketplace로 이동

  2. Google Cloud 콘솔에서 웹 서버를 실행할 Google Cloud 프로젝트를 선택합니다. 이 가이드는 이전 설정을 기반으로 하므로 이전 가이드에서 사용한 프로젝트를 이 가이드에도 동일하게 사용합니다.

  3. 페이지에서 다음 값을 설정합니다.

    • 배포 이름: webserver1
    • 영역: zone_1
    • Windows Server OS 버전: 2016
    • 부팅 유형: SSD 영구 디스크
    • 디스크 크기: 200GB
    • 네트워크 이름: vpc_name
    • 서브네트워크 이름: public-webapp-zone
    • 방화벽: WebDeploy 트래픽 허용, HTTP 트래픽 허용

    zone_1vpc_name를 이전에 변수를 초기화할 때 사용한 값으로 바꿉니다.

  4. 배포를 클릭하고 Google Cloud Console에서 배포가 완료되었음을 표시할 때까지 기다립니다.

서버 인스턴스에 연결

  1. Cloud Shell에서 webserver1 인스턴스의 비밀번호를 만듭니다.

    gcloud compute reset-windows-password webserver1 \
        --zone $zone_1 \
        --project $project_id \
        --quiet
    
  2. 원격 데스크톱 프로토콜(RDP)을 사용하여 새 Windows 인스턴스에 연결합니다. 이전 단계에서 만든 사용자 인증 정보를 사용합니다.

서버 인스턴스 구성

  1. webserver1 인스턴스에서 관리자로 PowerShell 터미널을 엽니다.

  2. DNS IP 주소 및 도메인 이름에 대한 변수를 각각 설정합니다.

    $DNS1 = "10.1.0.100"
    $DNS2 = "10.2.0.100"
    $DomainName = "example-gcp.com"
    
  3. 나중에 웹 앱을 게시하는 데 사용할 webapp.service라는 로컬 서비스 계정을 만듭니다.

    net user webapp.service * /add
    

    메시지가 표시되면 비밀번호를 입력합니다. 안전한 비밀번호를 사용하고 나중에 사용할 수 있도록 안전한 위치에 보관합니다.

  4. 계정을 사용 설정하고 관리자 로컬 그룹에 추가합니다.

    net user webapp.service /active:yes
    net localgroup administrators webapp.service /add
    
  5. DNS 서버를 구성합니다.

    netsh interface ip set dns Ethernet static $DNS1
    netsh interface ip add dns Ethernet $DNS2 index=2
    
  6. 웹 서버를 example-gcp.com 도메인에 조인합니다.

    Add-Computer -DomainName $DomainName -Credential (Get-Credential "example\Administrator")
    

    메시지가 표시되면 관리자 계정의 비밀번호를 입력합니다. 이는 이 시리즈의 첫 번째 가이드에서 Active Directory 포레스트를 만들 때 사용한 도메인 계정입니다. 안전한 비밀번호를 사용하고 나중에 사용할 수 있도록 안전한 위치에 보관합니다.

    다음 오류 메시지는 무시해도 됩니다.

    WARNING: The changes will take effect after you restart the computer webserver1.
    
  7. VM을 재부팅합니다.

    Restart-Computer
    

    이렇게 하면 열었던 RDP 세션이 종료됩니다.

두 번째 서버 인스턴스 만들기 및 구성

이제 두 번째 서버 인스턴스를 만들려면 이전 절차를 반복합니다.

  1. 다음 값을 사용하여 서버 만들기 절차를 반복합니다.

    • 배포 이름: webserver2
    • 영역: zone_2
    • 머신 유형: vCPU 2개
    • Windows Server OS 버전: 2016
    • 부팅 유형: SSD 영구 디스크
    • 디스크 크기: 200GB
    • 네트워크 이름: vpc_name
    • 서브네트워크 이름: public-webapp-zone
    • 방화벽: WebDeploy 트래픽 허용, HTTP 트래픽 허용

    zone_2vpc_name를 이전에 변수를 초기화할 때 사용한 값으로 바꿉니다.

  2. webserver2 Windows 인스턴스의 비밀번호를 만듭니다.

    gcloud compute reset-windows-password webserver2 \
        --zone $zone_2\
        --project $project_id \
        --quiet
    

    이 단계에서는 RDP와의 연결을 위해 사용자 계정의 비밀번호를 설정합니다. 사용자 이름은 Google 계정 이름(즉, gcloud config get-value core/account 명령어가 반환하는 사용자 이름)입니다. 이 가이드의 뒷부분에서 사용할 수 있도록 사용자 이름과 비밀번호를 기록해 둡니다.

  3. RDP를 사용하여 인스턴스에 연결합니다. 이전 단계에서 만든 사용자 인증 정보를 사용합니다.

  4. webserver2 인스턴스에 연결합니다. 첫 번째 인스턴스에 사용한 단계를 따르되 두 번째 서버 인스턴스용으로 만든 비밀번호를 사용합니다.

  5. webserver2 인스턴스를 구성합니다. 첫 번째 인스턴스를 구성할 때 사용한 단계를 따릅니다. 동일한 비밀번호를 사용하여 동일한 서비스 계정을 만듭니다.

웹 앱 클론

다음 태스크는 각 IIS 서버를 구성하고 서버에 샘플 ASP.NET 앱을 배포하는 것입니다. 웹 앱에는 이전 가이드에서 구성한 SQL Server 인스턴스에 자동으로 연결하기 위한 사용자 인증 정보가 있습니다.

  1. Visual Studio 및 Git이 설치된 Windows 워크스테이션에 로그인되어 있는지 확인합니다.

  2. Windows 워크스테이션의 명령어 창에서 샘플 소스 코드 저장소를 워크스테이션에 클론합니다.

    cd c:\
    git clone https://github.com/GoogleCloudPlatform/getting-started-dotnet.git
    cd getting-started-dotnet
    git checkout ad49d787eec88fb30a4b45b4146f5cb63c0519e
    
  3. 다음 폴더로 이동합니다.

    C:\getting-started-dotnet\aspnet\2-structured-data
    
  4. Visual Studio에서 샘플 앱 솔루션을 열려면 2-structured-data.sln 파일을 더블클릭합니다.

  5. 솔루션 탐색기 창에서 Web.config 파일을 더블클릭하여 엽니다.

  6. GoogleCloudSamples:ProjectId 키를 프로젝트 ID로 설정합니다.

    프로젝트 ID webapp-sql-ad의 경우 줄은 다음과 유사합니다.

    <add key="GoogleCloudSamples:ProjectId" value="webapp-sql-ad" />
    
  7. GoogleCloudSamples:BookStore 값을 sqlserver로 설정합니다.

    <add key="GoogleCloudSamples:BookStore" value="sqlserver" />
    
  8. <connectionStrings> 아래의 파일 끝 부분에서 name="LocalSqlServer" 속성이 있는 connectionStrings XML 하위 요소를 찾습니다. 그런 후 다음 작업을 수행합니다.

    • SQL Server 가용성 그룹 리스너(sql-listener)의 이름으로 connectionString 값을 업데이트합니다. (이 가이드 시리즈의 멀티 서브넷 SQL Server 배포에서 이 리스너를 설정했습니다.)
    • Initial Catalogbookshelf로 변경합니다.
    • Integrated SecurityTrue로 설정합니다.
    • 데이터베이스를 설정할 때 데이터베이스 서비스 계정용으로 만든 사용자 이름과 로그인 비밀번호를 사용합니다.
  9. 저장하고 Web.config 파일을 닫습니다.

  10. 솔루션을 빌드하려면 Visual Studio 메뉴에서 Build(빌드) > Build Solution(솔루션 빌드)을 클릭합니다.

ASP.NET 앱 배포

이 섹션에서는 두 웹 서버 모두에 웹 앱을 배포합니다.

  1. 워크스테이션에서 2-structured-data.sln 파일을 닫은 경우 다시 엽니다. 다음 폴더에서 파일을 찾은 다음 더블클릭합니다.

    C:\getting-started-dotnet\aspnet\2-structured-data
    
  2. Visual Studio에서 Tools(도구) > Google Cloud Tools(Google Cloud 도구) >Google Cloud Explorer를 클릭합니다.

  3. 작업 중인 프로젝트를 선택한 다음 Google Compute Engine을 펼칩니다.

  4. webserver1 인스턴스를 마우스 오른쪽 버튼으로 클릭합니다.

  5. Manage Windows credentials(Windows 사용자 인증 정보 관리)를 선택합니다.

  6. Add credentials(사용자 인증 정보 추가)를 클릭합니다.

  7. 사용자 이름 webapp.service를 입력합니다.

  8. I have password for this user(이 사용자의 비밀번호가 있습니다)를 선택한 다음 이전에 웹 서버 실행 시 만든 비밀번호를 입력합니다.

  9. Create a password for me(자동으로 비밀번호 만들기)가 선택되어 있지 않은지 확인한 다음 Save(저장)를 클릭합니다.

  10. Close(닫기)를 클릭하여 Windows Credentials(Windows 사용자 인증 정보) 창을 닫습니다.

  11. Google Cloud Explorer를 닫습니다.

  12. Visual Studio에서 Tools(도구) > Google Cloud Tools(Google Cloud 도구) > Publish 2-structured-data to Google Cloud(2-structured-data를 Google Cloud에 게시)를 클릭합니다.

  13. Publish(게시) 대화상자에서 Compute Engine을 선택합니다.

  14. webserver1 VM을 선택한 다음 사용자 인증 정보webapp.service로 설정합니다.

  15. Publish(게시)를 클릭하여 샘플 앱을 빌드하고 배포합니다.

    샘플 앱이 게시된 후 Visual Studio가 기본 웹브라우저에서 앱을 엽니다.

  16. webserver2에 대해 이 절차를 반복합니다.

부하 분산 설정

이제 웹 서버에 네트워크 부하 분산을 설정할 수 있습니다. 이 절차의 일환으로 상태 확인을 부하 분산기에 추가합니다. 전역 부하 분산기는 자동으로 요청을 IIS 서버 간에 분산합니다. 또한 IIS 서버 중 하나가 상태 확인을 실패하고 오프라인인 경우 부하 분산기는 자동으로 트래픽을 다른 서버로 전달합니다.

  1. Cloud Shell에서 부하 분산기의 고정 외부 IP 주소를 만듭니다.

    gcloud compute addresses create webapp-lb-ip \
        --region $region \
        --project $project_id
    

    VM 인스턴스는 이 IP 주소로 전송되는 패킷을 수신합니다.

  2. HTTP 상태 확인 객체를 추가합니다.

    gcloud compute http-health-checks create bookshelf-check \
        --project $project_id \
        --request-path /Books
    

    이 예시에서는 상태 확인 메커니즘에 기본 설정을 사용하며, 이 설정은 맞춤설정할 수 있습니다. /Books 요청 경로는 샘플 웹 앱이 사용하는 경로이기 때문에 이를 지정합니다.

  3. VM 인스턴스와 동일한 리전에 있는 대상 풀을 추가합니다. 대상 풀은 작동하려면 상태 확인 서비스를 필요로 하며, 2단계에서 이 대상 풀용으로 만든 상태 확인 객체를 사용합니다.

    gcloud compute target-pools create books-lb \
        --region $region \
        --http-health-check bookshelf-check \
        --project $project_id
    
  4. IIS 서버 인스턴스를 대상 풀에 추가합니다.

    gcloud compute target-pools add-instances books-lb \
        --instances webserver1 \
        --instances-zone $zone_1 \
        --project $project_id
    
    gcloud compute target-pools add-instances books-lb \
        --instances webserver2 \
        --instances-zone $zone_2 \
        --project $project_id
    

    대상 풀 내의 인스턴스는 동일한 리전에 있어야 합니다. 하지만 IIS 서버 인스턴스는 동일한 리전의 다른 영역에 있을 수 있습니다.

  5. 대상 풀을 가리키는 외부 IP 주소 및 포트 범위를 대신하는 전달 규칙을 추가합니다.

    gcloud compute forwarding-rules create www-rule \
        --region $region \
        --ports 80 \
        --address webapp-lb-ip \
        --target-pool books-lb \
        --project $project_id
    

트래픽을 인스턴스로 전송

부하 분산 서비스가 구성되면 트래픽을 부하 분산기로 보낼 수 있습니다.

  1. 부하 분산을 설정한 후 구성이 완전히 로드될 수 있도록 1분 이상 기다립니다.
  2. Cloud Shell에서 부하 분산기 내 인스턴스의 상태를 확인합니다.

    gcloud compute target-pools get-health books-lb \
        --region $region \
        --project $project_id
    

    출력은 다음과 비슷합니다.

    ---
    healthStatus:
    - healthState: HEALTHY
    instance: https://www.googleapis.com/compute/v1/projects/sales-enablement-support/zones/us-east1-c/instances/webserver1
    ipAddress: 35.190.170.76
    kind: compute#targetPoolInstanceHealth
    ---
    healthStatus:
    - healthState: HEALTHY
    instance: https://www.googleapis.com/compute/v1/projects/sales-enablement-support/zones/us-east1-b/instances/webserver2
    ipAddress: 35.190.170.76
    
  3. 부하 분산기의 IP 주소인 ipAddress 값을 복사합니다.

  4. 브라우저 창에서 부하 분산기 IP 주소를 입력합니다.

    모두 올바르게 작동한다면 배포한 ASP.NET 웹 앱의 기본 페이지가 표시됩니다.

    Bookshelf 앱의 기본 웹페이지

부하 분산 및 중복 테스트

이제 구성요소가 오프라인으로 전환될 때 클러스터가 어떻게 작동하는지 확인할 수 있습니다. Active Directory, SQL Server, IIS 서버의 인스턴스를 선택적으로 종료하여 여러 수준에서 부하 분산과 중복을 테스트할 수 있습니다.

  1. Google Cloud Console에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. Active Directory, SQL Server 또는 IIS용 인스턴스를 선택합니다. 이러한 인스턴스를 선택하여 오프라인으로 전환되는 구성요소를 시뮬레이션할 수 있습니다.

    이 아키텍처용으로 생성된 이미지 목록

  3. 중지를 클릭합니다.

  4. 브라우저 창에서 부하 분산기 IP 주소를 다시 입력합니다.

    그러면 기본 Bookshelf 앱 페이지가 표시되며, 인프라의 구성요소를 더 이상 사용할 수 없더라도 앱이 계속 실행되고 있음을 나타냅니다.

  5. 원하는 경우 다른 구성요소에도 2~3단계를 반복합니다. 예를 들어 이전에는 SQL Server 인스턴스를 종료했다면 이번에는 IIS 인스턴스를 종료합니다.

    각 구성요소의 인스턴스 1개가 실행 중이면 앱은 계속 작동합니다.

삭제

튜토리얼을 완료한 후에는 이후에 요금이 청구되지 않도록 생성된 Google Cloud 리소스를 삭제할 수 있습니다. 전체 프로젝트를 삭제하거나 리소스를 삭제할 수 있습니다. 다음 섹션에서는 이러한 리소스를 삭제하는 방법을 설명합니다.

프로젝트 삭제

  • Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  • 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  • 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.
  • 프로젝트 내 리소스 삭제

    가이드의 시작 부분에서 인프라 요소가 배포되는 위치를 제어하는 변수를 정의했습니다. 이 섹션에서는 이러한 변수를 사용하여 리소스를 삭제합니다. 다음 변수가 설정되어 있는지 확인합니다.

    region=us-east1
    zone_1=${region}-b
    zone_2=${region}-c
    vpc_name=webappnet
    project_id=your-project-id
    

    your-project-id를 사용 중인 Google Cloud 프로젝트 ID로 바꿉니다.

    1. 이 가이드에서 만든 VM을 삭제합니다.

      gcloud compute instances delete ad-dc1 \
          --zone $zone_1 \
          --project $project_id \
          --quiet
      
      gcloud compute instances delete ad-dc2 \
          --zone $zone_2 \
          --project $project_id \
          --quiet
      
      gcloud compute instances delete cluster-sql1 \
          --zone $zone_1 \
          --project $project_id \
          --quiet
      
      gcloud compute instances delete cluster-sql2 \
          --zone $zone_2 \
          --project $project_id \
          --quiet
      
      gcloud compute instances delete webserver1 \
          --zone $zone_1 \
          --project $project_id \
          --quiet
      
      gcloud compute instances delete webserver2 \
          --zone $zone_2 \
          --project $project_id \
          --quiet
      
    2. 이 가이드에서 만든 방화벽 규칙과 경로를 삭제합니다.

      gcloud compute firewall-rules delete \
          allow-internal-ports-private-ad \
          allow-internal-ports-private-sql \
          allow-internal-ports-public-webapp \
          allow-rdp \
        --project $project_id \
        --quiet
      
      gcloud compute firewall-rules delete \
          webserver1-tcp-80 \
          webserver1-tcp-8172 \
          webserver2-tcp-80 \
          webserver2-tcp-8172 \
        --project $project_id \
        --quiet
      
      gcloud compute routes delete \
          cluster-sql1-route \
          cluster-sql1-route-listener \
          cluster-sql2-route \
          cluster-sql2-route-listener \
        --project $project_id \
        --quiet
      
    3. VPC 네트워크의 서브넷을 삭제합니다.

      gcloud compute networks subnets delete \
          --region $region \
          private-ad-zone-a \
          private-ad-zone-b \
          private-sql-zone-a \
          private-sql-zone-b \
          public-webapp-zone \
        --project $project_id \
        --quiet
      
    4. VPC 네트워크를 삭제합니다.

      gcloud compute networks delete $vpc_name \
          --project $project_id \
          --quiet
      
    5. 만든 부하 분산기 고정 IP 주소를 삭제합니다.

      gcloud compute addresses delete webapp-lb-ip \
          --region $region \
          --project $project_id \
          --quiet
      
    6. 부하 분산기 인프라를 삭제합니다.

      gcloud compute forwarding-rules delete www-rule \
          --region $region \
          --project $project_id \
          --quiet
      gcloud compute target-pools delete books-lb \
          --region $region \
          --project $project_id \
          --quiet
      gcloud compute http-health-checks delete bookshelf-check \
          --project $project_id \
          --quiet
      

    다음 단계