동기 커밋으로 SQL Server AlwaysOn 가용성 그룹 구성


Microsoft SQL Server AlwaysOn 가용성 그룹(AG)을 사용하면 여러 SQL Server Enterprise 인스턴스에서 데이터베이스를 복제할 수 있습니다.

SQL Server 장애 조치 클러스터 인스턴스와 마찬가지로 AlwaysOn 가용성 그룹은 Windows Server 장애 조치 클러스터링(WSFC)을 사용하여 고가용성을 구현합니다. 하지만 두 기능은 다음과 같이 여러 가지로 다릅니다.

AlwaysOn 가용성 그룹 클러스터 인스턴스 장애 조치
장애 조치 범위 데이터베이스 그룹 인스턴스
스토리지 공유 안함 공유

두 가지를 서로 상세하게 비교한 내용은 장애 조치 클러스터 인스턴스 및 가용성 그룹 비교를 참조하세요.

AlwaysOn 가용성 그룹에서는 여러 가용성 모드를 지원합니다. 이 튜토리얼에서는 데이터베이스 하나 이상에 고가용성을 구현하기 위해 동기식 커밋 모드에서 AlwaysOn 가용성 그룹을 배포하는 방법을 설명합니다.

이 설정에서는 VM 인스턴스 3개를 만듭니다. VM 인스턴스 두 개(node-1node-2)가 WSFC 노드 역할을 하고 SQL Server를 실행합니다. 세 번째 VM 인스턴스(witness)는 장애 조치 시나리오에서 쿼럼을 확보하는 데 사용됩니다. VM 인스턴스 3개가 영역 3개에 배포되고 공통 서브넷을 공유합니다.

SQL Server AlwaysOn 가용성 그룹을 사용하면 예시 데이터베이스 bookshelf가 SQL Server 인스턴스 2개에 동기식으로 복제됩니다.

온프레미스 환경에서는 장애 조치가 발생한 경우 WSFC가 ARP 알림을 수행하여 네트워크 장비에 IP 주소 변경을 알리게 할 수 있습니다. 그러나 Google Cloud는 ARP 알림을 무시합니다. 따라서 다음 두 가지 옵션 중 하나를 구현해야 합니다.

아키텍처

아키텍처

이 문서에서는 Active Directory를 Google Cloud에 이미 배포했으며 SQL Server, Active Directory, Compute Engine에 대한 기본 지식이 있다고 가정합니다.

목표

비용

이 튜토리얼에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

가격 계산기를 사용하면 예상 사용량을 기준으로 예상 비용을 산출할 수 있습니다.

시작하기 전에

이 튜토리얼을 완료하려면 다음이 필요합니다.

  • 도메인 컨트롤러가 최소 하나 이상 있는 Active Directory 도메인 관리형 Microsoft AD를 사용하여 Active Directory 도메인을 만들 수 있습니다. 또는 Compute Engine에 커스텀 Active Directory 환경을 배포하고 DNS 쿼리를 도메인 컨트롤러에 전달하는 비공개 DNS 전달 영역을 설정할 수 있습니다.
  • 컴퓨터를 도메인에 조인할 수 있는 권한이 있고 RDP를 사용하여 로그인할 수 있는 Active Directory 사용자입니다. 관리형 Microsoft AD를 사용하는 경우 setupadmin 사용자를 사용할 수 있습니다.
  • Active Directory 도메인 컨트롤러에 연결된 Google Cloud 프로젝트 및 VPC
  • WSFC VM 인스턴스에 사용할 서브넷.

튜토리얼을 완료하려면 Google Cloud 프로젝트도 필요합니다.

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

이 튜토리얼을 마치면 만든 리소스를 삭제하여 비용이 계속 청구되지 않도록 할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

프로젝트 및 네트워크 준비

SQL Server AlwaysOn 가용성 그룹을 배포할 수 있도록 Google Cloud 프로젝트와 VPC를 준비하려면 다음을 수행합니다.

  1. Google Cloud 콘솔에서 Cloud Shell 활성화 Cloud Shell 활성화 버튼을 클릭하여 Cloud Shell을 엽니다.

    Google Cloud Console로 이동

  2. 다음 변수를 초기화합니다.

    VPC_NAME=VPC_NAME
    SUBNET_NAME=SUBNET_NAME
    

    각 항목의 의미는 다음과 같습니다.

    • VPC_NAME: VPC 이름
    • SUBNET_NAME: 서브넷 이름
  3. 기본 프로젝트 ID를 설정합니다.

    gcloud config set project PROJECT_ID
    

    PROJECT_ID를 Google Cloud 프로젝트의 ID로 바꿉니다.

  4. 기본 리전을 설정합니다.

    gcloud config set compute/region REGION
    

    REGION을 배포하려는 리전의 ID로 바꿉니다.

