設定一或多個 Always On 可用性群組接聽程式

適用于:Azure VM 上的SQL Server

提示

在相同 Azure 虛擬網路內的多個子網路中建立 SQL Server VM,即可排除 Always On 可用性 (AG) 群組的 Azure Load Balancer 需求。

本文件說明如何使用 PowerShell 執行下列其中一項工作:

  • 建立負載平衡器
  • 將 IP 位址新增至 SQL Server 可用性群組的現有負載平衡器。

可用性群組接聽程式是用戶端連接以進行資料庫存取的虛擬網路名稱。 在 Azure 虛擬機器的單一子網路中,負載平衡器會保留接聽程式的 IP 位址。 負載平衡器會將流量路由傳送至在探查連接埠上進行接聽的 SQL Server 執行個體。 通常,可用性群組會使用內部負載平衡器。 Azure 內部負載平衡器可以裝載一或多個 IP 位址。 每個 IP 位址皆使用特定的探查連接埠。

將多個 IP 位址指派給內部負載平衡器是 Azure 的新功能,而且僅供 Resource Manager 模型使用。 若要完成這項工作,您必須在 Resource Manager 模型的 Azure 虛擬機器上,部署 SQL Server 可用性群組。 這兩部 SQL Server 虛擬機器必須屬於相同的可用性設定組。 您可以使用 Microsoft 範本 在 Azure Resource Manager 中自動建立可用性群組。 此範本會自動為您建立可用性群組,包括內部負載平衡器。 如果您想要的話,也可以手動設定 Always On 可用性群組

若要完成本文中的步驟,您必須已設定可用性群組。

相關主題包括:

注意

本文使用 Azure Az PowerShell 模組,這是與 Azure 互動時建議使用的 PowerShell 模組。 若要開始使用 Az PowerShell 模組,請參閱安裝 Azure PowerShell。 若要了解如何遷移至 Az PowerShell 模組,請參閱將 Azure PowerShell 從 AzureRM 遷移至 Az。

啟動 PowerShell 工作階段

執行 Connect-AzAccount \(英文\) Cmdlet,而您將會看到要輸入認證的登入畫面。 使用您用來登入 Azure 入口網站的相同認證。

Connect-AzAccount

如果您有多個訂用帳戶,請使用 Set-AzContext \(英文\) Cmdlet,來選取您的 PowerShell 工作階段應使用的訂用帳戶。 若要查看目前的 PowerShell 工作階段正在使用哪個訂用帳戶,請執行 Get-AzContext \(英文\)。 若要查看您的所有訂用帳戶,請執行 Get-AzSubscription \(英文\)。

Set-AzContext -SubscriptionId '4cac86b0-1e56-bbbb-aaaa-000000000000'

確認 PowerShell 版本

本文中的範例使用 Azure PowerShell 模組 5.4.1 版進行測試。

請確認您的 PowerShell 模組是否為 5.4.1 或更新版本。

請參閱安裝 Azure PowerShell 模組

設定 Windows 防火牆

設定 Windows 防火牆以允許 SQL Server 存取。 防火牆規則可允許透過 TCP 連線至 SQL Server 執行個體及接聽程式探查所使用的連接埠。 如需詳細的指示,請參閱設定用於 Database Engine 存取的 Windows 防火牆。 為 SQL Server 連接埠和探查連接埠建立輸入規則。

如果您使用 Azure 網路安全性群組來限制存取,請確定允許規則包含後端 SQL Server VM IP 位址和 AG 接聽程式的負載平衡器浮動 IP 位址,以及叢集核心 IP 位址 (如果適用的話)。

判斷所需的負載平衡器 SKU

Azure Load Balancer 提供兩種 SKU -「基本」&「標準」。 建議使用標準負載平衡器。 如果虛擬機器在可用性設定組中,則允許使用基本負載平衡器。 如果虛擬機器在可用性區域中,則必須使用標準負載平衡器。 標準負載平衡器會要求所有 VM 的 IP 位址使用標準的 IP 位址。

