IBM Cloud Docs
클러스터 작성

클러스터 작성

이 절에서는 WSFC (Windows Server Failover Cluster) 및 가용성 그룹을 작성하는 데 필요한 빌드 태스크를 수행한다.

이 안내서에서는 다음 사항을 가정합니다.

  • Windows 2019및 SQL Server 2019를 실행하는 두 개 이상의 서버를 클러스터로 두십시오.
  • 외부 인터넷 액세스가 있는 기본 호스트를 사용하십시오.
  • 사용 중인 디렉토리를 배치했습니다.

장애 복구 클러스터링 기능 설치

  1. SQL 관리자 그룹 계정에서 사용자를 사용하여 첫 번째 SQL 서버로 RDP를 실행하고 PowerShell 세션을 연다.

  2. 이 그룹의 사용자가 원격 명령을 실행할 수 있도록 로컬 원격 관리 사용자 그룹에 SQL 관리 그룹을 추가한다.

  3. 가용성 그룹 트래픽에 이 포트가 사용될 때 인바운드 TCP 포트 5022를 서버에 허용합니다. 장애 조치 클러스터링 기능을 설치한 후 서버를 다시 시작하십시오.

    $domainnb = "<NB_Domain>"
    $group = $domainnb + "\SQLAdmins"
    Add-LocalGroupMember -Group "Remote Management Users" -Member $group
    New-NetFirewallRule -DisplayName 'SQL-AG-Inbound' -Profile Domain -Direction Inbound -Action Allow -Protocol TCP -LocalPort 5022
    Install-WindowsFeature –Name Failover-Clustering –IncludeManagementTools
    Restart-Computer -Force
    
  4. 두 번째 SQL 서버에 대해 반복한다.

WSFC를 작성하고 SQL을 항상 사용하도록 설정하기

  1. SQL 관리자 그룹 계정에서 사용자를 사용하여 첫 번째 SQL 서버로 RDP를 실행하고 PowerShell 세션을 연다.

  2. 클러스터 밸리데이션 테스트를 실행한다. 이 배치에 대해 정상이므로 "한 쌍의 네트워크 인터페이스" 경고를 무시하십시오.

  3. 오류가 없는 경우 두 개의 SQL 서버 <hostname1><hostname2>를 포함하는 wsfc01 의 이름을 가진 WSFC 클러스터를 작성하십시오. -ManagementPointNetworkType Distributed 옵션은 가상 서버의 노드 IP 주소를 사용하며 이는 인터페이스에서 보조 IP 주소 지정이 필요하지 않음을 의미합니다. 이 옵션은 분산 네트워크 이름 (DNN) 을 작성하여 적절한 클러스터된 자원으로 트래픽을 라우트합니다.

  4. 클러스터 쿼럼은 fs01, \\fs01\clusterwitness-wsfc01 에서 파일 공유를 사용하여 Node 및 Disk 과반수에 대해 구성됩니다.

    $sqldb01 = "<hostname1>"
    $sqldb02 = "<hostname2>"
    Test-Cluster -Node $sqldb01, $sqldb02
    New-Cluster -Name wsfc01 -Node $sqldb01, $sqldb02 -ManagementPointNetworkType Distributed
    Set-ClusterQuorum -NodeAndFileShareMajority \\fs01\clusterwitness-wsfc01
    Enable-SqlAlwaysOn -ServerInstance sqldb01, sqldb02 -Force
    

이 활동은 두 번째 노드에서 반복될 필요가 없습니다.

파일 공유 작성

복제할 데이터베이스를 보조 인스턴스에 백업하고 복원해야 합니다. 이 조작을 용이하게 하려면 파일 공유가 필요합니다. 기본 서버에서 디렉토리를 작성하고 이를 공유하여 기본 SQL 서버에서 데이터베이스 백업을 보유하고 2차 SQL 서버로 복원할 수 있다. 데이터베이스의 서비스 계정이 백업을 수행할 때 SQL 서비스 계정이 디렉토리 및 공유에 액세스할 수 있어야 합니다.

  1. 기본 호스트에서 PowerShell 세션을 연다.

    $domainnb = "<NB_Domain>"
    $user = $domainnb + "\sqlsvc"
    New-Item -Path "C:\" -Name "TempShare" -ItemType "directory"
    $ACL=Get-ACL -Path "C:\TempShare"
    $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($user,"FullControl","Allow")
    $ACL.SetAccessRule($AccessRule)
    $ACL | Set-Acl -Path "C:\TempShare"
    New-SmbShare -Name "TempShare" -Path "C:\TempShare" -FullAccess $user
    

