匯出 (0) 列印
全部展開

教學課程:Azure 中提供高可用性的資料庫鏡像

更新日期: 2014年4月

本教學課程示範如何在同一個 Azure 資料中心內使用 Azure VM 實作端對端 SQL Server 資料庫鏡像以提供高可用性。在同一個 Azure 資料中心內實作資料庫鏡像時,您可以將伺服器部署於 Active Directory 網域,或者也可使用憑證建立資料庫鏡像而不依賴 Active Directory 網域。第二種方法將能讓您省下網域控制站硬體及其相關計算時數的費用,從而降低成本。

在本教學課程中,您將使用三個 SQL Server 虛擬機器 (VM) 部署資料庫鏡像做為高可用性方案,而其中一個 VM 會當成見證伺服器。教學課程結束時,您的 SQL Server 高可用性方案將會包含下列項目:

  • 包含多個子網路的虛擬網路 (包括前端和後端子網路)

  • 部署至後端子網路的三個 SQL Server VM (SQL1、SQL2 和 SQL3)

  • SQL1 是主體資料庫伺服器

  • SQL2 是鏡像資料庫伺服器

  • SQL3 是見證伺服器

本教學課程用意為示範設定上述方案所需的步驟,但不會闡述每個步驟的細節。因此,本教學課程不會顯示 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 基礎結構的一系列變數加以定義。

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

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

    • 變數 $storageAccountName$serviceName 都必須是唯一的,因為這些變數分別用於識別您在網際網路上的雲端儲存體帳戶和雲端服務。

    • 在您稍後使用到的虛擬網路組態文件中,設定變數 $affinityGroupName$virtualNetworkName 的指定名稱。

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

  3. 建立同質群組。

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

    Set-AzureVNetConfig `
        -ConfigurationPath $networkConfigPath
    

    此組態檔包含了下列 XML 文件。簡而言之,組態檔在稱作 ContosoAG 的同質群組中指定名為 ContosoNET 的虛擬網路,且具有 10.10.0.0/16 的位址空間,並有兩個子網路,10.10.1.0/2410.10.2.0/24,這兩個子網路分別為前端子網路和後端子網路。前端網路供您放置 Microsoft SharePoint 之類的用戶端應用程式,而後端網路則供您放置 SQL Server VM。如果您變更上述 $affinityGroupName$virtualNetworkName 變數,也必須變更下列對應名稱。

    <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="Front">
                <AddressPrefix>10.10.1.0/24</AddressPrefix>
              </Subnet>
              <Subnet name="Back">
                <AddressPrefix>10.10.2.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 (SQL1)。

    # Create SQL1...
    New-AzureVMConfig `
        -Name $sql1ServerName `
        -InstanceSize Large `
        -ImageName $sqlImageName `
        -MediaLocation "$storageAccountContainer$sql1ServerName.vhd" `
        -AvailabilitySetName $availabilitySetName `
        -HostCaching "ReadOnly" `
        -DiskLabel "OS" | 
        Add-AzureProvisioningConfig `
            -Windows `
            -DisableAutomaticUpdates `
            -AdminUserName $vmAdminUser `
            -Password $vmAdminPassword |
            Set-AzureSubnet `
                -SubnetNames $subnetName |
                Add-AzureEndpoint `
                    -Name "SQL" `
                    -Protocol "tcp" `
                    -PublicPort 1 `
                    -LocalPort 1433 | 
                    New-AzureVM `
                        -ServiceName $serviceName `
                        –AffinityGroup $affinityGroupName `
                        -VNetName $virtualNetworkName
    

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

    • New-AzureVMConfig 會使用所需的可用性設定組名稱建立 VM 組態。後續 VM 將使用相同的可用性設定組名稱進行建立,如此一來這些 VM 即可加入至相同的可用性設定組。這個命令也將指定虛擬機器映像庫中的 SQL Server 2012 Service Pack 1 Enterprise 映像。

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

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

    • Set-AzureSubnet 會將 VM 放在後端子網路中。

    • Add-AzureEndpoint 會加入存取端點,讓用戶端應用程式能夠存取網際網路上的 SQL Server 服務執行個體。

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

  7. 執行下列管道命令,建立另外兩個 SQL Server VM (SQL2SQL3)。

    # Create SQL2...
    New-AzureVMConfig `
        -Name $sql2ServerName `
        -InstanceSize Large `
        -ImageName $sqlImageName `
        -MediaLocation "$storageAccountContainer$sql2ServerName.vhd" `
        -AvailabilitySetName $availabilitySetName `
        -HostCaching "ReadOnly" `
        -DiskLabel "OS" | 
        Add-AzureProvisioningConfig `
            -Windows `
            -DisableAutomaticUpdates `
            -AdminUserName $vmAdminUser `
            -Password $vmAdminPassword |
            Set-AzureSubnet `
                -SubnetNames $subnetName |
                Add-AzureEndpoint `
                    -Name "SQL" `
                    -Protocol "tcp" `
                    -PublicPort 2 `
                    -LocalPort 1433 | 
                    New-AzureVM `
                        -ServiceName $serviceName
    # Create SQL3...
    New-AzureVMConfig `
        -Name $sql3ServerName `
        -InstanceSize Large `
        -ImageName $sqlImageName `
        -MediaLocation "$storageAccountContainer$sql3ServerName.vhd" `
        -AvailabilitySetName $availabilitySetName `
        -HostCaching "ReadOnly" `
        -DiskLabel "OS" | 
        Add-AzureProvisioningConfig `
            -Windows `
            -DisableAutomaticUpdates `
            -AdminUserName $vmAdminUser `
            -Password $vmAdminPassword |
            Set-AzureSubnet `
                -SubnetNames $subnetName |
                New-AzureVM `
                    -ServiceName $serviceName
     
    
    

    有關上述命令,請注意下列項目:

    • New-AzureVMConfig 使用與 SQL1 相同的可用性設定組名稱,並使用虛擬機器映像庫中的 SQL Server 2012 Service Pack 1 Enterprise Edition 映像。

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

    • Set-AzureSubnet 會將 VM 放在後端子網路中。

    • Add-AzureEndpoint 會加入存取端點,讓用戶端應用程式能夠存取網際網路上的 SQL Server 服務執行個體。至於 SQL3 則是當成見證伺服器,所以並未指定端點。請注意 SQL1SQL2 會有不同的通訊埠。

    • New-AzureVM 會在與 SQL1 相同的雲端服務中建立新的 SQL Server VM。若您要 VM 在相同的可用性設定組中,必須將 VM 放在相同的雲端服務。

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

    Foreach ($VM in $VMs = Get-AzureVM -ServiceName $serviceName)
    {
        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. 在 SQL3 上從 PowerShell 視窗執行 SQLCMD.EXE,並且建立及備份伺服器憑證。

    SQLCMD -S SQL3
    USE master;
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Strong_Password_#3>';
    GO
    
    CREATE CERTIFICATE SQL3_cert WITH SUBJECT = 'SQL3 certificate for database mirroring';
    GO
    
    CREATE ENDPOINT Endpoint_Mirroring
       STATE = STARTED
       AS TCP (LISTENER_PORT=5022, LISTENER_IP = ALL) 
       FOR DATABASE_MIRRORING (AUTHENTICATION = CERTIFICATE SQL3_cert, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = ALL);
    GO
    
    BACKUP CERTIFICATE SQL3_cert TO FILE = 'SQL3_cert.cer';
    GO
    
  4. 憑證會儲存至預設資料目錄:C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA。請將三部伺服器上的憑證交叉複製到另兩方的相同目錄中,讓每一部伺服器都擁有來自另外兩部伺服器的憑證。為此,您可以在其中一部伺服器上建立共用資料夾,或將您的本機電腦磁碟機附加至遠端桌面工作階段,用來傳輸檔案。

  5. 在 SQL1 上使用 SQL2 及 SQL3 的憑證授與該兩方登入權限。

    CREATE LOGIN DBMirroringLogin WITH PASSWORD = 'Contoso!000';
    GO
    
    CREATE USER DBMirroringLogin FOR LOGIN DBMirroringLogin;
    GO
    
    CREATE CERTIFICATE SQL2_cert AUTHORIZATION DBMirroringLogin FROM FILE = 'SQL2_cert.cer'
    GO
    
    CREATE CERTIFICATE SQL3_cert AUTHORIZATION DBMirroringLogin FROM FILE = 'SQL3_cert.cer'
    GO
    
    GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [DBMirroringLogin];
    GO
    
  6. 在 SQL2 上使用 SQL1 及 SQL3 的憑證授與該兩方登入權限。

    CREATE LOGIN DBMirroringLogin WITH PASSWORD = 'Contoso!000';
    GO
    
    CREATE USER DBMirroringLogin FOR LOGIN DBMirroringLogin;
    GO
    
    CREATE CERTIFICATE SQL1_cert AUTHORIZATION DBMirroringLogin FROM FILE = 'SQL1_cert.cer'
    GO
    
    CREATE CERTIFICATE SQL3_cert AUTHORIZATION DBMirroringLogin FROM FILE = 'SQL3_cert.cer'
    GO
    
    GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [DBMirroringLogin];
    GO
    
  7. 在 SQL3 上使用 SQL1 及 SQL2 的憑證授與該兩方登入權限。

    CREATE LOGIN DBMirroringLogin WITH PASSWORD = 'Contoso!000';
    GO
    
    CREATE USER DBMirroringLogin FOR LOGIN DBMirroringLogin;
    GO
    
    CREATE CERTIFICATE SQL1_cert AUTHORIZATION DBMirroringLogin FROM FILE = 'SQL1_cert.cer'
    GO
    
    CREATE CERTIFICATE SQL2_cert AUTHORIZATION DBMirroringLogin FROM FILE = 'SQL2_cert.cer'
    GO
    
    GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [DBMirroringLogin];
    GO
    
  8. 在 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
    
  9. 將備份檔案複製到 SQL2 的下列目錄中:C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\BACKUP

  10. 在 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://SQL1:5022';
    GO
    
  11. 在 SQL1 上,啟用 SQL1 成為鏡像夥伴以及 SQL3 成為見證伺服器。

    ALTER DATABASE MyDB1 SET PARTNER = 'TCP://SQL2:5022';
    GO
    
    ALTER DATABASE MyDB1 SET WITNESS = 'TCP://SQL3:5022';
    GO
    

恭喜!您已使用憑證在 Azure VM 中成功設定了資料庫鏡像。若要確認資料庫鏡像工作階段是否已同步處理,請開啟資料庫鏡像監視器。如需有關資料庫鏡像監視器的詳細資訊,請參閱啟動資料庫鏡像監視器 (SQL Server Management Studio)

顯示:
© 2014 Microsoft