可用性群組的目前 Microsoft 範本會使用基本 IP 位址的基本負載平衡器。

注意

若將標準負載平衡器和 Azure 儲存體用於雲端見證,則需要設定服務端點

本文中的範例會指定標準負載平衡器。 在範例中,指令碼包含 -sku Standard

$ILB= New-AzLoadBalancer -Location $Location -Name $ILBName -ResourceGroupName $ResourceGroupName -FrontendIpConfiguration $FEConfig -BackendAddressPool $BEConfig -LoadBalancingRule $ILBRule -Probe $SQLHealthProbe -sku Standard

若要建立基本負載平衡器,請從建立負載平衡器的該行中移除 -sku Standard。 例如:

$ILB= New-AzLoadBalancer -Location $Location -Name $ILBName -ResourceGroupName $ResourceGroupName -FrontendIpConfiguration $FEConfig -BackendAddressPool $BEConfig -LoadBalancingRule $ILBRule -Probe $SQLHealthProbe

範例指令碼:使用 PowerShell 建立內部負載平衡器

注意

如果您使用了 Microsoft 範本來建立可用性群組,則已經建立內部負載平衡器。

下列 PowerShell 指令碼會建立內部負載平衡器、設定負載平衡規則,並設定負載平衡器的 IP 位址。 若要執行指令碼,請開啟 Windows PowerShell ISE,然後在 [指令碼] 窗格中貼上指令碼。 請使用 Connect-AzAccount 來登入 PowerShell。 如果您有多個 Azure 訂用帳戶,請使用 Select-AzSubscription 來設定訂用帳戶。

# Connect-AzAccount
# Select-AzSubscription -SubscriptionId <xxxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx>

$ResourceGroupName = "<Resource Group Name>" # Resource group name
$VNetName = "<Virtual Network Name>"         # Virtual network name
$SubnetName = "<Subnet Name>"                # Subnet name
$ILBName = "<Load Balancer Name>"            # ILB name
$Location = "<Azure Region>"                 # Azure location
$VMNames = "<VM1>","<VM2>"                   # Virtual machine names

$ILBIP = "<n.n.n.n>"                         # IP address
[int]$ListenerPort = "<nnnn>"                # AG listener port
[int]$ProbePort = "<nnnn>"                   # Probe port

$LBProbeName ="ILBPROBE_$ListenerPort"       # The Load balancer Probe Object Name              
$LBConfigRuleName = "ILBCR_$ListenerPort"    # The Load Balancer Rule Object Name

$FrontEndConfigurationName = "FE_SQLAGILB_1" # Object name for the front-end configuration 
$BackEndConfigurationName ="BE_SQLAGILB_1"   # Object name for the back-end configuration

$VNet = Get-AzVirtualNetwork -Name $VNetName -ResourceGroupName $ResourceGroupName 

$Subnet = Get-AzVirtualNetworkSubnetConfig -VirtualNetwork $VNet -Name $SubnetName 

$FEConfig = New-AzLoadBalancerFrontendIpConfig -Name $FrontEndConfigurationName -PrivateIpAddress $ILBIP -SubnetId $Subnet.id

$BEConfig = New-AzLoadBalancerBackendAddressPoolConfig -Name $BackEndConfigurationName 

$SQLHealthProbe = New-AzLoadBalancerProbeConfig -Name $LBProbeName -Protocol tcp -Port $ProbePort -IntervalInSeconds 15 -ProbeCount 2

$ILBRule = New-AzLoadBalancerRuleConfig -Name $LBConfigRuleName -FrontendIpConfiguration $FEConfig -BackendAddressPool $BEConfig -Probe $SQLHealthProbe -Protocol tcp -FrontendPort $ListenerPort -BackendPort $ListenerPort -LoadDistribution Default -EnableFloatingIP 