방화벽 규칙 만들기

클라이언트가 SQL Server에 연결할 수 있게 하고 WSFC 노드 간 통신을 허용하고 부하 분산기가 상태 확인을 수행하도록 사용 설정하려면 방화벽 규칙을 여러 개 만들어야 합니다. 이러한 방화벽 규칙을 간단하게 만들려면 네트워크 태그를 사용합니다.

  • WSFC 노드 2개는 wsfc-node 태그로 주석을 답니다.
  • 모든 서버(감시 포함)는 wsfc 태그로 주석을 답니다.

다음 네트워크 태그를 사용하는 방화벽 규칙을 만듭니다.

  1. 기존 Cloud Shell 세션으로 돌아갑니다.
  2. WSFC 노드의 방화벽 규칙을 만듭니다.

    SUBNET_CIDR=$(gcloud compute networks subnets describe $SUBNET_NAME --format=value\('ipCidrRange'\))
    
    gcloud compute firewall-rules create allow-all-between-wsfc-nodes \
      --direction=INGRESS \
      --action=allow \
      --rules=tcp,udp,icmp \
      --enable-logging \
      --source-tags=wsfc \
      --target-tags=wsfc \
      --network=$VPC_NAME \
      --priority 10000
    
    gcloud compute firewall-rules create allow-sql-to-wsfc-nodes \
      --direction=INGRESS \
      --action=allow \
      --rules=tcp:1433 \
      --enable-logging \
      --source-ranges=$SUBNET_CIDR \
      --target-tags=wsfc-node \
      --network=$VPC_NAME \
      --priority 10000
    
  3. Google Cloud 프로버의 IP 범위에서 상태 점검을 허용하는 방화벽 규칙을 만듭니다.

<pre class="devsite-click-to-copy">
gcloud compute firewall-rules create allow-health-check-to-wsfc-nodes \
  --direction=INGRESS \
  --action=allow \
  --rules=tcp \
  --source-ranges=130.211.0.0/22,35.191.0.0/16 \
  --target-tags=wsfc-node \
  --network=$VPC_NAME \
  --priority 10000
</pre>

VM 인스턴스 만들기

이제 장애 조치 클러스터에 VM 인스턴스 두 개를 배포합니다. 언제든지 이러한 VM 중 하나가 SQL Server 데이터베이스의 기본 복제본을 호스팅하고 다른 노드는 보조 복제본을 호스팅합니다. 두 VM 인스턴스는 다음 조건을 충족해야 합니다.

  • 내부 패스 스루 네트워크 부하 분산기에서 액세스할 수 있도록 같은 리전에 있어야 합니다(DNN에 적용되지 않음).
  • WSFC 및 SQL Server가 설치되어 있어야 합니다.
  • Compute Engine WSFC 지원이 사용 설정되어 있어야 합니다.

SQL Server 2022가 사전 설치된 SQL Server 프리미엄 이미지를 사용합니다.