엔드포인트 작성하기

  1. SQL 관리자 그룹 계정에서 사용자를 사용하여 첫 번째 SQL 서버로 RDP를 실행하고 PowerShell 세션을 연다.

  2. 항상 가용성 그룹에 참여하려면 서버 인스턴스에 자체 엔드포인트가 필요하며, 이 엔드포인트는 TCP 포트 5022를 사용하여 가용성 복제본을 호스트하는 서버 인스턴스 사이에서 트래픽을 전송하고 수신합니다.

  3. 다음 PowerShell 명령은 SQL 서버의 기본 SQL 인스턴스 (기본값) 에서 Hadr_endpoint 엔드포인트를 구성하는 데 사용되며, <hostname1>`` and <hostname2> 및 엔드포인트 간의 암호화를 사용합니다.

    $sqldb01 = "<hostname1>"
    $sqldb02 = "<hostname2>"
    $domainnb = "<NB_Domain>"
    $user = $domainnb + "\sqlsvc"
    $pathsqldb01 = "SQLSERVER:\SQL\" + $sqldb01 + "\DEFAULT"
    $pathsqldb01 = "SQLSERVER:\SQL\" + $sqldb02 + "\DEFAULT"
    $endpoint1 = New-SqlHadrEndpoint Hadr_endpoint -Port 5022 -Path $pathsqldb01 -Encryption Required -EncryptionAlgorithm Aes -Owner $user
    Set-SqlHadrEndpoint -InputObject $endpoint1 -State "Started"
    $endpoint2 = New-SqlHadrEndpoint Hadr_endpoint -Port 5022 -Path $pathsqldb02 -Encryption Required -EncryptionAlgorithm Aes -Owner $user
    Set-SqlHadrEndpoint -InputObject $endpoint2 -State "Started"
    

엔드포인트에서 사용하는 도메인 서비스에 대한 연결 권한을 부여하려면 다음 단계가 필요합니다. 이 단계가 완료되지 않으면 엔드포인트 포트가 시작되지 않고 netstat -a 목록에 표시되지 않습니다.

  1. 기본 복제본 호스트에서 SQL Server Management Studio (SSMS) 를 실행하고 1차 복제본에 연결하십시오.
  2. 보안을 펼치고 로그인을 마우스 오른쪽 단추로 누른 후 새 로그인을 선택하십시오.
  3. Search를 클릭하고 사용자 계정 \sqlserver\sqlsvc 를 입력한 다음 OK를 클릭한다.
  4. 작성된 로그인을 마우스 오른쪽 단추로 클릭하고 Properties를 선택한다.
  5. Securables를 클릭한 다음 Search를 클릭한다.
  6. 오브젝트 추가 대화 상자에서 특정 오브젝트를 선택하고 확인을 클릭하십시오.
  7. 오브젝트 선택 대화 상자에서 오브젝트 유형을 클릭하고 엔드포인트를 선택하십시오.
  8. 찾아보기를 클릭하여 오브젝트 이름을 선택하십시오.
  9. Hadr_endpoint를 선택하고 OK를 클릭한다.
  10. 하드r_엔드포인트에 대한 권한에서 이 오브젝트에 대한 연결 권한을 명시적으로 부여합니다.

테스트 데이터베이스 작성하기

가용성 그룹을 구성하려면 1차 노드에서 데이터베이스를 사용할 수 있어야 하고 2차 노드에서 이 데이터베이스의 사본을 사용할 수 있어야 합니다. 이 태스크는 테스트 데이터베이스를 작성한 후 파일 공유를 통해 백업 및 복원 조작을 사용하여 데이터베이스를 보조 노드에 복사합니다.

  1. SQL 관리자 그룹 계정에서 사용자를 사용하여 첫 번째 SQL 서버로 RDP를 실행하고 PowerShell 세션을 연다. 가용성 그룹에서 사용되는 데이터베이스의 경우 복구 모드를 Full 로 설정하는 것이 중요합니다.

    $sql = "
    CREATE DATABASE [TestDatabase]
     CONTAINMENT = NONE
     ON  PRIMARY
    ( NAME = N'TestDatabase', FILENAME = N'D:\MSSQL15.MSSQLSERVER\MSSQL\DATA\TestDatabase.mdf' , SIZE = 1048576KB , FILEGROWTH = 262144KB )
     LOG ON
    ( NAME = N'MyDatabase_log', FILENAME = N'E:\MSSQL15.MSSQLSERVER\MSSQL\Logs\TestDatabase_log.ldf' , SIZE = 524288KB , FILEGROWTH = 131072KB )
    GO
    
    USE [master]
    GO
    ALTER DATABASE [TestDatabase] SET RECOVERY FULL
    GO
    
    ALTER AUTHORIZATION ON DATABASE::[TestDatabase] TO [sa]
    GO "
    Invoke-SqlCmd -ServerInstance sqldb01 -Query $sql
    
  2. Prepare the secondary database by using the Backup-SqlDatabase and Restore-SqlDatabase commands to create a backup of the TestDatabase on <hostname1> on TempShare on <file_share_host>, the SQL server instance that hosts the primary replica. 2차 복제본을 호스트하는 <hostname2>로 백업을 복원하십시오. NoRecovery 복원 매개변수를 사용해야 합니다.

    $sqldb01 = "<hostname1>"
    $sqldb02 = "<hostname2>"
    $filesharehost = "<file_share_host>"
    $backupfiledata = "\\" + $filesharehost +"\TempShare\TestDatabase.bak"
    $backupfilelog = "\\" + $filesharehost +"\TempShare\TestDatabase.trn"
    Backup-SqlDatabase -Database "TestDatabase" -ServerInstance $sqldb01 -BackupFile $backupfiledata -CopyOnly
    Backup-SqlDatabase -Database "TestDatabase" -BackupFile $backupfilelog -ServerInstance $sqldb01 -BackupAction Log -CopyOnly
    Restore-SqlDatabase -Database "TestDatabase" -BackupFile $backupfiledata -ServerInstance $sqldb02 -NoRecovery  
    Restore-SqlDatabase -Database "TestDatabase" -BackupFile $backupfilelog -ServerInstance $sqldb02 -RestoreAction Log -NoRecovery
    

새 2차 데이터베이스가 다시 시작 중 상태입니다. 가용성 그룹에 결합될 때까지 액세스할 수 없습니다.

가용성 그룹 작성

가용성 그룹에 추가된 데이터베이스는 가용성 데이터베이스로 알려져 있습니다. 데이터베이스를 추가할 때 데이터베이스는 온라인, 읽기-쓰기 데이터베이스이어야 하며 WSFC의 1차 복제본을 호스트하는 서버 인스턴스에 존재해야 합니다. 추가될 경우, 데이터베이스는 가용성 그룹을 기본 데이터베이스로 결합하며 클라이언트에 사용 가능한 상태로 남아 있습니다. 1차 데이터베이스의 백업이 2차 복제본이 될 서버 인스턴스로 복원될 때까지 보조 데이터베이스가 존재하지 않습니다. 새 2차 데이터베이스는 가용성 그룹에 결합될 때까지 RESTORING 상태에 있다. 백업 및 복원 방법이 사용되지 않는 경우 항상 사용 가능한 2차 복제본을 초기화하려면 자동 시딩 사용 을 참조하십시오.

  1. SQL 관리자 그룹 계정에서 사용자를 사용하여 첫 번째 SQL 서버로 RDP를 실행하고 PowerShell 세션을 연다.

  2. 경로 오류가 발생하지 않도록 하려면 Invoke-SQLCmd 을 사용하여 SQL PowerShell 라이브러리의 로드를 강제 실행하십시오. 그러면 PowerShell 드라이브 트리를 통해 액세스할 수 있습니다. PowerShell은 SQL Server 의 오브젝트를 디렉토리의 파일과 유사합니다. <hostname1> 를 SQL 서버의 호스트 이름으로 바꾸십시오.

    invoke-sqlcmd
    cd SQLSERVER:\SQL\<hostname1>
    
  3. 가용성 그룹을 작성하려면 -AsTemplate 매개변수를 사용하는 New-SqlAvailabilityReplica 명령을 사용하여 가용성 그룹에 포함될 두 가용성 복제본 각각에 대해 메모리 내 가용성-복제본 오브젝트를 작성합니다. 그런 다음, 가용성 그룹은 New-SqlAvailabilityGroup 명령을 사용하고 가용성-복제본 오브젝트를 참조하여 작성됩니다. AutomatedBackupPreference Primary 는 항상 1차 복제본에서 백업이 발생하도록 지정하는 데 사용되며 -FailureConditionLevel OnCriticalServerErrors 는 중요 서버 오류가 발생할 때 자동 장애 복구가 트리거되도록 지정합니다. 이 메소드에 기본 데이터베이스 사본의 백업 및 복원이 필요하지 않으므로 직접 seed를 사용 가능하게 하는 -SeedingMode Automatic 옵션을 사용할 수 있습니다. SQL 2019의 경우 버전 번호는 15입니다.

    기타 매개변수에 대한 설명은 New-SqlAvailabilityGroup 문서를 참조하십시오.

    $sqldb01 = "<hostname1>"
    $sqldb02 = "<hostname2>"
    $sqldb01fqdn = "<fqdn1>"
    $sqldb02fqdn = "<fqdn2>"
    $endpointurl1 "TCP://" + $sqldb01fqdn + ":5022"
    $endpointurl2 "TCP://" + $sqldb02fqdn + ":5022"
    $pathsqldb01 = "SQLSERVER:\SQL\" + $sqldb01 +" \DEFAULT"
    $primaryReplica = New-SqlAvailabilityReplica -Name $sqldb01 -EndpointURL $endpointurl1 -AvailabilityMode "SynchronousCommit" -FailoverMode "Automatic" -Version 15 -AsTemplate  
    $secondaryReplica = New-SqlAvailabilityReplica -Name $sqldb02 -EndpointURL $endpointurl2 -AvailabilityMode "SynchronousCommit" -FailoverMode "Automatic" -Version 15 -AsTemplate
    New-SqlAvailabilityGroup -Name "AG01" -Path $pathsqldb01 -AvailabilityReplica @($primaryReplica,$secondaryReplica) -Database "TestDatabase" -ClusterType WSFC -AutomatedBackupPreference Primary -FailureConditionLevel OnCriticalServerErrors
    
  4. 다음 명령을 사용하여 2차 복제본을 가용성 그룹에 결합하십시오. 결합은 보조 데이터베이스를 온라인 상태로 설정하고 해당 기본 데이터베이스와의 데이터 동기화를 시작합니다. 데이터 동기화는 기본 데이터베이스에 대한 변경사항을 보조 데이터베이스에서 재현하는 프로세스입니다. 데이터 동기화에는 트랜잭션 로그 레코드를 2차 데이터베이스에 송신하는 기본 데이터베이스가 포함됩니다.

    $sqldb02 = "<hostname2>"
    $pathsqldb02 = "SQLSERVER:\SQL\" + $sqldb02 + " \DEFAULT"
    Join-SqlAvailabilityGroup -Path $pathsqldb02 -Name "AG01" -ClusterType WSFC
    
  5. 각 보조 데이터베이스를 가용성 그룹에 결합하여 데이터 동기화를 시작하십시오.

    $sqldb02 = "<hostname2>"
    $agpathsqldb02 = "SQLSERVER:\SQL\" + $sqldb02 + " \DEFAULT\AvailabilityGroups\AG01"
    Add-SqlAvailabilityDatabase -Path $agpathsqldb02 -Database "TestDatabase"
    
  6. dir 명령을 사용하여 새 가용성 그룹의 컨텐츠 (예: dir SQLSERVER:\SQL\sqldb01\DEFAULT\AvailabilityGroups\AG01) 를 확인하십시오.

가용성 그룹 분배 네트워크 이름 작성

IBM Cloud VPC에서 SQL Server 를 사용하면 분산 네트워크 이름 (DNN) 이 적절한 클러스터된 자원으로 트래픽을 라우팅합니다. (DNN) 리스너는 가용성 그룹에서 사용할 때 기존의 VNN (Virtual Network Name) 가용성 그룹 리스너를 대체하고 클라우드 환경에서 배치를 단순화한다.

DNN 리스너는 고유 포트를 청취하도록 설계되었습니다. 리스너 이름에 대한 DNS 항목은 가용성 그룹에 있는 복제본의 모든 IP 주소로 해석된다. SQL Server 는 포트 1433에서 청취하므로 DNN 리스너에 포트 1433을 사용할 수 없습니다.

SQL Admins 그룹 계정에서 사용자를 사용하고 PowerShell 세션을 열고 다음 명령을 사용하는 첫 번째 SQL 서버에 대한 RDP. dnnlsnr-6789의 이름을 사용하여 DNN 자원을 작성하고, DNN 자원의 AD DNS 서버에서 DNS를 구성하고, DNN 자원을 시작하고, 가용성 그룹 자원에서 DNN 자원으로 종속성을 추가하고 마지막으로 가용성 그룹 자원을 재설정합니다.

$ag = "AG01"
$dns = "dnnlsnr"
$port = "6789"
Add-ClusterResource -Name $port -ResourceType "Distributed Network Name" -Group $ag
Get-ClusterResource -Name $port | Set-ClusterParameter -Name DnsName -Value $dns
Start-ClusterResource -Name $port
$Dep = Get-ClusterResourceDependency -Resource $ag
if ( $Dep.DependencyExpression -match '\s*\((.*)\)\s*' ) {$DepStr = "$($Matches.1) or [$port]"} else {$DepStr = "[$port]"}
Set-ClusterResourceDependency -Resource $ag -Dependency "$DepStr"
Stop-ClusterResource -Name $ag
Start-ClusterResource -Name $ag

다음 명령을 사용하여 Windows 방화벽을 통해 TCP 6789를 허용하십시오.

New-NetFirewallRule -DisplayName 'SQL-dnnlsnr-6789-Inbound' -Profile Domain -Direction Inbound -Action Allow -Protocol TCP -LocalPort 6789