$ILB= New-AzLoadBalancer -Location $Location -Name $ILBName -ResourceGroupName $ResourceGroupName -FrontendIpConfiguration $FEConfig -BackendAddressPool $BEConfig -LoadBalancingRule $ILBRule -Probe $SQLHealthProbe 

$bepool = Get-AzLoadBalancerBackendAddressPoolConfig -Name $BackEndConfigurationName -LoadBalancer $ILB 

foreach($VMName in $VMNames)
    {
        $VM = Get-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName 
        $NICName = ($vm.NetworkProfile.NetworkInterfaces.Id.split('/') | select -last 1)
        $NIC = Get-AzNetworkInterface -name $NICName -ResourceGroupName $ResourceGroupName
        $NIC.IpConfigurations[0].LoadBalancerBackendAddressPools = $BEPool
        Set-AzNetworkInterface -NetworkInterface $NIC
        start-AzVM -ResourceGroupName $ResourceGroupName -Name $VM.Name 
    }

範例指令碼︰使用 PowerShell 將 IP 位址新增至現有的負載平衡器

若要使用多個可用性群組,請將額外的 IP 位址新增至負載平衡器。 每個 IP 位址都需要專屬的負載平衡規則、探查連接埠和前端連接埠。 僅將 VM 的主要 IP 位址新增至負載平衡器的後端集區,因為次要 VM IP 位址不支援浮動 IP

前端連接埠是應用程式用來連線到 SQL Server 執行個體的連接埠。 不同可用性群組的 IP 位址可以使用相同的前端連接埠。

注意

就 SQL Server 可用性群組而言,每個 IP 位址都需要一個特定的探查連接埠。 例如,如果負載平衡器上有一個 IP 位址使用探查連接埠 59999,該負載平衡器上的任何其他 IP 位址就不能使用探查連接埠 59999。

下列指令碼會將新的 IP 位址新增至現有的負載平衡器。 ILB 使用接聽程式連接埠作為負載平衡前端連接埠。 此連接埠可以是 SQL Server 正在接聽的連接埠。 就預設的 SQL Server 執行個體而言,連接埠是 1433。 可用性群組的負載平衡規則需要浮動 IP (伺服器直接傳回),因此後端連接埠與前端連接埠相同。 請更新您環境的變數。

# Connect-AzAccount
# Select-AzSubscription -SubscriptionId <xxxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx>

$ResourceGroupName = "<ResourceGroup>"          # Resource group name
$VNetName = "<VirtualNetwork>"                  # Virtual network name
$SubnetName = "<Subnet>"                        # Subnet name
$ILBName = "<ILBName>"                          # ILB name                      

$ILBIP = "<n.n.n.n>"                            # IP address
[int]$ListenerPort = "<nnnn>"                   # AG listener port
[int]$ProbePort = "<nnnnn>"                     # Probe port 

$ILB = Get-AzLoadBalancer -Name $ILBName -ResourceGroupName $ResourceGroupName 

$count = $ILB.FrontendIpConfigurations.Count+1
$FrontEndConfigurationName ="FE_SQLAGILB_$count"  

$LBProbeName = "ILBPROBE_$count"
$LBConfigrulename = "ILBCR_$count"

$VNet = Get-AzVirtualNetwork -Name $VNetName -ResourceGroupName $ResourceGroupName 
$Subnet = Get-AzVirtualNetworkSubnetConfig -VirtualNetwork $VNet -Name $SubnetName

$ILB | Add-AzLoadBalancerFrontendIpConfig -Name $FrontEndConfigurationName -PrivateIpAddress $ILBIP -SubnetId $Subnet.Id 

$ILB | Add-AzLoadBalancerProbeConfig -Name $LBProbeName  -Protocol Tcp -Port $Probeport -ProbeCount 2 -IntervalInSeconds 15  | Set-AzLoadBalancer 

