내부 부하 분산기를 사용하여 동기 커밋으로 SQL Server AlwaysOn 가용성 그룹 구성


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

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

Always On 가용성 그룹 클러스터 인스턴스 장애 조치
장애 조치 범위 데이터베이스 그룹 인스턴스
스토리지 비공개 공유

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

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

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

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

온프레미스 Windows 클러스터 환경에서 주소 확인 프로토콜 (ARP) 알림IP 주소 장애 조치를 트리거합니다. 그러나Google Cloud는 ARP 공지사항을 무시합니다. 따라서 내부 부하 분산기와 분산 네트워크 이름 (DNN)을 사용하는 두 가지 옵션 중 하나를 구현해야 합니다.

이 문서에서는 Active Directory를 Google Cloud에 이미 배포했으며 SQL Server, Active Directory, Compute Engine에 대한 기본 지식이 있다고 가정합니다. Google Cloud의 Active Directory에 대한 자세한 내용은 시작하기 전에 섹션을 참고하세요.

SQL Server AlwaysOn 가용성 그룹을 사용하면 예시 데이터베이스 bookshelf가 두 SQL Server 인스턴스에 동기식으로 복제됩니다. 내부 부하 분산기는 트래픽이 활성 노드로 전달되도록 합니다.

내부 부하 분산기가 있는 Windows Server 장애 조치 클러스터링에 관한 자세한 내용은 장애 조치 클러스터링을 참고하세요.

아키텍처

이 다이어그램에는 다음이 포함됩니다.

  • 페일오버 클러스터(node-1node-2)의 동일한 리전 및 서로 다른 영역에 있는 VM 인스턴스 두 개 하나는 SQL Server 데이터베이스의 기본 복제본을 호스팅하고 다른 노드는 보조 복제본을 호스팅합니다.
  • witness라는 세 번째 VM은 동률 처리 기능을 제공하고 장애 조치에 필요한 쿼럼을 확보하기 위해 파일 공유 감시 역할을 합니다.
  • 클러스터 앞에 있는 내부 부하 분산기는 SQL Server 클라이언트에 단일 엔드포인트를 제공하고 상태 확인을 사용하여 트래픽이 활성 노드로 전달되도록 합니다.

목표

이 튜토리얼의 목표는 다음과 같습니다.

비용

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

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

시작하기 전에

이 튜토리얼의 태스크를 완료하려면 다음을 확인하세요.

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

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

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. 도메인 컨트롤러가 하나 이상 있는 Active Directory 도메인이 있습니다. 관리형 Microsoft AD를 사용하여 Active Directory 도메인을 만들 수 있습니다. 또는 Compute Engine에 커스텀 Active Directory 환경을 배포하고 DNS 쿼리를 도메인 컨트롤러에 전달하는 비공개 DNS 전달 영역을 설정할 수 있습니다.
  7. 컴퓨터를 도메인에 조인할 수 있는 권한이 있고 RDP를 사용하여 로그인할 수 있는 Active Directory 사용자가 있습니다. 관리형 Microsoft AD를 사용하는 경우 setupadmin 사용자를 사용할 수 있습니다. Active Directory 사용자 계정 프로비저닝에 관한 자세한 내용은 Active Directory 사용자 계정 프로비저닝을 참고하세요.
  8. Google Cloud 프로젝트 및 Active Directory 도메인 컨트롤러에 연결된 Virtual Private Cloud (VPC)
  9. Windows Server 장애 조치 클러스터 VM 인스턴스에 사용할 서브넷입니다.
이 튜토리얼을 마치면 만든 리소스를 삭제하여 비용이 계속 청구되지 않도록 할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

프로젝트 및 네트워크 준비

SQL Server AlwaysOn 가용성 그룹을 배포하려면 배포를 위해Google Cloud 프로젝트와 VPC를 준비해야 합니다. 다음 섹션에서는 이를 수행하는 방법을 자세히 설명합니다.