동률 처리 기능을 제공하고 장애 조치 시나리오에 사용되는 쿼럼을 확보하려면 파일 공유 감시 역할을 하는 세 번째 VM을 배포합니다.

  1. 기존 Cloud Shell 세션으로 돌아갑니다.
  2. WSFC 노드의 특수 스크립트를 만듭니다. 이 스크립트는 필요한 Windows 기능을 설치하고 WSFC 및 SQL Server의 방화벽 규칙을 만듭니다.

    cat << "EOF" > specialize-node.ps1
    
    $ErrorActionPreference = "stop"
    
    # Install required Windows features
    Install-WindowsFeature Failover-Clustering -IncludeManagementTools
    Install-WindowsFeature RSAT-AD-PowerShell
    
    # Open firewall for WSFC
    netsh advfirewall firewall add rule name="Allow SQL Server health check" dir=in action=allow protocol=TCP localport=59997
    
    # Open firewall for SQL Server
    netsh advfirewall firewall add rule name="Allow SQL Server" dir=in action=allow protocol=TCP localport=1433
    
    # Open firewall for SQL Server replication
    netsh advfirewall firewall add rule name="Allow SQL Server replication" dir=in action=allow protocol=TCP localport=5022
    
    # Format data disk
    Get-Disk |
     Where partitionstyle -eq 'RAW' |
     Initialize-Disk -PartitionStyle MBR -PassThru |
     New-Partition -AssignDriveLetter -UseMaximumSize |
     Format-Volume -FileSystem NTFS -NewFileSystemLabel 'Data' -Confirm:$false
    
    # Create data and log folders for SQL Server
    md d:\Data
    md d:\Logs
    EOF
    
  3. VM 인스턴스를 만듭니다. WSFC 노드로 작동하는 두 VM에서 메타데이터 키 enable-wsfctrue로 설정하여 추가 데이터 디스크를 연결하고 Windows Server 장애 조치 클러스터링을 사용 설정합니다.

    REGION=$(gcloud config get-value compute/region)
    PD_SIZE=200
    MACHINE_TYPE=n2-standard-8
    
    gcloud compute instances create node-1 \
      --zone $REGION-a \
      --machine-type $MACHINE_TYPE \
      --subnet $SUBNET_NAME \
      --image-family sql-ent-2022-win-2022 \
      --image-project windows-sql-cloud \
      --tags wsfc,wsfc-node \
      --boot-disk-size 50 \
      --boot-disk-type pd-ssd \
      --boot-disk-device-name "node-1" \
      --create-disk=name=node-1-datadisk,size=$PD_SIZE,type=pd-ssd,auto-delete=no \
      --metadata enable-wsfc=true \
      --metadata-from-file=sysprep-specialize-script-ps1=specialize-node.ps1
    
    gcloud compute instances create node-2 \
      --zone $REGION-b \
      --machine-type $MACHINE_TYPE \
      --subnet $SUBNET_NAME \
      --image-family sql-ent-2022-win-2022 \
      --image-project windows-sql-cloud \
      --tags wsfc,wsfc-node \
      --boot-disk-size 50 \
      --boot-disk-type pd-ssd \
      --boot-disk-device-name "node-2" \
      --create-disk=name=node-2-datadisk,size=$PD_SIZE,type=pd-ssd,auto-delete=no \
      --metadata enable-wsfc=true \
      --metadata-from-file=sysprep-specialize-script-ps1=specialize-node.ps1
    
    gcloud compute instances create "witness" \
      --zone $REGION-c \
      --machine-type n2-standard-2 \
      --subnet $SUBNET_NAME \
      --image-family=windows-2022 \
      --image-project=windows-cloud \
      --tags wsfc \
      --boot-disk-size 50 \
      --boot-disk-type pd-ssd \
      --metadata sysprep-specialize-script-ps1="add-windowsfeature FS-FileServer"
    
  4. VM 인스턴스 3개를 Active Directory에 조인하려면 VM 인스턴스 3개마다 다음을 수행합니다.

    1. 직렬 포트 출력을 확인하여 VM의 초기화 프로세스를 모니터링합니다.

      gcloud compute instances tail-serial-port-output NAME
      

      NAME을 VM 인스턴스의 이름으로 바꿉니다.

      출력으로 Instance setup finished가 표시될 때까지 3분 정도 기다린 다음 Ctrl+C를 누릅니다. 이제 VM 인스턴스를 사용할 수 있습니다.

    2. VM 인스턴스에 대해 사용자 이름과 비밀번호를 만듭니다.

    3. 원격 데스크톱을 사용하여 VM에 연결하고 이전 단계에서 만든 사용자 이름과 비밀번호를 사용하여 로그인합니다.

    4. Start(시작) 버튼을 마우스 오른쪽 버튼으로 클릭하고(또는 Win+X 누름) Windows PowerShell(관리자)을 클릭합니다.

    5. 를 클릭하여 권한 승격 프롬프트를 확인합니다.

    6. 컴퓨터를 Active Directory 도메인에 연결하고 다시 시작합니다.

      Add-Computer -Domain DOMAIN -Restart
      

      DOMAIN을 Active Directory 도메인의 DNS 이름으로 바꿉니다.

      다시 시작이 완료될 때까지 1분 정도 기다립니다.

클러스터 IP 주소 예약

이제 VPC에서 고정 IP 주소 두 개를 예약합니다. IP 주소 하나는 WSFC 클러스터 IP 주소로 사용되고 다른 하나는 내부 부하 분산기에서 사용됩니다.

  1. 클러스터 IP로 사용할 고정 IP 주소를 예약합니다.

    gcloud compute addresses create wsfc-cluster \
      --subnet $SUBNET_NAME \
      --region $(gcloud config get-value compute/region) && \
    CLUSTER_ADDRESS=$(gcloud compute addresses describe wsfc-cluster \
        --region $(gcloud config get-value compute/region) \
        --format=value\(address\)) && \
    echo "Cluster IP: $CLUSTER_ADDRESS"
    

    IP 주소가 나중에 필요하므로 기록해 둡니다.

  2. 내부 부하 분산기에 또 다른 고정 IP를 예약하고 LOADBALANCER_ADDRESS라는 새 환경 변수에 주소를 캡처합니다.

    gcloud compute addresses create wsfc \
      --subnet $SUBNET_NAME \
      --region $(gcloud config get-value compute/region)
    
    LOADBALANCER_ADDRESS=$(gcloud compute addresses describe wsfc \
      --region $(gcloud config get-value compute/region) \
      --format=value\(address\)) && \
    echo "Load Balancer IP: $LOADBALANCER_ADDRESS"
    

    IP 주소가 나중에 필요하므로 기록해 둡니다.

이제 프로젝트와 VPC에서 WSFC 및 SQL Server를 배포할 수 있습니다.

장애 조치 클러스터 배포

이제 VM 인스턴스를 사용하여 WSFC 및 SQL Server를 배포합니다.

SQL Server 준비

SQL Server용 Active Directory에 새 사용자 계정을 만듭니다.

  1. 원격 데스크톱을 사용하여 node-1에 연결합니다. 도메인 사용자 계정으로 로그인합니다.
  2. Start(시작) 버튼을 마우스 오른쪽 버튼으로 클릭하고(또는 Win+X 누름) Windows PowerShell(관리자)을 클릭합니다.
  3. 를 클릭하여 권한 승격 프롬프트를 확인합니다.
  4. SQL 서버와 SQL 에이전트의 도메인 사용자 계정을 만들고 비밀번호를 할당합니다.

    $Credential = Get-Credential -UserName sql_server -Message 'Enter password'
    New-ADUser `
      -Name "sql_server" `
      -Description "SQL Admin account." `
      -AccountPassword $Credential.Password `
      -Enabled $true -PasswordNeverExpires $true
    

SQL Server를 구성하려면 node-1node-2 모두에서 다음 단계를 수행합니다.

  1. Start(시작) 버튼을 마우스 오른쪽 버튼으로 클릭하고(또는 Win+X 누름) Windows PowerShell(관리자)을 클릭합니다.

    호스트 이름과 일치하도록 SQL Server 인스턴스의 이름을 바꿉니다.

    $OLD_NAME = Invoke-Sqlcmd -Query "
      select @@SERVERNAME;
      GO" | ConvertTo-Csv | SELECT -Skip 2
    $OLD_NAME = $OLD_NAME.Replace('"', '')
    Invoke-Sqlcmd -Query "
      sp_dropserver '$OLD_NAME';
      GO
      sp_addserver '$env:computername', local;
      GO"
    Restart-Service -Name MSSQLSERVER
    
  2. SQL Server 구성 관리자를 엽니다.

  3. 탐색창에서 SQL Server 서비스를 선택합니다.

  4. 서비스 목록에서 SQL Server(MSSQLSERVER)를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택합니다.

  5. 다음으로 로그온에서 계정을 변경합니다.

    • 계정 이름: DOMAIN\sql_server. 여기서 DOMAIN은 Active Directory 도메인의 NetBIOS 이름입니다.
    • 비밀번호: 이전에 선택한 비밀번호를 입력합니다.
  6. 확인을 클릭합니다.

  7. SQL Server를 다시 시작하라는 메시지가 표시되면 를 선택합니다.

이제 SQL Server가 도메인 사용자 계정으로 실행됩니다.

파일 공유 만들기

VM 인스턴스가 SQL Server 백업을 저장하고 파일 공유 감시 역할을 할 수 있도록 witness에 파일 공유 두 개를 만듭니다.

  1. 원격 데스크톱을 사용하여 witness에 연결합니다. 도메인 사용자 계정으로 로그인합니다.
  2. Start(시작) 버튼을 마우스 오른쪽 버튼으로 클릭하고(또는 Win+X 누름) Windows PowerShell(관리자)을 클릭합니다.
  3. 를 클릭하여 권한 승격 프롬프트를 확인합니다.
  4. 파일 공유 감시를 만들고 자신과 WSFC 노드 두 개에 파일 공유에 대한 액세스 권한을 부여합니다.

    New-Item "C:\QWitness" –type directory
    
    icacls C:\QWitness\ /grant 'node-1$:(OI)(CI)(M)'
    icacls C:\QWitness\ /grant 'node-2$:(OI)(CI)(M)'
    
    New-SmbShare `
      -Name QWitness `
      -Path "C:\QWitness" `
      -Description "SQL File Share Witness" `
      -FullAccess $env:username,node-1$,node-2$
    
  5. 백업을 저장하고 SQL Server에 전체 액세스 권한을 부여하기 위해 다른 파일 공유를 생성합니다.

    New-Item "C:\Backup" –type directory
    New-SmbShare `
      -Name Backup `
      -Path "C:\Backup" `
      -Description "SQL Backup" `
      -FullAccess  $env:USERDOMAIN\sql_server
    

WSFC 배포

이제 장애 조치 클러스터를 만들 수 있습니다.

  1. node-1의 원격 데스크톱 세션으로 돌아갑니다.
  2. Start(시작) 버튼을 마우스 오른쪽 버튼으로 클릭하고(또는 Win+X 누름) Windows PowerShell(관리자)을 클릭합니다.
  3. 를 클릭하여 권한 승격 프롬프트를 확인합니다.
  4. 새 클러스터를 만듭니다.

    • 부하 분산기 구성
    New-Cluster `
      -Name sql-cluster `
      -Node node-1,node-2 `
      -NoStorage `
      -StaticAddress CLUSTER_ADDRESS
    

    CLUSTER_ADDRESS를 이전에 만든 클러스터 IP 주소로 바꿉니다.

    • DNN 구성
    New-Cluster `
      -Name sql-cluster `
      -Node node-1,node-2 `
      -NoStorage `
      -ManagementPointNetworkType Distributed
    
  5. witness의 PowerShell 세션으로 돌아가 클러스터의 가상 컴퓨터 객체에서 파일 공유에 액세스할 수 있는 권한을 부여합니다.

    icacls C:\QWitness\ /grant 'sql-cluster$:(OI)(CI)(M)'
    Grant-SmbShareAccess `
      -Name QWitness `
      -AccountName 'sql-cluster$' `
      -AccessRight Full `
      -Force
    
  6. node-1의 PowerShell 세션으로 돌아가 witness의 파일 공유를 클러스터 쿼럼으로 사용하도록 구성합니다.

    Set-ClusterQuorum -FileShareWitness \\witness\QWitness
    
  7. 클러스터가 성공적으로 생성되었는지 확인합니다.

    Test-Cluster
    

    다음과 같이 무시할 수 있는 경고가 표시될 수 있습니다.

    WARNING: System Configuration - Validate All Drivers Signed: The test reported some warnings..
    WARNING: Network - Validate Network Communication: The test reported some warnings..
    WARNING:
    Test Result:
    HadUnselectedTests, ClusterConditionallyApproved
    Testing has completed for the tests you selected. You should review the warnings in the Report.  A cluster solution is
    supported by Microsoft only if you run all cluster validation tests, and all tests succeed (with or without warnings).
    

    cluadmin.msc를 실행하여 장애 조치 클러스터 관리자 MMC 스냅인을 실행하여 클러스터 상태를 검토할 수도 있습니다.

  8. 관리형 AD를 사용할 경우 컴퓨터를 도메인에 조인할 수 있도록 WSFC에서 사용하는 컴퓨터 계정을 Cloud 서비스 도메인 조인 계정 그룹에 추가합니다.

    Add-ADGroupMember `
      -Identity "Cloud Service Domain Join Accounts" `
      -Members sql-cluster$
    
  9. 두 노드에서 AlwaysOn 가용성 그룹을 사용 설정합니다.

    Enable-SqlAlwaysOn -ServerInstance node-1 -Force
    Enable-SqlAlwaysOn -ServerInstance node-2 -Force
    

가용성 그룹 만들기

이제 샘플 데이터베이스 bookshelf를 만들어 bookshelf-ag라는 새 가용성 그룹에 포함하고 고가용성을 구성합니다.

데이터베이스 만들기