$ILB = Get-AzLoadBalancer -Name $ILBname -ResourceGroupName $ResourceGroupName

$FEConfig = get-AzLoadBalancerFrontendIpConfig -Name $FrontEndConfigurationName -LoadBalancer $ILB

$SQLHealthProbe  = Get-AzLoadBalancerProbeConfig -Name $LBProbeName -LoadBalancer $ILB

$BEConfig = Get-AzLoadBalancerBackendAddressPoolConfig -Name $ILB.BackendAddressPools[0].Name -LoadBalancer $ILB 

$ILB | Add-AzLoadBalancerRuleConfig -Name $LBConfigRuleName -FrontendIpConfiguration $FEConfig  -BackendAddressPool $BEConfig -Probe $SQLHealthProbe -Protocol tcp -FrontendPort  $ListenerPort -BackendPort $ListenerPort -LoadDistribution Default -EnableFloatingIP | Set-AzLoadBalancer   

設定接聽程式

可用性群組接聽程式是一個 IP 位址及網路名稱,可供 SQL Server 可用性群組接聽。 若要建立可用性群組接聽程式,請執行下列步驟:

  1. 取得叢集網路資源名稱。

    a. 使用 RDP 連接到裝載主要複本的 Azure 虛擬機器。

    b. 開啟 [容錯移轉叢集管理員]。

    c. 選取 [網路]節點,然後記下叢集網路名稱。 請在 PowerShell 指令碼的 $ClusterNetworkName 變數中使用這個名稱。 下圖中的叢集網路名稱為叢集網路 1

    叢集網路名稱

  2. 新增用戶端存取點。
    用戶端存取點是一個網路名稱,應用程式可用來連線到可用性群組中的資料庫。 在容錯移轉叢集管理員中建立用戶端存取點。

    a. 展開叢集名稱,然後按一下 [角色]

    b. 在 [角色] 窗格中,以滑鼠右鍵按一下可用性群組名稱,然後選取 [新增資源]>[用戶端存取點]。

    顯示 [用戶端存取點] 功能表選項的螢幕擷取畫面。

    c. 在 [名稱] 方塊中,建立新接聽程式的名稱。 新接聽程式的名稱是應用程式將用來連線到 SQL Server 可用性群組中資料庫的網路名稱。

    d. 若要完成建立接聽程式,請按一下 [下一步] 兩次,再按一下 [結束]。 目前請勿讓接聽程式或資源上線工作。

  3. 讓可用性群組的叢集角色離線。 在 [容錯移轉叢集管理員] 的 [角色] 下方,以滑鼠右鍵按一下角色,然後選取 [停止角色]

  4. 為可用性群組設定 IP 資源。

    a. 按一下 [資源] 索引標籤,然後展開您建立的用戶端存取點。
    用戶端存取點離線。

    用戶端存取點

    b. 以滑鼠右鍵按一下 IP 資源,然後按一下 [屬性]。 記下 IP 位址的名稱,並將它使用於 PowerShell 指令碼的 $IPResourceName 變數中。

    c. 在 [IP 地址] 下,按一下 [靜態 IP 位址]。 將 [IP 位址] 設為與您在 Azure 入口網站中設定負載平衡器的相同地址。

    顯示設定 IP 位址所在的螢幕擷取畫面。

  5. 讓 SQL Server 可用性群組資源依存於用戶端存取點。

    a. 在 [容錯移轉叢集管理員] 中,按一下 [角色],然後按一下您的 [可用性群組]。

    b. 在 [資源] 索引標籤上,以滑鼠右鍵按一下 [其他資源] 下的可用性資源群組,並按一下 [屬性]

    c. 在 [相依性] 索引標籤上,新增用戶端存取點 (接聽程式) 資源的名稱。

    顯示要在 [相依性] 索引標籤上新增名稱之位置的螢幕擷取畫面。

    d. 按一下 [確定] 。

  6. 讓用戶端存取點資源依存於 IP 位址。

    a. 在 [容錯移轉叢集管理員] 中,按一下 [角色],然後按一下您的 [可用性群組]。

    b. 在 [資源] 索引標籤中,以滑鼠右鍵按一下 [伺服器名稱] 下的用戶端存取點資源,然後按一下 [屬性]

    顯示伺服器名稱的 [屬性] 功能表選項的螢幕擷取畫面。

    c. 按一下 [相依性] 索引標籤。確認 IP 位址是相依性。 如果不是,請在 IP 位址上設定相依性。 如果列出多個資源,請確認 IP 位址具有 OR 相依性,而非 AND。 按一下 [確定]。

    IP 資源

    提示

    您可以驗證相依性是否已正確設定。 在 [容錯移轉叢集管理員] 中,移至 [角色],以滑鼠右鍵按一下可用性群組,並按一下 [其他動作],然後按一下 [顯示相依性報告]。 正確設定相依性後,可用性群組會相依於網路名稱,而網路名稱則相依於 IP 位址。

  7. 在 PowerShell 中設定叢集參數。

    a. 將下列 PowerShell 指令碼複製到您的其中一個 SQL Server 執行個體。 請更新您環境的變數。

    • $ListenerILBIP 是您在 Azure 負載平衡器上為可用性群組接聽程式所建立的 IP 位址。

    • $ListenerProbePort 是您在 Azure 負載平衡器上為可用性群組接聽程式所設定的連接埠。

    $ClusterNetworkName = "<MyClusterNetworkName>" # the cluster network name (Use Get-ClusterNetwork on Windows Server 2012 of higher to find the name)
    $IPResourceName = "<IPResourceName>" # the IP Address resource name
    $ListenerILBIP = "<n.n.n.n>" # the IP Address of the Internal Load Balancer (ILB). This is the static IP address for the load balancer you configured in the Azure portal.
    [int]$ListenerProbePort = <nnnnn>
    
    Import-Module FailoverClusters
    
    Get-ClusterResource $IPResourceName | Set-ClusterParameter -Multiple @{"Address"="$ListenerILBIP";"ProbePort"=$ListenerProbePort;"SubnetMask"="255.255.255.255";"Network"="$ClusterNetworkName";"EnableDhcp"=0}
    

    b. 在其中一個叢集節點中執行 PowerShell 指令碼,以設定叢集參數。

    注意

    如果您的 SQL Server 執行個體位於不同的區域中,您需要執行 PowerShell 指令碼兩次。 若是第一次,請使用第一個區域的 $ListenerILBIP$ListenerProbePort。 若是第二次,請使用第二個區域的 $ListenerILBIP$ListenerProbePort。 每個區域的叢集網路名稱和叢集 IP 資源名稱也會不同。

  8. 讓可用性群組的叢集角色上線。 在 [容錯移轉叢集管理員] 的 [角色] 下方,以滑鼠右鍵按一下角色,然後選取 [啟動角色]