프로젝트 및 리전 구성

SQL Server AlwaysOn 가용성 그룹을 배포할 수 있도록 Google Cloud 프로젝트를 준비하려면 다음 단계를 따르세요.

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

    Google Cloud 콘솔로 이동합니다.

  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에 연결하고 클러스터 노드 간의 통신을 허용하려면 몇 가지 방화벽 규칙을 만들어야 합니다. 다음과 같이 네트워크 태그를 사용하여 이러한 방화벽 규칙을 간단하게 만들 수 있습니다.

  • 클러스터 노드 2개는 wsfc-node 태그로 주석 처리됩니다.
  • 모든 서버 (witness 포함)는 wsfc 태그로 주석 처리됩니다.

이러한 네트워크 태그를 사용하는 방화벽 규칙을 만들려면 다음 단계를 따르세요.

  1. 기존 Cloud Shell 세션으로 돌아갑니다.
  2. 클러스터 노드 간의 트래픽을 허용하는 방화벽 규칙을 만듭니다.

    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
    

VM 인스턴스 만들기

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

  • 내부 패스 스루 네트워크 부하 분산기에서 액세스할 수 있도록 동일한 리전에 있어야 합니다.
  • Windows Server 장애 조치 클러스터와 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 WSFC health check" dir=in action=allow protocol=TCP localport=59998
    
    # 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 인스턴스를 만듭니다. 클러스터 노드로 작동하는 두 VM에서 메타데이터 키 enable-wsfctrue로 설정하여 추가 데이터 디스크를 연결하고 Windows Server 장애 조치 클러스터링을 사용 설정합니다.

    REGION=$(gcloud config get-value compute/region)
    ZONE1=ZONE1
    ZONE2=ZONE2
    ZONE3=ZONE3
    PD_SIZE=200
    MACHINE_TYPE=n2-standard-8
    
    gcloud compute instances create node-1 \
      --zone $ZONE1 \
      --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 $ZONE2 \
      --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 $ZONE3 \
      --machine-type e2-medium \
      --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"
    

    사용 중인 영역을 기반으로 ZONE1, ZONE2, ZONE3을 바꿉니다.

  4. VM 인스턴스 3개를 Active Directory에 조인하려면 VM 인스턴스 3개마다 다음을 수행합니다.

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

      gcloud compute instances tail-serial-port-output NAME
      

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

      출력으로 Instance setup finished가 표시될 때까지 몇 분 정도 기다린 다음 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 이름으로 바꿉니다.

    7. VM을 도메인에 조인할 수 있는 권한이 있는 계정의 사용자 인증 정보를 입력합니다.

      VM이 다시 시작될 때까지 기다립니다. 이제 VM 인스턴스가 Active Directory에 가입되었습니다.

고정 IP 주소 예약

이제 VPC에서 고정 IP 주소 두 개를 예약합니다. IP 주소 하나는 기본 WSFC 클러스터 IP 주소로 사용되고 다른 하나는 SQL Server 가용성 그룹 리스너의 고정 IP로 사용됩니다.

WSFC 클러스터에서 클러스터 IP 주소는 주로 관리 목적과 클러스터 리소스에 액세스하는 데 사용됩니다. 이 가상 IP 주소는 클러스터 자체에 할당되므로 관리자가 클러스터를 관리하고 클러스터 설정 구성, 노드 상태 모니터링, 페일오버 프로세스 관리와 같은 작업을 실행할 수 있습니다.

SQL Server 가용성 그룹 컨텍스트에서 리스너는 가상 네트워크 이름 (VNN) 및 IP 주소로, 클라이언트가 기본 노드가 되는 특정 서버를 알 필요 없이 가용성 그룹에 연결할 수 있도록 합니다.

