匯出 (0) 列印
全部展開

教學課程:Azure 中因應災害復原的資料庫鏡像

更新日期: 2014年4月

本教學課程示範如何在兩個不同的 Azure 資料中心內使用 Azure VM 實作端對端 SQL Server 資料庫鏡像以利於災害復原。跨兩個 Azure 資料中心實作資料庫鏡像時,您必須使用伺服器憑證。由於目前 Azure 各資料中心間並無內部通訊,資料庫鏡像伺服器不得位於相同的 Active Directory 網域。您必須透過資料庫伺服器的公用雲端服務端點在其間建立通訊。

在本教學課程中,您將使用兩個 SQL Server 虛擬機器 (VM) 部署非同步資料庫鏡像做為災害復原方案。教學課程結束時,您的 SQL Server 高可用性方案將會包含下列項目:

  • 兩個虛擬網路,其中一個在美國西部資料中心中執行,另一個則在美國東部資料中心中執行

  • 一個 SQL Server VM (SQL1) 部署至美國西部資料中心的虛擬網路

  • 一個 SQL Server VM (SQL2) 部署至美國東部資料中心的虛擬網路

  • SQL1 是主體資料庫伺服器

  • SQL2 是鏡像資料庫伺服器

本教學課程用意為示範設定上述方案所需的步驟,但不會闡述每個步驟的細節。因此,本教學課程不會顯示 GUI 組態步驟,而是使用 PowerShell 和 Transact-SQL (T-SQL) 指令碼引導您快速進行每個步驟。指令碼會假設以下程序:

  1. 在您本機電腦的 PowerShell 視窗中,匯入 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 服務。

  2. 將您用來建立雲端 IT 基礎結構的一系列變數加以定義。

    $location1 = "West US"
    $location2 = "East US"
    $affinityGroupName1 = "ContosoWest"
    $affinityGroupName2 = "ContosoEast"
    $affinityGroupDescription = "Contoso SQL HADR Affinity Group"
    $affinityGroupLabel = "IaaS BI Affinity Group"
    $workingDir = "C:\scripts\"
    $networkConfigPath = $workingDir + "Network.netcfg"
    $virtualNetworkName1 = "Network1" 
    $virtualNetworkName2 = "Network2" 
    $storageAccountName1 = "<uniquestorageaccountname1>" 
    $storageAccountName2 = "<uniquestorageaccountname2>" 
    $storageAccountLabel = "Contoso SQL HADR Storage Account"
    $storageAccountContainer1 = "https://" + $storageAccountName1 + ".blob.core.windows.net/vhds/"
    $storageAccountContainer2 = "https://" + $storageAccountName2 + ".blob.core.windows.net/vhds/"
    $serviceName1 = "<uniqueservicename1>" 
    $serviceName2 = "<uniqueservicename2>" 
    $sqlImageName = (Get-AzureVMImage | where {$_.Label -like "SQL Server 2012 SP1 Enterprise*"} | sort PublishedDate -Descending)[0].ImageName
    $subnetName = "Back"
    $domainUser = "Administrator"
    $sql1ServerName = "SQL1"
    $sql2ServerName = "SQL2"
    $dataDiskSize = 100
    $vmAdminUser = "AzureAdmin" 
    $vmAdminPassword = "Contoso!000" 
    

    請注意下列事項,如此才可確保命令稍後不會失敗:

    • 變數 $storageAccountName1$storageAccountName2$serviceName1$serviceName2 都必須是唯一的,因為這些變數分別用於識別您在網際網路上的雲端儲存體帳戶和雲端服務。此外,當您之後設定資料庫鏡像工作階段時,您將必須使用 $serviceName1$serviceName2 的值。

    • 稍後您將使用虛擬網路組態文件進行設定,為變數 $affinityGroupName1$affinityGroupName2$virtualNetworkName1$virtualNetworkName2 指定名稱。

    • 為了簡化過程,本教學課程全程使用相同的密碼 Contoso!000

  3. 建立兩個同質群組,分別位於美國西部和美國東部。

    New-AzureAffinityGroup `
        -Name $affinityGroupName1 `
        -Location $location1 `
        -Description $affinityGroupDescription `
        -Label $affinityGroupLabel
    New-AzureAffinityGroup `
        -Name $affinityGroupName2 `
        -Location $location2 `
        -Description $affinityGroupDescription `
        -Label $affinityGroupLabel
    
  4. 透過匯入組態檔建立虛擬網路。

    Set-AzureVNetConfig `
        -ConfigurationPath $networkConfigPath
    

    此組態檔包含了下列 XML 文件。簡而言之,它將會在 ContosoWestContosoEast 這兩個同質群組內各指定一個虛擬網路,名稱分別為 Network1Network2Network1 的位址空間為 10.10.1.0/24,而 Network2 的位址空間為 10.10.2.0/24。如果您變更了上述代表同質群組名稱和虛擬網路名稱的變數,就必須連帶變更下列對應的名稱。

    <NetworkConfiguration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/ServiceHosting/2011/07/NetworkConfiguration">
      <VirtualNetworkConfiguration>
        <Dns />
        <VirtualNetworkSites>
          <VirtualNetworkSite name="Network1" AffinityGroup="ContosoWest">
            <AddressSpace>
              <AddressPrefix>10.10.1.0/24</AddressPrefix>
            </AddressSpace>
            <Subnets>
              <Subnet name="Back">
                <AddressPrefix>10.10.1.0/24</AddressPrefix>
              </Subnet>
            </Subnets>
          </VirtualNetworkSite>
          <VirtualNetworkSite name="Network2" AffinityGroup="ContosoEast">
            <AddressSpace>
              <AddressPrefix>10.10.2.0/24</AddressPrefix>
            </AddressSpace>
            <Subnets>
              <Subnet name="Back">
                <AddressPrefix>10.10.2.0/24</AddressPrefix>
              </Subnet>
            </Subnets>
          </VirtualNetworkSite>
        </VirtualNetworkSites>
      </VirtualNetworkConfiguration>
    </NetworkConfiguration> 
    
    
  5. 在您所建立的每一個同質群組內分別建立儲存體帳戶。

    New-AzureStorageAccount `
        -StorageAccountName $storageAccountName1 `
        -Label $storageAccountLabel `
        -AffinityGroup $affinityGroupName1
    New-AzureStorageAccount `
        -StorageAccountName $storageAccountName2 `
        -Label $storageAccountLabel `
        -AffinityGroup $affinityGroupName2
    
  6. ContosoWest 同質群組內,於新的雲端服務中建立第一個 SQL Server VM (SQL1)。請注意,您必須先為您的訂用帳戶設定目前的儲存體帳戶。

    Set-AzureSubscription `
        -SubscriptionName (Get-AzureSubscription).SubscriptionName `
        -CurrentStorageAccount $storageAccountName1 
    New-AzureVMConfig `
        -Name $sql1ServerName `
        -InstanceSize Large `
        -ImageName $sqlImageName `
        -MediaLocation "$storageAccountContainer1$sql1ServerName.vhd" `
        -HostCaching "ReadOnly" `
        -DiskLabel "OS" | 
        Add-AzureProvisioningConfig `
            -Windows `
            -DisableAutomaticUpdates `
            -AdminUserName $vmAdminUser `
            -Password $vmAdminPassword |
            Set-AzureSubnet `
                -SubnetNames $subnetName |
                Add-AzureEndpoint `
                    -Name "SQL" `
                    -Protocol "tcp" `
                    -PublicPort 1433 `
                    -LocalPort 1433 | 
                    Add-AzureEndpoint `
                        -Name "Mirroring" `
                        -Protocol "tcp" `
                        -PublicPort 5022 `
                        -LocalPort 5022 | 
                        New-AzureVM `
                            -ServiceName $serviceName1 `
                            –AffinityGroup $affinityGroupName1 `
                            -VNetName $virtualNetworkName1
    

    此一連串的管道命令會執行下列動作:

    • New-AzureVMConfig 會使用所需的可用性設定組名稱建立 VM 組態。這個命令也將指定虛擬機器映像庫中的 SQL Server 2012 Service Pack 1 Enterprise Edition 映像。

      New-AzureVMConfig 也會將作業系統磁碟設定為唯讀快取 (無寫入快取)。建議您將資料庫檔案移轉至您連接至 VM 的個別資料磁碟,並設定為無讀取或寫入快取。然而,既然無法移除作業系統磁碟的讀取快取,也可退而求其次的移除作業系統磁碟的寫入快取。

    • Add-AzureProvisioningConfig 提供獨立 Windows 伺服器的組態參數。

    • Set-AzureSubnet 會依網路組態文件指定的方式,將 VM 置於後端子網路。

    • Add-AzureEndpoint 會新增兩個存取端點:連接埠 1433 用於用戶端連接,連接埠 5022 則用於透過網際網路的資料庫鏡像。

    • New-AzureVM 建立新的雲端服務,並在此服務中建立新的 Azure VM。

  7. ContosoEast 同質群組內,於新的雲端服務中建立第二個 SQL Server VM (SQL2)。請注意,您會先變更目前的儲存體帳戶。

    Set-AzureSubscription `
        -SubscriptionName (Get-AzureSubscription).SubscriptionName `
        -CurrentStorageAccount $storageAccountName2 
    New-AzureVMConfig `
        -Name $sql2ServerName `
        -InstanceSize Large `
        -ImageName $sqlImageName `
        -MediaLocation "$storageAccountContainer2$sql2ServerName.vhd" `
        -HostCaching "ReadOnly" `
        -DiskLabel "OS" | 
        Add-AzureProvisioningConfig `
            -Windows `
            -DisableAutomaticUpdates `
            -AdminUserName $vmAdminUser `
            -Password $vmAdminPassword |
            Set-AzureSubnet `
                -SubnetNames $subnetName |
                Add-AzureEndpoint `
                    -Name "SQL" `
                    -Protocol "tcp" `
                    -PublicPort 1433 `
                    -LocalPort 1433 | 
                    Add-AzureEndpoint `
                        -Name "Mirroring" `
                        -Protocol "tcp" `
                        -PublicPort 5022 `
                        -LocalPort 5022 | 
                        New-AzureVM `
                            -ServiceName $serviceName2 `
                            –AffinityGroup $affinityGroupName2 `
                            -VNetName $virtualNetworkName2
    

    這些管道命令與建立 SQL1 時所用的命令類似。請參閱上一個步驟中的附註所提供的說明。

  8. 等候每一個 VM 完整佈建,並將其遠端桌面檔案下載至您的工作目錄。迴圈會逐一循環新的 VM,並且針對每一個 VM 執行最上層大括號內的命令。

    Foreach ($VM in $VMs = Get-AzureVM)
    {
        $VM = Get-AzureVM –ServiceName $VM.ServiceName –Name $VM.Name
        write-host "Waiting for " $VM.Name "..." 
    
        # loop until the VM status is "ReadyRole"
        While ($VM.InstanceStatus -ne "ReadyRole")
        {
            write-host "  Current Status = " $VM.InstanceStatus
            Start-Sleep -Seconds 15
            $VM = Get-AzureVM -ServiceName $VM.ServiceName -Name $VM.InstanceName
        }
    
        write-host "  Current Status = " $VM.InstanceStatus
    
        # Download remote desktop file
        Get-AzureRemoteDesktopFile -ServiceName $VM.ServiceName -Name $VM.InstanceName -LocalPath "$workingDir$($VM.InstanceName).rdp"
    } 
    
    

在本節中,您必須逐一修改位於三部伺服器上的預設 SQL Server 安裝。尤其是,SQL Server VM 已啟用 TCP 通訊協定。不過,您仍必須開啟防火牆允許 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. 在 SQL1 上從 PowerShell 視窗執行 SQLCMD.EXE,並且建立及備份伺服器憑證。

    SQLCMD -S SQL1
    USE master;
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Strong_Password_#1>';
    GO
    
    CREATE CERTIFICATE SQL1_cert WITH SUBJECT = 'SQL1 certificate';
    GO
    
    CREATE ENDPOINT Endpoint_Mirroring
       STATE = STARTED
       AS TCP (LISTENER_PORT=5022, LISTENER_IP = ALL) 
       FOR DATABASE_MIRRORING (AUTHENTICATION = CERTIFICATE SQL1_cert, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = ALL);
    GO
    
    BACKUP CERTIFICATE SQL1_cert TO FILE = 'SQL1_cert.cer';
    GO 
    
  2. 在 SQL2 上從 PowerShell 視窗執行 SQLCMD.EXE,並且建立及備份伺服器憑證。

    SQLCMD -S SQL2
    USE master;
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Strong_Password_#2>';
    GO
    
    CREATE CERTIFICATE SQL2_cert WITH SUBJECT = 'SQL2 certificate for database mirroring';
    GO
    
    CREATE ENDPOINT Endpoint_Mirroring
       STATE = STARTED
       AS TCP (LISTENER_PORT=5022, LISTENER_IP = ALL) 
       FOR DATABASE_MIRRORING (AUTHENTICATION = CERTIFICATE SQL2_cert, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = ALL);
    GO
    
    BACKUP CERTIFICATE SQL2_cert TO FILE = 'SQL2_cert.cer';
    GO
    
  3. 憑證會儲存至預設資料目錄:C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA。請將兩部伺服器上的憑證交叉複製到對方的相同目錄中,讓每一部伺服器都擁有來自另外兩部伺服器的憑證。由於這兩個 SQL Server VM 位於兩個不同的虛擬網路而不方便共用檔案,要跨 VM 複製檔案最簡單的方式就是從您的本機電腦將磁碟機附加至遠端桌面工作階段,然後再從附加的磁碟機交叉複製憑證。

  4. 在 SQL1 上使用 SQL2 的憑證授與對方登入權限。

    CREATE LOGIN DBMirroringLogin WITH PASSWORD = 'Sample_Login_Password!@#';
    GO
    
    CREATE USER DBMirroringLogin FOR LOGIN DBMirroringLogin;
    GO
    
    CREATE CERTIFICATE SQL2_cert AUTHORIZATION DBMirroringLogin FROM FILE = 'SQL2_cert.cer';
    GO
    
    GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [DBMirroringLogin];
    GO
     
    
    
  5. 在 SQL2 上使用 SQL1 的憑證授與對方登入權限。

    CREATE LOGIN DBMirroringLogin WITH PASSWORD = 'Sample_Login_Password!@#';
    GO
    
    CREATE USER DBMirroringLogin FOR LOGIN DBMirroringLogin;
    GO
    
    CREATE CERTIFICATE SQL1_cert AUTHORIZATION DBMirroringLogin FROM FILE = 'SQL1_cert.cer'
    GO
    
    GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [DBMirroringLogin];
    GO
     
    
    
  6. 在 SQL1 上建立資料庫且一併執行完整備份和記錄備份。

    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. 將備份檔案複製到 SQL2 的下列目錄中:C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\BACKUP

  8. 在 SQL2 上使用 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://<uniqueservicename1>.cloudapp.net:5022';
    GO
     
    
    

    請注意,以上是使用雲端服務名稱 <uniqueservicename1>.cloudapp.net,而非 SQL1 的主機名稱。SQL1 和 SQL2 無法直接彼此連接,而必須相互連接到位於對方雲端服務上的端點。您在建立 SQL1 時已經開啟了預設資料庫鏡像端點,即通訊埠 5022。

  9. 在 SQL1 上,啟用 SQL1 成為鏡像夥伴。

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

    再次注意,以上是使用雲端服務名稱 <uniqueservicename2>.cloudapp.net,而非 SQL1 的主機名稱。您在建立 SQL2 時已經開啟了預設資料庫鏡像端點,即通訊埠 5022。

恭喜!您已使用憑證成功設定了跨兩個 Azure 資料中心的資料庫鏡像。請注意,由於伺服器是使用雲端服務名稱而非執行個體名稱相互存取,如果資料庫鏡像監視器嘗試連接到遠端伺服器的執行個體名稱,將會無法連接至遠端伺服器以查詢狀態。若要透過資料庫鏡像監視器監視資料庫鏡像工作階段,請遵循下列指示:

  1. 在 SQL2 上啟用 SQL Server 驗證。如需詳細資訊,請參閱變更伺服器驗證模式

  2. 在 SQL2 上,建立使用 SQL Server 驗證的系統管理員 (sysadmin) 使用者。如需詳細資訊,請參閱建立登入

  3. 在 SQL1 的 SQL Server Management Studio 中,使用 <uniqueservicename2>.cloudapp.net 做為伺服器名稱及 [SQL Server 驗證] 當做驗證模式以連接到 SQL2。

  4. 經由與 SQL2 建立的 Database Engine 連接,啟動資料庫鏡像監視器。如需詳細資訊,請參閱啟動資料庫鏡像監視器 (SQL Server Management Studio)

顯示:
© 2014 Microsoft