如有必要,請重複上述步驟,來設定 WSFC 叢集 IP 位址的叢集參數。

  1. 取得 WSFC 叢集 IP 位址的 IP 位址名稱。 在 [叢集核心資源] 底下的 [容錯移轉叢集管理員] 中,找出 [伺服器名稱]。

  2. 以滑鼠右鍵按一下 [IP 位址],然後選取 [屬性]

  3. 複製 IP 位址的 [名稱]。 可以是 Cluster IP Address

  4. 在 PowerShell 中設定叢集參數。

    a. 將下列 PowerShell 指令碼複製到您的其中一個 SQL Server 執行個體。 請更新您環境的變數。

    • $ClusterCoreIP 是您在 Azure 負載平衡器上為 WSFC 核心叢集資源所建立的 IP 位址。 此位址與可用性群組接聽程式的 IP 位址不同。

    • $ClusterProbePort 是您在 Azure 負載平衡器上為 WSFC 健康情況探查所設定的連接埠。 此探查與可用性群組接聽程式的探查不同。

    $ClusterNetworkName = "<MyClusterNetworkName>" # the cluster network name (Use Get-ClusterNetwork on Windows Server 2012 of higher to find the name)
    $IPResourceName = "<ClusterIPResourceName>" # the IP Address resource name
    $ClusterCoreIP = "<n.n.n.n>" # the IP Address of the Cluster IP resource. This is the static IP address for the load balancer you configured in the Azure portal.
    [int]$ClusterProbePort = <nnnnn> # The probe port from the WSFCEndPointprobe in the Azure portal. This port must be different from the probe port for the availability group listener probe port.
    
    Import-Module FailoverClusters
    
    Get-ClusterResource $IPResourceName | Set-ClusterParameter -Multiple @{"Address"="$ClusterCoreIP";"ProbePort"=$ClusterProbePort;"SubnetMask"="255.255.255.255";"Network"="$ClusterNetworkName";"EnableDhcp"=0}
    

    b. 在其中一個叢集節點中執行 PowerShell 指令碼,以設定叢集參數。