내부 부하 분산기는 내부 트래픽을 효율적으로 라우팅하고 WSFC 클러스터 컨텍스트에서 고가용성과 부하 분산을 지원하려면 내부 IP 주소가 필요합니다. 내부 부하 분산기를 사용하면 요청이 항상 클러스터의 현재 기본 복제본으로 전달됩니다. 장애 조치 이벤트 중에 로드 밸런서가 기본 복제본의 변경사항을 감지하고 수동 개입 없이 클라이언트 연결을 새 기본 노드로 리디렉션하여 다운타임을 최소화하고 데이터베이스 서비스의 지속적인 가용성을 보장합니다.

SQL Server AlwaysOn 가용성 그룹이 있는 WSFC의 컨텍스트에서 기본 WSFC 클러스터 IP 주소 및 가용성 그룹 리스너에 예약된 내부 고정 IP 주소는 모두 연결된 내부 부하 분산기에서도 사용됩니다.

  1. VPC에서 고정 IP 주소 두 개를 예약하려면 다음 단계를 따르세요.

    gcloud compute addresses create wsfc-cluster-ip \
      --subnet $SUBNET_NAME \
      --region $(gcloud config get-value compute/region) && \
    CLUSTER_IP=$(gcloud compute addresses describe wsfc-cluster-ip \
        --region $(gcloud config get-value compute/region) \
        --format=value\(address\)) && \
    echo "cluster IP: $CLUSTER_IP"
    
  2. CLUSTER_IP 변수에서 클러스터 IP 주소를 바꿉니다. 나중에 클러스터 IP로 지정할 때 필요합니다.

    CLUSTER_IP=CLUSTER_IP
    
  3. 가용성 그룹 리스너에 또 다른 고정 IP를 예약하고 LISTENER_IP라는 새 환경 변수에 주소를 캡처합니다.

    gcloud compute addresses create wsfc-listener-ip \
      --subnet $SUBNET_NAME \
      --region $(gcloud config get-value compute/region)
    
    LISTENER_IP=$(gcloud compute addresses describe wsfc-listener-ip \
      --region $(gcloud config get-value compute/region) \
      --format=value\(address\)) && \
    echo "Listener IP: $LISTENER_IP"
    
  4. 부하 분산기의 예약된 IP 주소를 LISTENER_IP 변수로 바꿉니다. 나중에 가용성 그룹을 구성할 때 필요합니다.

    LISTENER_IP=LISTENER_IP
    

이제 프로젝트와 VPC에서 Windows Server 장애 조치 클러스터와 SQL Server를 배포할 수 있습니다.

장애 조치 클러스터 배포

이제 VM 인스턴스를 사용하여 Windows Server 장애 조치 클러스터와 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. SQL Server 구성 관리자를 엽니다.
  2. 탐색창에서 SQL Server 서비스를 선택합니다.
  3. 서비스 목록에서 SQL Server(MSSQLSERVER)를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택합니다.
  4. 다음으로 로그온에서 다음과 같이 계정을 변경합니다.

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

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

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

파일 공유 만들기

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

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

    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
    

장애 조치 클러스터 만들기

페일오버 클러스터를 만들려면 다음 단계를 따르세요.

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

    New-Cluster `
      -Name sql-cluster `
      -Node node-1,node-2 `
      -NoStorage `
      -StaticAddress CLUSTER_IP
    

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

  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를 사용하는 경우 컴퓨터를 도메인에 조인할 수 있도록 Windows 클러스터에서 사용하는 컴퓨터 계정을 Cloud 서비스 도메인 조인 계정 그룹에 추가합니다.

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

    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 스크립트를 실행합니다.

고가용성 구성

이제 T-SQL 또는 SQL Server Management Studio를 사용하여 가용성 그룹의 고가용성을 구성할 수 있습니다.

T-SQL 사용

T-SQL을 사용하여 가용성 그룹의 고가용성을 구성하려면 다음 단계를 따르세요.

  1. node-1에 연결한 다음 다음 스크립트를 실행하여 bookshelf-ag 가용성 그룹을 만듭니다.

    CREATE LOGIN [NET_DOMAIN\sql_server] FROM WINDOWS;
    GO
    
    USE [bookshelf];
    CREATE USER [NET_DOMAIN\sql_server] FOR LOGIN [NET_DOMAIN\sql_server];
    GO
    
    USE [master];
    CREATE ENDPOINT bookshelf_endpoint
      STATE=STARTED
      AS TCP (LISTENER_PORT=5022)
      FOR DATABASE_MIRRORING (ROLE=ALL);
    GO
    
    GRANT CONNECT ON ENDPOINT::[bookshelf_endpoint] TO [NET_DOMAIN\sql_server]
    GO
    
  2. node-2에 연결하고 다음 스크립트를 실행합니다.

    CREATE LOGIN [NET_DOMAIN\sql_server] FROM WINDOWS;
    GO
    
    CREATE ENDPOINT bookshelf_endpoint
      STATE=STARTED
      AS TCP (LISTENER_PORT=5022)
      FOR DATABASE_MIRRORING (ROLE=ALL);
    GO
    
    GRANT CONNECT ON ENDPOINT::[bookshelf_endpoint] TO [NET_DOMAIN\sql_server]
    GO
    
  3. node-1에서 다음 스크립트를 실행하여 bookshelf-ag 가용성 그룹을 만듭니다.

    USE master;
    GO
    
    CREATE AVAILABILITY GROUP [bookshelf-ag]
    WITH (AUTOMATED_BACKUP_PREFERENCE = SECONDARY,
    CLUSTER_TYPE = WSFC,
    DB_FAILOVER = ON
    )
    FOR DATABASE [bookshelf]
    REPLICA ON
      N'node-1' WITH (
          ENDPOINT_URL = 'TCP://node-1:5022',
          AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
          FAILOVER_MODE = AUTOMATIC,
          BACKUP_PRIORITY = 50,
          SEEDING_MODE = AUTOMATIC,
          SECONDARY_ROLE(ALLOW_CONNECTIONS = NO)
      ),
      N'node-2' WITH (
          ENDPOINT_URL = 'TCP://node-2:5022',
          AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
          FAILOVER_MODE = AUTOMATIC,
          BACKUP_PRIORITY = 50,
          SEEDING_MODE = AUTOMATIC,
          SECONDARY_ROLE(ALLOW_CONNECTIONS = NO)
      );
    GO
    
  4. 다음 스크립트에서 LISTENER_IP를 앞에서 내부 부하 분산기에 예약한 IP 주소로 바꾸고 실행합니다.

    USE master;
    GO
    
    ALTER AVAILABILITY GROUP [bookshelf-ag]
    ADD LISTENER N'bookshelf' (
    WITH IP (
      (N'LISTENER_IP', N'255.255.255.0')
    ),
    PORT = 1433);
    GO
    
  5. node-2에 연결한 다음 다음 스크립트를 실행하여 보조 복제본을 가용성 그룹에 조인하고 자동 시드를 사용 설정합니다.

    USE master;
    GO
    
    ALTER AVAILABILITY GROUP [bookshelf-ag] JOIN;
    ALTER AVAILABILITY GROUP [bookshelf-ag] GRANT CREATE ANY DATABASE;
    
    
  6. 가용성 그룹의 상태를 확인합니다.

    SELECT * FROM sys.dm_hadr_availability_group_states;
    GO
    

    synchronization_health_descHEALTHY로 표시됩니다.

SQL Server Management Studio 사용

SQL Server Management Studio를 사용하여 가용성 그룹의 고가용성을 구성하려면 다음 단계를 따르세요.

  1. 객체 탐색기 창에서 상시 사용 고가용성을 마우스 오른쪽 버튼으로 클릭한 다음 새 가용성 그룹 마법사를 선택합니다.
  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 주소 (LISTENER_IP)를 입력합니다. 그런 다음 확인을 선택합니다.

    6. 다음을 선택합니다.

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

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

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

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

내부 부하 분산기 및 상태 점검 만들기

클러스터 IP는 Windows 장애 조치 클러스터의 단일 엔드포인트를 나타냅니다. 관리 목적과 클러스터 리소스 관리에 사용합니다. 클러스터 IP는 항상 클러스터의 호스트 (또는 기본) 노드를 가리킵니다. 트래픽이 클러스터의 호스트 노드로 전달되도록 하는 상태 확인을 사용하는 내부 부하 분산기를 배포합니다. WSFC 도구는 전달에 여러 프로토콜 (ICMP, UDP, TCP)을 사용할 수 있어야 하므로 모든 포트를 지원하는 여러 프로토콜이 있는 내부 부하 분산기를 배포하는 것이 좋습니다.

내부 부하 분산기를 배포하려면 다음 단계를 따르세요.

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

    REGION=$(gcloud config get-value compute/region)
    
    gcloud compute instance-groups unmanaged create wsfc-group-1 --zone $ZONE1
    gcloud compute instance-groups unmanaged add-instances wsfc-group-1 --zone $ZONE1 \
      --instances node-1
    
    gcloud compute instance-groups unmanaged create wsfc-group-2 --zone $ZONE2
    gcloud compute instance-groups unmanaged add-instances wsfc-group-2 --zone $ZONE2 \
      --instances node-2
    
  3. 부하 분산기가 Windows 클러스터 관점에서 활성 노드를 확인하는 데 사용할 수 있는 클러스터 IP의 상태 확인을 만듭니다. Compute Engine 게스트 에이전트가 상태 확인에 응답하는 기본 포트는 59998입니다. 상태 확인은 요청에 클러스터 IP 주소를 제공하며 활성 노드에서 반환된 응답으로 1을 예상합니다.

    gcloud compute health-checks create tcp wsfc-healthcheck \
      --request=$CLUSTER_IP \
      --response=1 \
      --check-interval="2s" \
      --healthy-threshold=2 \
      --unhealthy-threshold=2 \
      --port=59998 \
      --timeout="1s"
    
  4. 백엔드 서비스를 만들고 기존 인스턴스 그룹 2개를 추가합니다.

    gcloud compute backend-services create wsfc-backend \
      --load-balancing-scheme internal \
      --region $REGION \
      --health-checks wsfc-healthcheck \
      --protocol UNSPECIFIED
    
    gcloud compute backend-services add-backend wsfc-backend \
      --instance-group wsfc-group-1 \
      --instance-group-zone $ZONE1 \
      --region $REGION
    
    gcloud compute backend-services add-backend wsfc-backend \
      --instance-group wsfc-group-2 \
      --instance-group-zone $ZONE2 \
      --region $REGION
    
  5. 클러스터 IP와 연결된 내부 부하 분산기를 만듭니다.

    gcloud compute forwarding-rules create wsfc \
      --load-balancing-scheme internal \
      --address $CLUSTER_IP \
      --ports ALL \
      --network $VPC_NAME \
      --subnet $SUBNET_NAME \
      --region $REGION \
      --ip-protocol L3_DEFAULT \
      --backend-service wsfc-backend
    