새 데이터베이스를 만듭니다. 이 튜토리얼에서는 데이터베이스에 데이터가 포함될 필요는 없습니다.

  1. node-1의 원격 데스크톱 세션으로 돌아갑니다.
  2. SQL Server 관리 스튜디오를 엽니다.
  3. 서버에 연결 대화상자에서 서버 이름이 NODE-1으로 설정되어 있는지 확인하고 연결을 선택합니다.
  4. 메뉴에서 File(파일) > New(새로 만들기) > Query with current connection(현재 연결로 쿼리)을 선택합니다.
  5. 다음 SQL 스크립트를 편집기에 붙여넣습니다.

    -- Create a sample database
    CREATE DATABASE bookshelf ON PRIMARY (
      NAME = 'bookshelf',
      FILENAME='d:\Data\bookshelf.mdf',
      SIZE = 256MB,
      MAXSIZE = UNLIMITED,
      FILEGROWTH = 256MB)
    LOG ON (
      NAME = 'bookshelf_log',
      FILENAME='d:\Logs\bookshelf.ldf',
      SIZE = 256MB,
      MAXSIZE = UNLIMITED,
      FILEGROWTH = 256MB)
    GO
    
    USE [bookshelf]
    SET ANSI_NULLS ON
    SET QUOTED_IDENTIFIER ON
    GO
    
    -- Create sample table
    CREATE TABLE [dbo].[Books] (
      [Id] [bigint] IDENTITY(1,1) NOT NULL,
      [Title] [nvarchar](max) NOT NULL,
      [Author] [nvarchar](max) NULL,
      [PublishedDate] [datetime] NULL,
      [ImageUrl] [nvarchar](max) NULL,
      [Description] [nvarchar](max) NULL,
      [CreatedById] [nvarchar](max) NULL,
      CONSTRAINT [PK_dbo.Books] PRIMARY KEY CLUSTERED ([Id] ASC) WITH (
        PAD_INDEX = OFF,
        STATISTICS_NORECOMPUTE = OFF,
        IGNORE_DUP_KEY = OFF,
        ALLOW_ROW_LOCKS = ON,
        ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    
    -- Create a backup
    EXEC dbo.sp_changedbowner @loginame = 'sa', @map = false;
      ALTER DATABASE [bookshelf] SET RECOVERY FULL;
      GO
      BACKUP DATABASE bookshelf to disk = '\\witness\Backup\bookshelf.bak' WITH INIT
    GO
    

    스크립트가 단일 테이블이 있는 새 데이터베이스를 만들고 witness에 초기 백업을 수행합니다.

  6. Execute(실행)를 선택하여 SQL 스크립트를 실행합니다.

고가용성 구성

  1. 객체 탐색기 창에서 AlwaysOn 고가용성을 마우스 오른쪽 버튼으로 클릭한 후 새 가용성 그룹 마법사를 선택합니다.
  2. 옵션 지정 페이지에서 가용성 그룹 이름을 bookshelf-ag로 설정한 후 다음을 선택합니다.
  3. 데이터베이스 선택 페이지에서 bookshelf 데이터베이스를 선택한 후 다음을 선택합니다.
  4. 복제본 지정 페이지에서 복제본 탭을 선택합니다.

    1. 복제본 추가를 선택합니다.
    2. 서버에 연결 대화상자에서 서버 이름 node-2를 입력하고 연결을 선택합니다.

      이제 가용성 복제본 목록에 SQL Server 인스턴스 node-1node-2가 포함됩니다.

    3. 두 인스턴스 모두에서 가용성 모드동기 커밋으로 설정합니다.

    4. 두 인스턴스 모두 자동 장애 조치사용 설정됨으로 설정합니다.

    5. 리스너 탭을 선택합니다**.

      1. 가용성 그룹 리스너 만들기를 선택합니다.
      2. 다음 설정을 입력합니다.

        • 리스너 DNS 이름: bookshelf.
        • 포트: 1433
        • 네트워크 모드: Static IP
      3. 추가를 선택하고 앞에서 만든 부하 분산기 IP 주소를 입력합니다. 그런 다음 확인을 선택합니다.

    6. 다음을 선택합니다.

  5. 데이터 동기화 선택 페이지에서 자동 시드를 선택합니다.

  6. 검증 페이지에서 모든 검사가 성공했는지 확인합니다.

  7. 요약 페이지에서 완료를 선택합니다.

  8. 결과 페이지에서 닫기를 선택합니다.

상태 확인 구성

마지막 단계로 내부 부하 분산기에서 사용할 수 있는 상태 확인 엔드포인트를 노출하도록 클러스터를 구성합니다.

  1. node-1의 PowerShell 세션으로 돌아갑니다.
  2. 부하 분산기의 IP 주소로 변수를 초기화합니다.

    $LoadBalancerIP = 'IP_ADDRESS'
    

    IP_ADDRESS를 이전에 예약한 wsfc 주소의 IP 주소로 바꿉니다.

  3. 장애 조치 클러스터가 상태 확인 서비스에 응답하도록 구성합니다.

    $SqlIpAddress = Get-ClusterResource |
      Where-Object {$_.ResourceType -eq "IP Address"} |
      Where-Object {$_.Name.StartsWith("bookshelf")}
    
    $SqlIpAddress | Set-ClusterParameter -Multiple @{
     'Address'= $LoadBalancerIP;
     'ProbePort'= 59997;
     'SubnetMask'='255.255.255.255';
     'Network'= (Get-ClusterNetwork).Name;
     'EnableDhcp'=0; }
    
  4. 클러스터 리소스를 다시 시작합니다.

    $SqlIpAddress | Stop-ClusterResource
    $SqlIpAddress | Start-ClusterResource
    

내부 부하 분산기 만들기

SQL Server 클라이언트에 단일 엔드포인트를 제공하려면 이제 내부 부하 분산기를 배포합니다. 이 부하 분산기는 트래픽을 WSFC의 활성 노드로 전달하는지 확인하는 상태 확인을 사용합니다.

  1. 기존 Cloud Shell 세션으로 돌아갑니다.
  2. 비관리형 인스턴스 그룹을 영역당 하나씩 두 개를 만들고 노드 두 개를 그룹에 추가합니다.

    REGION=$(gcloud config get-value compute/region)
    
    gcloud compute instance-groups unmanaged create wsfc-group-1 --zone $REGION-a
    gcloud compute instance-groups unmanaged add-instances wsfc-group-1 --zone $REGION-a \
      --instances node-1
    
    gcloud compute instance-groups unmanaged create wsfc-group-2 --zone $REGION-b
    gcloud compute instance-groups unmanaged add-instances wsfc-group-2 --zone $REGION-b \
      --instances node-2
    
  3. 부하 분산기가 활성 노드를 확인하는 데 사용할 수 있는 상태 확인기를 만듭니다.

    gcloud compute health-checks create tcp wsfc-healthcheck \
      --check-interval="2s" \
      --healthy-threshold=1 \
      --unhealthy-threshold=2 \
      --port=59997 \
      --timeout="1s"
    

    상태 확인은 이전에 가용성 그룹 리스너의 ProbePort로 구성한 포트인 59997 포트를 검색합니다.

  4. 백엔드 서비스를 만들고 인스턴스 그룹 두 개를 추가합니다.

    gcloud compute backend-services create wsfc-backend \
      --load-balancing-scheme internal \
      --region $(gcloud config get-value compute/region) \
      --health-checks wsfc-healthcheck \
      --protocol tcp
    
    gcloud compute backend-services add-backend wsfc-backend \
      --instance-group wsfc-group-1 \
      --instance-group-zone $REGION-a \
      --region $REGION
    
    gcloud compute backend-services add-backend wsfc-backend \
      --instance-group wsfc-group-2 \
      --instance-group-zone $REGION-b \
      --region $REGION
    
  5. 내부 부하 분산기를 만듭니다.

    gcloud compute forwarding-rules create wsfc-sql \
      --load-balancing-scheme internal \
      --address $LOADBALANCER_ADDRESS \
      --ports 1433 \
      --network $VPC_NAME \
      --subnet $SUBNET_NAME \
      --region $REGION \
      --backend-service wsfc-backend
    

이제 내부 부하 분산기와 DNS 이름 bookshelf를 사용하여 SQL Server 가용성 그룹 리스너에 연결할 수 있습니다.

단일 장애 조치 클러스터에서 여러 가용성 그룹을 만들려면 가용성 그룹별로 고유한 상태 확인이 가능한 개별 부하 분산기를 사용해야 합니다. 즉, 각 가용성 그룹에 대해 다음 항목이 필요합니다.

  1. 리스너 및 내부 부하 분산기에 사용할 예약된 내부 IP 주소(각 가용성 그룹당 하나)

  2. 이전 단계에서 예약된 자체 IP 주소가 있는 별도의 부하 분산기(각 가용성 그룹당 하나)

  3. 해당 프로브 포트에서 트래픽을 허용하기 위한 별도의 프로브 포트(각 가용성 그룹에 대해 59997, 59998 등) 및 방화벽 규칙

  4. 각 프로브 포트를 사용하는 가용성 그룹별 별도의 상태 확인 규칙

가용성 그룹의 DNN 리스너 구성

내부 부하 분산 구성과 마찬가지로 DNN 리스너는 SQL Server 클라이언트의 단일 엔드포인트 역할을 합니다.

  1. node-1의 PowerShell 세션으로 돌아갑니다.
  2. 다음 스크립트를 실행하여 DNN 리스너를 만듭니다.

      $Ag='bookshelf-ag'
      $Port='DNN_PORT'
      $Dns='DNN_NAME'
    
      # create the DNN resource with the port as the resource name
      Add-ClusterResource -Name $Port -ResourceType "Distributed Network Name" -Group $Ag
    
      # set the DNS name of the DNN resource
      Get-ClusterResource -Name $Port | Set-ClusterParameter -Name DnsName -Value $Dns
    
      # start the DNN resource
      Start-ClusterResource -Name $Port
    
      # add the Dependency from availability group resource to the DNN resource
      Set-ClusterResourceDependency -Resource $Ag -Dependency "[$Port]"
    
      #bounce the AG resource
      Stop-ClusterResource -Name $Ag
      Start-ClusterResource -Name $Ag
    

    DNN_PORT를 DNN 리스너 포트로 바꿉니다. DNN 리스너 포트는 고유한 포트로 구성되어야 합니다. 자세한 내용은 포트 고려사항을 참조하세요.

    DNN_NAME을 DNN 리스너 이름으로 바꿉니다.

  3. node-1node-2 모두에서 DNN 리스너 포트에 대한 방화벽 규칙을 만듭니다.

      netsh advfirewall firewall add rule name="Allow DNN listener" dir=in action=allow protocol=TCP localport=DNN_PORT
    

장애 조치 테스트

이제 장애 조치가 예상대로 작동하는지 테스트할 수 있습니다.

  1. witness의 PowerShell 세션으로 돌아갑니다.
  2. 다음 스크립트를 실행합니다.

    while ($True){
      $Conn = New-Object System.Data.SqlClient.SqlConnection
      $Conn.ConnectionString = "Server=LISTENER;Integrated Security=true;Initial Catalog=master"
      $Conn.Open()
    
      $Cmd = New-Object System.Data.SqlClient.SqlCommand
      $Cmd.Connection = $Conn
      $Cmd.CommandText = "SELECT @@SERVERNAME"
    
      $Adapter = New-Object System.Data.SqlClient.SqlDataAdapter $Cmd
      $Data = New-Object System.Data.DataSet
      $Adapter.Fill($Data) | Out-Null
      $Data.Tables[0] + (Get-Date -Format "MM/dd/yyyy HH:mm:ss")
    
      Start-Sleep -Seconds 2
    }
    

    LISTENER를 리스너 DNS 이름이나 DNN 리스너, 가용성 그룹의 포트로 바꿉니다.

    스크립트는 2초마다 가용성 그룹 리스너나 DNN 리스너를 사용하여 SQL Server에 연결하고 서버 이름을 쿼리합니다.

    스크립트가 실행되도록 둡니다.

  3. node-1의 원격 데스크톱 세션으로 돌아가서 장애 조치를 트리거합니다.

    1. SQL Server Management Studio에서 AlwaysOn 고가용성 > 가용성 그룹 > bookshelf-ag(기본)로 이동하고 노드를 마우스 오른쪽 버튼으로 클릭합니다.
    2. Failover(장애 조치)를 선택합니다.
    3. 새 기본 복제본 선택 페이지에서 node-2를 새 기본 복제본으로 선택했는지, 장애 조치 준비 열이 No data loss를 나타내는지 확인합니다. 다음을 선택합니다.
    4. Connect to replica(복제본에 연결) 페이지에서 Connect(연결)를 선택합니다.
    5. Connect to server(서버에 연결) 대화상자에서 서버 이름이 node-2인지 확인하고 Connect(연결)를 클릭합니다.
    6. 다음을 선택한 다음 마침을 선택합니다.
    7. Results(결과) 페이지에서 장애 조치가 성공했는지 확인합니다.
  4. witness의 PowerShell 세션으로 돌아갑니다.

  5. 실행 중인 스크립트의 출력을 관찰하고 장애 조치의 결과로 서버 이름이 node-1에서 node-2로 변경되는 것을 확인합니다.

  6. Ctrl+C를 눌러 스크립트를 중지합니다.

삭제

튜토리얼을 완료한 후에는 만든 리소스를 삭제하여 할당량 사용을 중지하고 요금이 청구되지 않도록 할 수 있습니다. 다음 섹션은 이러한 리소스를 삭제하거나 사용 중지하는 방법을 설명합니다.

프로젝트 삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.

프로젝트를 삭제하는 방법은 다음과 같습니다.

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

다음 단계