警告

可用性群組接聽程式健康情況探查連接埠必須與叢集核心 IP 位址健康情況探查連接埠不同。 在這些範例中,接聽程式連接埠是 59999,叢集核心 IP 位址健全狀態探查連接埠則是 58888。 這兩個連接埠都需要允許輸入防火牆規則。

在 SQL Server Management Studio 中設定接聽程式連接埠

  1. 啟動 SQL Server Management Studio,然後連接到主要複本。

  2. 流覽至Always On高可用性>群組可用性群組>接聽程式

  3. 您現在應該會看到在容錯移轉叢集管理員中建立的接聽程式名稱。 以滑鼠右鍵按一下接聽程式名稱,然後選取 [屬性] 。

  4. 在 [連接埠] 方塊中,使用稍早使用的 $EndpointPort (預設值 1433),指定可用性群組接聽程式的連接埠號碼,然後選取 [確定]。

測試接聽程式的連線

若要測試連線︰

  1. 使用遠端桌面通訊協定 (RDP) 連線至位於相同虛擬網路但沒有複本的 SQL Server。 這可以是叢集中其他的 SQL Server。

  2. 使用 sqlcmd 公用程式來測試連線。 例如,下列指令碼會透過接聽程式搭配 Windows 驗證,建立與主要複本的 sqlcmd 連線︰

    sqlcmd -S <listenerName> -E
    

    如果接聽程式使用預設連接埠 (1433) 以外的連接埠,請在連接字串中指定該連接埠。 例如,下列 sqlcmd 命令會連線到位於連接埠 1435 的接聽程式︰

    sqlcmd -S <listenerName>,1435 -E
    

SQLCMD 連線會自動連線到任何一個裝載主要複本的 SQL Server 執行個體。

注意

確定您指定的連接埠在兩部 SQL Server 在防火牆上開啟。 這兩部伺服器需要您使用的 TCP 連接埠的輸入規則。 如需詳細資訊,請參閱新增或編輯防火牆規則

指導方針和限制

請注意,下列關於 Azure 中使用內部負載平衡器之可用性群組接聽程式的指導方針:

  • 使用內部負載平衡器時,您只會從相同的虛擬網路內存取接聽程式。

  • 如果您要使用 Azure 網路安全性群組限制存取,請確定允許規則包括:

    • 後端 SQL Server VM IP 位址
    • AG 接聽程式的負載平衡器浮動 IP 位址
    • 叢集核心 IP 位址 (若適用)。
  • 將標準負載平衡器與 Azure 儲存體用於雲端見證時,請建立服務端點。 如需詳細資訊,請參閱授與虛擬網路存取權

PowerShell Cmdlet

請使用下列 PowerShell Cmdlet 建立 Azure 虛擬機器的內部負載平衡器。

後續步驟

若要深入了解,請參閱: