영업: 1-800-867-1380

자습서: 하이브리드 IT에서 재해 복구를 위한 데이터베이스 미러링

업데이트 날짜: 2014년 4월

이 자습서에서는 하이브리드 IT 환경에서 종단 간 재해 복구를 위해 SQL Server 데이터베이스 미러링을 구현하는 방법을 보여 줍니다. 이 구성에서 주 데이터베이스 서버는 온-프레미스에서 실행되고 미러 데이터베이스 서버는 Azure에서 실행됩니다. 서버 인증서를 사용하는 경우 Azure와 온-프레미스 네트워크 간의 VPN 연결 없이도 이 시나리오를 구현할 수 있습니다. 또한 NAT 장치의 적절한 포트를 서버에 전달하면 주 데이터베이스 서버가 NAT 장치 뒤에서 온-프레미스로 실행될 수도 있습니다.

이 자습서에서는 Azure와 온-프레미스 데이터베이스 서버에서 하나의 SQL Server VM(가상 컴퓨터)을 사용하여 비동기 데이터베이스 미러링을 재해 복구 솔루션으로 배포합니다. 자습서의 마지막에서는 SQL Server 고가용성 솔루션이 다음 요소로 구성됩니다.

  • 미국 서부 데이터 센터에서 실행되는 하나의 가상 네트워크

  • 온-프레미스 네트워크에 배포되고 NAT 장치 뒤에서 실행되는 하나의 SQL Server 컴퓨터(SQLOnPrem)

  • 미국 서부 데이터 센터의 Azure에 배포된 하나의 SQL Server VM(SQLInCloud)

  • SQLOnPrem - 주 데이터베이스 서버

  • SQLInCloud - 미러 데이터베이스 서버

이 자습서는 각 단계의 세부 사항까지 설명하지 않고 위에 설명된 솔루션을 설정하는 데 필요한 단계를 보여 주기 위한 것입니다. 따라서 이 자습서는 GUI 구성 단계를 보여 주지 않고 PowerShell 및 T-SQL(Transact-SQL) 스크립팅을 사용하여 각 단계를 신속하게 안내합니다. 자습서에서는 다음과 같이 가정합니다.

  1. 주 데이터베이스 서버에 사용할 온-프레미스 컴퓨터에 Windows Server 2008 R2를 설치합니다.

  2. 인터넷에 컴퓨터를 연결하고 모든 업데이트를 설치합니다.

  3. 인터넷과 컴퓨터 연결을 끊고 VPN 장치와 동일한 서브넷에 컴퓨터를 연결합니다.

  4. 관리자 모드에서 Windows PowerShell 창을 엽니다.

  5. 컴퓨터 이름을 아직 변경하지 않은 경우 SQLOnPRem으로 변경합니다.

    $computerName = "SQLOnPrem"
    netdom renamecomputer $env:COMPUTERNAME /newname:$computerName /force /reboot
    

    이 명령을 실행하면 컴퓨터가 자동으로 다시 부팅됩니다.

  6. 컴퓨터가 다시 부팅되면 로컬 관리자로 다시 로그인하고 관리자 모드에서 Windows PowerShell 창을 엽니다.

  7. $installDir에 SQL Server 설치 파일이 들어 있는 디렉터리를 지정하고 컴퓨터에 SQL Server 2012와 SSMS(SQL Server Management Studio)를 설치합니다. 설치 중에 SSMS 기능을 지정하면 명령줄 도구와 PowerShell 공급자가 설치됩니다.

    $installDir = "<Directory of SQL Server Setup.exe>"
    
    cd $installDir
    .\Setup.exe `
        /q `
        /ACTION=Install `
        /FEATURES=SQL,SSMS `
        /INSTANCENAME=MSSQLSERVER `
        /SQLSYSADMINACCOUNTS="Administrator" `
        /IACCEPTSQLSERVERLICENSETERMS
    
  8. SQL Server의 원격 액세스를 위해 방화벽을 엽니다.

    netsh advfirewall firewall add rule `
        name='SQL Server (TCP-In)' `
        program='C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn\sqlservr.exe' `
        dir=in `
        action=allow `
        protocol=TCP
    
  9. 기본 인스턴스에서 TCP 프로토콜을 사용하도록 설정하고 SQL Server 서비스를 다시 시작합니다.

    [reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
    [reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.SqlWmiManagement")
    $wmi = new-object ("Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer") $env:COMPUTERNAME
    $wmi.ServerInstances['MSSQLSERVER'].ServerProtocols['Tcp'].IsEnabled = "True"
    $wmi.ServerInstances['MSSQLSERVER'].ServerProtocols['Tcp'].Alter()
    $svc = Get-Service -Name 'MSSQLSERVER'
    $timeout = New-Object System.TimeSpan -ArgumentList 0, 0, 30
    $svc.Stop(); 
    $svc.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Stopped,$timeout)
    $svc.Start(); 
    $svc.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Stopped,$timeout) 
    
  10. 현재 PowerShell 창을 종료합니다. 다음에 PowerShell 창을 열면 SQL Server 이진 경로가 PATH 환경 변수에 포함되므로 명령줄 도구와 SQL Server PowerShell 공급자를 사용하여 데이터베이스 미러링을 설정할 수 있습니다.

    Exit
    
  11. 온-프레미스 NAT 장치에 관리자로 로그인하고 포트 5022의 모든 인바운드 트래픽을 SQLOnPrem의 포트 5022로 전달하는 포트 전달 규칙을 추가합니다. NAT 장치 설정에 대한 자세한 내용은 해당 제조업체의 사용 설명서를 참조하십시오.

    NAT 장치의 포트 5022에 대해 포트 전달을 구성하면 데이터베이스 미러링 트래픽이 Azure VM에서 온-프레미스 데이터베이스 서버로 이동할 수 있습니다.

이제 온-프레미스 SQL Server 구성을 마쳤습니다. 다음에는 Azure에서 SQL Server VM을 구성합니다.

  1. 인터넷에 연결된 컴퓨터의 PowerShell 창에서 클라우드 IT 인프라를 만드는 데 사용할 일련의 변수를 정의합니다.

    $workingDir = "C:\workingDirectory\"
    $location = "West US"
    $affinityGroupName = "ContosoAG"
    $affinityGroupDescription = "Contoso SQL HADR Affinity Group"
    $affinityGroupLabel = "IaaS BI Affinity Group"
    $virtualNetworkName = "ContosoNET" 
    $localNetworkName = "ContosoNETLocal"
    $networkConfigPath = $workingDir + "NetworkConfig.xml"
    $storageAccountName = "<uniquestorageaccountname>"
    $storageAccountLabel = "Contoso SQL HADR Storage Account"
    $storageAccountContainer = "https://$storageAccountName.blob.core.windows.net/vhds/"
    $sqlImageName = (Get-AzureVMImage | where {$_.Label -like "SQL Server 2012 SP1 Enterprise*"} | sort PublishedDate -Descending)[0].ImageName
    $serviceName = "<uniqueservicename>"
    $sqlServerName = "SQLInCloud"
    $vmAdminUser = "AzureAdmin" 
    $vmAdminPassword = "Contoso!000"
    $subnetName = "Back"
    

    다음 사항에 유의하여 명령이 나중에 성공적으로 수행되도록 합니다.

    • $storageAccountName$serviceName 변수는 각각 인터넷에서 클라우드 저장소 계정과 클라우드 서버를 식별하는 데 사용되므로 고유해야 합니다. 또한 나중에 데이터베이스 미러링 세션을 구성할 때 $serviceName 값을 사용해야 합니다.

    • $affinityGroupName, $virtualNetworkName$subnetName 변수에 지정된 이름은 나중에 사용할 가상 네트워크 구성 문서에 구성되어 있습니다.

    • $sqlImageName은 SQL Server 2012 서비스 팩 1 엔터프라이즈 버전이 포함된 VM 이미지의 업데이트된 이름을 지정합니다.

  2. Azure 모듈을 가져오고 게시 설정 파일을 컴퓨터에 다운로드하고 다운로드한 게시 설정을 가져와서 PowerShell 세션을 Azure 구독에 연결합니다.

    Import-Module `
        "C:\Program Files (x86)\Microsoft SDKs\Azure\PowerShell\Azure\Azure.psd1"
    Get-AzurePublishSettingsFile
    Import-AzurePublishSettingsFile <publishsettingsfilepath> 
    

    Get-AzurePublishgSettingsFile 명령은 Azure를 통해 관리 인증서를 자동으로 생성하고 컴퓨터에 다운로드합니다. 브라우저가 자동으로 열리고 Azure 구독에 대한 Microsoft 계정 자격 증명을 입력하라는 메시지가 표시됩니다. 다운로드한 .publishsettings 파일에는 Azure 구독을 관리하는 데 필요한 모든 정보가 포함되어 있습니다. 이 파일을 로컬 디렉터리에 저장한 후 Import-AzurePublishSettingsFile 명령을 사용하여 가져옵니다.

    security보안 참고
    publishsettings 파일에는 Azure 구독 및 서비스를 관리하는 데 사용되는 자격 증명(인코딩되지 않음)이 포함되어 있습니다. 이 파일에 대한 최상의 보안 방법은 이 파일을 원본 디렉터리 외부(예: Libraries\Documents 폴더)에 임시로 저장한 다음 가져오기가 완료되면 삭제하는 것입니다. publishsettings 파일에 액세스할 수 있는 악의적인 사용자는 Azure 서비스를 편집하고 만들고 삭제할 수 있습니다.

  3. 선호도 그룹을 만듭니다.

    New-AzureAffinityGroup `
        -Name $affinityGroupName `
        -Location $location `
        -Description $affinityGroupDescription `
        -Label $affinityGroupLabel
    
  4. NetworkConfig.xml이라는 구성 파일을 가져와서 가상 네트워크를 만듭니다.

    Set-AzureVNetConfig `
        -ConfigurationPath $networkConfigPath
    

    구성 파일에는 다음과 같은 XML 문서가 들어 있습니다. 간단히 말해서 이 문서는 ContosoAG라는 선호도 그룹에 ContosoNET이라는 가상 네트워크를 지정하고 주소 공간 10.10.0.0/16을 가지고 있습니다. 서브넷 또는 10.1.1.0/24는 SQL Server VM을 배치할 위치입니다. $affinityGroupName, $virtualNetworkName$subnetName 변수를 이전에 변경한 경우 아래의 해당 이름도 변경해야 합니다.

    <NetworkConfiguration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/ServiceHosting/2011/07/NetworkConfiguration">
      <VirtualNetworkConfiguration>
        <Dns />
        <VirtualNetworkSites>
          <VirtualNetworkSite name="ContosoNET" AffinityGroup="ContosoAG">
            <AddressSpace>
              <AddressPrefix>10.10.0.0/16</AddressPrefix>
            </AddressSpace>
            <Subnets>
              <Subnet name="Back">
                <AddressPrefix>10.10.1.0/24</AddressPrefix>
              </Subnet>
            </Subnets>
          </VirtualNetworkSite>
        </VirtualNetworkSites>
      </VirtualNetworkConfiguration>
    </NetworkConfiguration>
    
  5. 만든 선호도 그룹과 연결된 저장소 계정을 만든 다음 해당 계정을 구독에 대한 현재 저장소 계정으로 설정합니다.

    New-AzureStorageAccount `
        -StorageAccountName $storageAccountName `
        -Label $storageAccountLabel `
        -AffinityGroup $affinityGroupName
    Set-AzureSubscription `
        -SubscriptionName (Get-AzureSubscription).SubscriptionName `
        -CurrentStorageAccount $storageAccountName
    
  6. 새 클라우드 서비스에 SQL Server VM을 만듭니다.

    New-AzureVMConfig `
        -Name $sqlServerName `
        -InstanceSize Large `
        -ImageName $sqlImageName `
        -MediaLocation "$storageAccountContainer$sqlServerName.vhd" `
        -DiskLabel "OS" | 
        Add-AzureProvisioningConfig `
            -Windows `
            -Password $vmAdminPassword `
            -AdminUserName $vmAdminUser `
            -DisableAutomaticUpdates ` |
            Set-AzureSubnet `
                -SubnetNames $subnetName |
                Add-AzureEndpoint `
                    -Name "SQL" `
                    -Protocol "tcp" `
                    -PublicPort 1433 `
                    -LocalPort 1433 | 
                    Add-AzureEndpoint `
                        -Name "SQL" `
                        -Protocol "mirroring" `
                        -PublicPort 5022 `
                        -LocalPort 5022 | 
                        New-AzureVM `
                            -ServiceName $serviceName `
                            –AffinityGroup $affinityGroupName `
                            -VNetName $virtualNetworkName
    

    이러한 일련의 파이프된 명령은 다음 작업을 수행합니다.

    • New-AzureVMConfig는 가상 컴퓨터 갤러리의 SQL Server 2012 서비스 팩 1 엔터프라이즈 버전 이미지를 사용하여 VM 구성을 만듭니다. 또한 운영 체제 디스크를 쓰기 캐싱이 아닌 읽기 캐싱 전용으로 설정합니다. 데이터베이스 파일을 VM에 연결하여 읽기 또는 쓰기 캐싱이 없도록 구성하는 별도의 데이터 디스크로 마이그레이션하는 것이 좋습니다. 그러나 온-프레미스 데이터베이스 서버는 데이터베이스 파일에 C 드라이브를 사용하므로 데이터베이스 파일을 이동하지 않게 됩니다. 따라서 Azure VM의 구성이 온-프레미스 서버와 동일할 수 있습니다.

    • Add-AzureProvisioningConfig는 독립 실행형 Windows 컴퓨터를 지정하고, 관리자 암호를 설정하고, 자동 업데이트를 사용하지 않도록 설정합니다.

    • Add-AzureEndpoint는 두 개의 액세스 끝점을 추가합니다. 포트 1433은 온-프레미스 클라이언트 응용 프로그램에서의 연결에 사용되고, 포트 5022는 인터넷을 통한 데이터베이스 미러링에 사용됩니다.

    • New-AzureVM은 새 클라우드 서비스를 만들고 새 클라우드 서비스에 새 Azure VM을 만듭니다.

  7. 새 VM이 완전히 프로비전될 때까지 기다린 다음 원격 데스크톱 파일을 작업 디렉터리에 다운로드하십시오. while 루프는 새 Azure VM을 사용할 준비가 될 때까지 계속해서 폴링합니다.

    $VMStatus = Get-AzureVM -name $sqlServerName
    
    While ($VMStatus.Status -ne "ReadyRole")
    {
        write-host "Waiting...Current Status = " $VMStatus.Status
        Start-Sleep -Seconds 15
        $VMStatus = Get-AzureVM -name $sqlServerName
    } 
    
    Get-AzureRemoteDesktopFile `
        -ServiceName $serviceName `
        -Name $sqlServerName `
        -LocalPath "$workingDir$sqlServerName.rdp"
    

이 섹션에서는 세 개의 서버 각각에서 기본 SQL Server 설치를 수정해야 합니다. 특히 TCP 프로토콜은 SQL Server VM에서 이미 사용할 수 있도록 설정되어 있습니다. 그러나 SQL Server의 원격 액세스를 위해서는 방화벽을 열어야 합니다.

이제 시작할 준비가 되었습니다. 특별히 언급된 경우를 제외하고는 세 개의 서버 모두에 대해 아래의 단계를 동일하게 수행하십시오.

  1. 원격 데스크톱 파일을 시작하여 VM에 연결합니다. VM을 만들 때 지정한 컴퓨터 관리자의 사용자 이름 AzureAdmin과 암호 Contoso!000을 사용합니다.

  2. SQL Server 설치가 자동화된 초기화 태스크 실행을 완료할 때까지 기다렸다가 계속 진행합니다.

  3. 관리자 모드에서 PowerShell 창을 엽니다.

  4. SQL Server의 원격 액세스를 위해 방화벽을 엽니다.

    netsh advfirewall firewall add rule name='SQL Server (TCP-In)' program='C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn\sqlservr.exe' dir=in action=allow protocol=TCP
    

두 개의 서버에서 데이터베이스 미러링을 구성할 준비가 되었습니다. 후속 단계를 위해 PowerShell 창을 열린 상태로 두십시오.

  1. SQLOnPrem의 PowerShell 창에서 SQLCMD.EXE를 실행하고 서버 인증서를 만들어 백업합니다.

    SQLCMD -S SQLOnPrem
    USE master;
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Strong_Password_#1>';
    GO
    
    CREATE CERTIFICATE SQLOnPrem_cert WITH SUBJECT = 'SQLOnPrem certificate';
    GO
    
    CREATE ENDPOINT Endpoint_Mirroring
       STATE = STARTED
       AS TCP (LISTENER_PORT=5022, LISTENER_IP = ALL) 
       FOR DATABASE_MIRRORING (AUTHENTICATION = CERTIFICATE SQLOnPrem_cert, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = ALL);
    GO
    
    BACKUP CERTIFICATE SQLOnPrem_cert TO FILE = 'SQLOnPrem_cert.cer';
    GO 
    
  2. SQLInCloud의 PowerShell 창에서 SQLCMD.EXE를 실행하고 서버 인증서를 만들어 백업합니다.

    SQLCMD -S SQLInCloud
    USE master;
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Strong_Password_#2>';
    GO
    
    CREATE CERTIFICATE SQLInCloud_cert WITH SUBJECT = 'SQLInCloud certificate for database mirroring';
    GO
    
    CREATE ENDPOINT Endpoint_Mirroring
       STATE = STARTED
       AS TCP (LISTENER_PORT=5022, LISTENER_IP = ALL) 
       FOR DATABASE_MIRRORING (AUTHENTICATION = CERTIFICATE SQLInCloud_cert, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = ALL);
    GO
    
    BACKUP CERTIFICATE SQLInCloud_cert TO FILE = 'SQLInCloud_cert.cer';
    GO
    
  3. 인증서가 기본 데이터 디렉터리 C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA에 저장됩니다. 각 서버에 다른 두 서버의 인증서가 포함되도록 두 서버의 동일한 디렉터리로 인증서를 복사합니다. 두 SQL Server VM은 서로 다른 두 가상 네트워크에 있고 쉽게 파일을 공유할 수 없기 때문에 VM 간에 파일을 복사하는 가장 쉬운 방법은 로컬 컴퓨터의 디스크 드라이브를 원격 데스크톱 세션에 연결하고 이 연결된 디스크 드라이브를 대상 또는 원본으로 하여 인증서를 복사하는 것입니다.

  4. SQLOnPrem에서 해당 인증서를 사용하여 SQLInCloud에 로그인 권한을 부여합니다.

    CREATE LOGIN DBMirroringLogin WITH PASSWORD = 'Sample_Login_Password!@#';
    GO
    
    CREATE USER DBMirroringLogin FOR LOGIN DBMirroringLogin;
    GO
    
    CREATE CERTIFICATE SQLInCloud_cert AUTHORIZATION DBMirroringLogin FROM FILE = 'SQLInCloud_cert.cer';
    GO
    
    GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [DBMirroringLogin];
    GO
     
    
    
  5. SQLInCloud에서 해당 인증서를 사용하여 SQLOnPrem에 로그인 권한을 부여합니다.

    CREATE LOGIN DBMirroringLogin WITH PASSWORD = 'Sample_Login_Password!@#';
    GO
    
    CREATE USER DBMirroringLogin FOR LOGIN DBMirroringLogin;
    GO
    
    CREATE CERTIFICATE SQLOnPrem_cert AUTHORIZATION DBMirroringLogin FROM FILE = 'SQLOnPrem_cert.cer'
    GO
    
    GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [DBMirroringLogin];
    GO
     
    
    
  6. SQLOnPrem에서 데이터베이스를 만들고 전체 백업과 로그 백업을 모두 만듭니다.

    CREATE database MyDB1
    GO
    
    BACKUP DATABASE MyDB1 TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\BACKUP\MyDB1.bak';
    GO
    
    BACKUP LOG MyDB1 TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\BACKUP\MyDB1.log';
    GO 
    
    
  7. 백업 파일을 SQLInCloudC:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\BACKUP 디렉터리에 복사합니다.

  8. SQLInCloud에서 WITH NORECOVERY 옵션으로 데이터베이스 백업을 복원하고 이를 미러링 파트너로 사용하도록 설정합니다.

    RESTORE DATABASE MyDB1 FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\BACKUP\MyDB1.bak' WITH NORECOVERY;
    GO
    
    RESTORE LOG MyDB1 FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\BACKUP\MyDB1.log' WITH NORECOVERY;
    GO
    
    ALTER DATABASE MyDB1 SET PARTNER = 'TCP://<NAT_PUBLIC_IP_ADDRESS>:5022';
    GO
     
    
    

    SQLOnPrem의 호스트 이름 대신 온-프레미스 NAT 장치의 공용 IP 주소를 제공해야 합니다. SQLInCloudSQLOnPrem에 직접 연결할 수 없으며 트래픽은 NAT 장치에서 SQLOnPrem으로 전달되어야 합니다. 이미 포트 5022의 온-프레미스 NAT 장치에 대해 포트 전달을 구성했으므로 ALTER DATABASE 명령이 성공해야 합니다.

  9. SQLOnPrem에서 SQLOnPrem을 미러링 파트너로 사용하도록 설정합니다.

    ALTER DATABASE MyDB1 SET PARTNER = 'TCP://<uniqueservicename>.cloudapp.net:5022';
    GO
    

    고유 클라우드 서비스 이름인 <uniqueservicename>.cloudapp.net은 SQLInCloud의 호스트 이름 대신 사용됩니다. 기본 데이터베이스 미러링 끝점인 포트 5022는 SQLInCloud를 만들 때 이미 열었습니다.

축하합니다. 하이브리드 IT 환경에서 인증서를 사용하여 데이터베이스 미러링을 성공적으로 설정했습니다. 서버에서는 다른 서버에 액세스할 때 인스턴스 이름 대신 클라우드 서비스 이름과 NAT 장치를 사용하므로 데이터베이스 미러링 모니터는 원격 서버의 인스턴스 이름에 연결하여 상태를 쿼리할 수 없습니다. 데이터베이스 미러링 모니터에서 데이터베이스 미러링 세션을 모니터링하려면 아래 지침을 따르십시오.

  1. SQLInCloud에서 SQL Server 인증을 사용하도록 설정합니다. 자세한 내용은 서버 인증 모드 변경을 참조하십시오.

  2. SQLInCloud에서 SQL Server 인증을 사용하는 sysadmin 사용자를 만듭니다. 자세한 내용은 로그인 만들기를 참조하십시오.

  3. SSMS의 SQLOnPrem에서 서버 이름으로 <uniqueservicename>.cloudapp.net을 사용하고 인증 모드로 SQL Server 인증을 사용하여 SQLInCloud에 연결합니다.

  4. 데이터베이스 엔진과 SQLInCloud 간에 설정된 연결에서 데이터베이스 미러링 모니터를 시작합니다. 자세한 내용은 데이터베이스 미러링 모니터 시작(SQL Server Management Studio)을 참조하십시오.

이 정보가 도움이 되었습니까?
(1500자 남음)
의견을 주셔서 감사합니다.
표시:
© 2014 Microsoft