bookshelf 가용성 그룹의 데이터베이스에 연결하려는 SQL Server 클라이언트에 단일 엔드포인트를 제공하려면 다음 단계에 따라 해당 가용성 그룹 전용의 새 내부 부하 분산기를 배포합니다.

  1. 부하 분산기가 bookshelf SQL Server 가용성 그룹에서 기본 노드를 확인하는 데 사용할 수 있는 가용성 그룹 리스너의 상태 확인기를 만듭니다.

    gcloud compute health-checks create tcp wsfc-bookshelf-healthcheck \
      --request=$LISTENER_IP \
      --response=1 \
      --check-interval="2s" \
      --healthy-threshold=1 \
      --unhealthy-threshold=2 \
      --port=59998 \
      --timeout="1s"
    

    상태 확인은 동일한 Compute Engine 게스트 에이전트 포트를 사용하지만 요청에 bookshelf 가용성 그룹의 리스너 IP 주소를 제공합니다.

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

    gcloud compute backend-services create wsfc-bookshelf-backend \
      --load-balancing-scheme internal \
      --region $REGION \
      --health-checks wsfc-bookshelf-healthcheck \
      --protocol UNSPECIFIED
    
    gcloud compute backend-services add-backend wsfc-bookshelf-backend \
      --instance-group wsfc-group-1 \
      --instance-group-zone $ZONE1 \
      --region $REGION
    
    gcloud compute backend-services add-backend wsfc-bookshelf-backend \
      --instance-group wsfc-group-2 \
      --instance-group-zone $ZONE2 \
      --region $REGION
    
  3. SQL Server bookshelf-ag 가용성 그룹 리스너와 연결된 내부 부하 분산기를 만듭니다.

    gcloud compute forwarding-rules create wsfc-bookshelf \
      --load-balancing-scheme internal \
      --address $LISTENER_IP \
      --ports ALL \
      --network $VPC_NAME \
      --subnet $SUBNET_NAME \
      --region $REGION \
      --ip-protocol L3_DEFAULT \
      --backend-service wsfc-bookshelf-backend
    

이제 보관함 가용성 그룹 리스너에 정의된 DNS 이름 bookshelf 및 포트를 사용하여 SQL Server 가용성 그룹 리스너에 연결할 수 있습니다. 내부 부하 분산기는 bookshelf 가용성 그룹의 기본 노드로 트래픽을 전달합니다.

단일 장애 조치 클러스터에서 여러 가용성 그룹을 만들려면 가용성 그룹별로 고유한 상태 확인이 가능한 별도의 백엔드 서비스와 별도의 부하 분산기를 사용해야 합니다.

각 가용성 그룹에는 기본으로 지정된 노드가 다를 수 있으며, Windows 클러스터의 호스트 노드와 다를 수도 있습니다. 가용성 그룹이 여러 개인 경우 다음이 필요합니다.

  • 내부 부하 분산기에서 사용하는 가용성 그룹 리스너의 예약된 고정 IP 주소입니다. 각 가용성 그룹에 주소를 하나씩 예약합니다.

  • 가용성 그룹별로 별도의 상태 확인 규칙 상태 확인 요청은 가용성 그룹 리스너의 고정 IP 주소(이전 단계에서 예약된 IP 주소이기도 함)를 제공합니다. 상태 점검은 GCE 에이전트가 반환한 응답 1를 프로브합니다. 모든 상태 점검은 포트 59998를 사용합니다.

  • 기존 컴퓨팅 인스턴스 그룹 2개를 추가하는 각 가용성 그룹에 대한 별도의 백엔드 서비스 백엔드 서비스는 이전 단계에서 정의된 상태 확인을 사용합니다.

  • 이전 단계에서 만든 백엔드 서비스의 각 가용성 그룹에 대한 내부 부하 분산기 부하 분산기는 가용성 그룹 리스너 고정 IP 주소와 연결됩니다.

장애 조치 테스트

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

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

    while ($True){
      $Conn = New-Object System.Data.SqlClient.SqlConnection
      $Conn.ConnectionString = "Server=tcp:bookshelf,1433;Integrated Security=true;Initial Catalog=master"
      $Conn.Open()
    
      $Cmd = New-Object System.Data.SqlClient.SqlCommand
      $Cmd.Connection = $Conn
      $Cmd.CommandText = "SELECT SERVERPROPERTY('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
    }
    

    이 가이드에서는 서버 정의 tcp:bookshelf,1433의 가용성 그룹 리스너에 DNS 이름 bookshelf 및 포트 값 1433을 사용했습니다.

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

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

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

    1. SQL Server Management Studio에서 상시 사용 고가용성 > 가용성 그룹 > 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.

다음 단계