設定 Azure SQL Server VM 中可用性群組的 ILB 接聽程式
概觀
重要
Azure 針對建立和使用資源方面,有二種不同的的部署模型:Azure Resource Manager 和傳統模型。 本文涵蓋傳統部署模型的使用。 我們建議讓大部分的新部署使用 Resource Manager 模型。
若要在 Resource Manager 模型中設定 Always On 可用性群組的接聽程式,請參閱在 Azure 中設定 Always On 可用性群組的負載平衡器。
您的可用性群組可包含的複本為僅限內部部署或僅限 Azure,或同時跨內部部署和 Azure 的混合式組態。 Azure 複本可位於相同區域內,或跨越使用多個虛擬網路的多個區域。 本文中的程序假設您已經設定可用性群組,但尚未設定接聽程式。
內部接聽程式指導方針和限制
在 Azure 中使用內部負載平衡器 (ILB) 搭配可用性群組接聽程式時,必須遵循下列指導方針:
- 可用性群組接聽程式支援 Windows Server 2008 R2、Windows Server 2012 和 Windows Server 2012 R2。
- 每個雲端服務僅支援一個內部可用性群組接聽程式,因為接聽程式被設定為 ILB,且每個雲端服務僅有一個 ILB; 但是可以建立多個外部接聽程式。 如需詳細資訊,請參閱在 Azure 中設定 Always On 可用性群組的外部接聽程式。
判斷接聽程式的存取性
請務必了解有兩種方式可以在 Azure 中設定可用性群組接聽程式。 這些方法的差異在於您建立接聽程式時使用的 Azure Load Balancer 類型。 下表描述其差異:
負載平衡器類型 | 實作 | 使用時機: |
---|---|---|
外部 | 使用主控虛擬機器 (VM) 之雲端服務的 [公用虛擬 IP 位址]。 | 您需要從虛擬網路外部存取接聽程式,包括從網際網路。 |
內部 | 使用「內部負載平衡」 搭配接聽程式的私用位址。 | 您只能從相同的虛擬網路內存取接聽程式。 此存取包括混合案例中的站對站 VPN。 |
重要
對於使用雲端服務公用 VIP 的接聽程式 (外部負載平衡器),只要用戶端、接聽程式和資料庫位於相同的 Azure 區域中,就不會向您收取輸出流量費用。 否則,透過接聽程式傳回的所有資料都會被視為輸出流量,並以正常資料傳輸率向您收費。
ILB 只可以在具有區域範圍的虛擬網路上設定。 已針對同質群組設定的現有虛擬網路無法使用 ILB。 如需詳細資訊,請參閱內部負載平衡器概觀。
本文著重於建立使用 ILB 的接聽程式。 如果您需要公用或外部接聽程式,請參閱本文討論設定外部接聽程式的版本。
使用伺服器直接回傳建立負載平衡 VM 端點
藉由執行本節後面的指令碼,先建立 ILB。
為每部主控 Azure 複本的 VM 建立負載平衡端點。 如果您的複本位於多個區域,則該區域的每個複本必須位於相同 Azure 虛擬網路中的相同雲端服務。 建立跨越多個 Azure 區域的可用性群組複本需要設定多個虛擬網路。 如需設定跨虛擬網路連線的詳細資訊,請參閱設定虛擬網路對虛擬網路連線。
在 Azure 入口網站中,移至每部主控複本的 VM 以檢視詳細資料。
按一下每部 VM 的 [端點] 索引標籤。
對於您想要使用的接聽程式端點,確認其 [名稱] 和 [公用連接埠] 並未使用中。 在本節的範例中,名稱是 MyEndpoint,而通訊埠為 1433。
在您的本機用戶端上,下載並安裝最新的 PowerShell 模組。
啟動 Azure PowerShell。
新的 PowerShell 工作階段隨即開啟並載入 Azure 系統管理模組。執行
Get-AzurePublishSettingsFile
。 這個 Cmdlet 會將您導向瀏覽器,以便將發佈設定檔案下載至本機目錄。 系統可能會提示您輸入 Azure 訂用帳戶的登入認證。使用您所下載發佈設定檔案的路徑來執行下列
Import-AzurePublishSettingsFile
命令:Import-AzurePublishSettingsFile -PublishSettingsFile <PublishSettingsFilePath>
匯入發佈設定檔案之後,您便可以在 PowerShell 工作階段中管理 Azure 訂用帳戶。
針對 ILB,指派靜態 IP 位址。 執行下列命令來檢查目前的虛擬網路組態:
(Get-AzureVNetConfig).XMLConfiguration
請記下子網路 (其中包含主控複本的 VM) 的 Subnet 名稱。 此名稱使用於指令碼中的 $SubnetName 參數。
記下子網路 (其中包含主控複本的 VM) 的 VirtualNetworkSite 名稱和起始的 AddressPrefix。 將這兩個值傳遞至
Test-AzureStaticVNetIP
命令並檢查 AvailableAddresses 以尋找可用的 IP 位址。 例如,如果虛擬網路被命名為 MyVNet 且具有以 172.16.0.128 開始的子網路位址範圍,下列命令便會列出可用的位址:(Test-AzureStaticVNetIP -VNetName "MyVNet"-IPAddress 172.16.0.128).AvailableAddresses
選取其中一個可用的位址,並將其用於下一個步驟中指令碼的 $ILBStaticIP 參數。
將下列 PowerShell 指令碼複製到文字編輯器,並設定變數值以符合您的環境。 某些參數已提供預設值。
使用同質群組的現有部署無法新增 ILB。 如需有關 ILB 需求的詳細資訊,請參閱內部負載平衡器概觀。
此外,如果您的可用性群組跨越 Azure 區域,您必須針對雲端服務和位於該資料中心的節點,在每個資料中心執行一次指令碼。
# Define variables $ServiceName = "<MyCloudService>" # the name of the cloud service that contains the availability group nodes $AGNodes = "<VM1>","<VM2>","<VM3>" # all availability group nodes containing replicas in the same cloud service, separated by commas $SubnetName = "<MySubnetName>" # subnet name that the replicas use in the virtual network $ILBStaticIP = "<MyILBStaticIPAddress>" # static IP address for the ILB in the subnet $ILBName = "AGListenerLB" # customize the ILB name or use this default value # Create the ILB Add-AzureInternalLoadBalancer -InternalLoadBalancerName $ILBName -SubnetName $SubnetName -ServiceName $ServiceName -StaticVNetIPAddress $ILBStaticIP # Configure a load-balanced endpoint for each node in $AGNodes by using ILB ForEach ($node in $AGNodes) { Get-AzureVM -ServiceName $ServiceName -Name $node | Add-AzureEndpoint -Name "ListenerEndpoint" -LBSetName "ListenerEndpointLB" -Protocol tcp -LocalPort 1433 -PublicPort 1433 -ProbePort 59999 -ProbeProtocol tcp -ProbeIntervalInSeconds 10 -InternalLoadBalancerName $ILBName -DirectServerReturn $true | Update-AzureVM }
設定變數之後,請從文字編輯器將指令碼複製到您的 PowerShell 工作階段來執行它。 如果提示依然顯示 >> ,請再次按 ENTER 鍵以確定指令碼開始執行。
必要時,請確認已安裝 KB2854082
接下來,如果叢集上的任何伺服器正在執行 Windows Server 2008 R2 或 Windows Server 2012,您必須確認在屬於叢集一部分的每台內部部署伺服器或 Azure VM 上安裝了 Hotfix KB2854082 。 在叢集不在的可用性群組中的任何伺服器或 VM,也應該安裝這個 Hotfix。
在每個叢集節點的遠端桌面工作階段中,下載 KB2854082 至本機目錄。 然後,依序在每個叢集節點上安裝 Hotfix。 如果叢集服務目前在叢集節點上執行,伺服器會在 Hotfix 安裝結束時重新啟動。
警告
停止叢集服務或重新啟動伺服器會影響叢集和可用性群組的仲裁健全狀況,而且可能造成叢集離線。 若要在安裝期間維護叢集的高可用性,請確定:
- 叢集處於最佳仲裁健康狀態。
- 在任何節點上安裝 Hotfix 之前,所有叢集節點都在線上。
- 在叢集中的任何其他節點上安裝 Hotfix 之前,允許 Hotfix 安裝在一個節點上執行到完成為止,包括完整重新啟動伺服器。
在可用性群組節點中開啟防火牆連接埠
在此步驟中,您會建立防火牆規則來開啟負載平衡端點用的探查連接埠 (59999,如先前所指定),以及建立另一個規則來開啟可用性群組接聽程式連接埠。 因為您在包含可用性群組複本的 VM 上建立了負載平衡的端點,您必須在個別 VM 上開啟探查連接埠和接聽程式連接埠。
在裝載複本的 VM 上,啟動 [具有進階安全性的 Windows 防火牆]。
以滑鼠右鍵按一下 [輸入規則],然後按一下 [新增規則]。
在 [規則類型] 頁面上,選取 [連接埠],然後按 [下一步]。
在 [通訊協定與連接埠] 頁面上,選取 [TCP],然後在 [特定本機連接埠] 方塊中輸入 [59999],然後按 [下一步]。
在 [動作] 頁面上,保持選取 [允許連線],然後按 [下一步]。
在 [設定檔] 頁面上,接受預設設定,然後按 [下一步]。
在 [名稱] 頁面的 [名稱] 文字方塊中,指定規則名稱,例如 [AlwaysOn 接聽程式探查連接埠],然後按一下 [完成]。
針對可用性群組接聽程式連接埠 (如稍早在指令碼的 $EndpointPort 參數中指定) 重複前述步驟,然後指定適當的規則名稱,例如 AlwaysOn 接聽程式連接埠。
建立可用性群組接聽程式
透過兩個步驟建立可用性群組接聽程式。 首先,建立用戶端存取點叢集資源並設定相依性。 接著,在 PowerShell 中設定叢集資源。
建立用戶端存取點並設定叢集的相依性
在此步驟中,您會在容錯移轉叢集管理員和 SQL Server Management Studio 中手動建立可用性群組接聽程式。
從裝載主要複本的節點開啟容錯移轉叢集管理員。
選取 [網路] 節點,然後記下叢集網路名稱。 這個名稱會用於 PowerShell 指令碼中的 $ClusterNetworkName 變數。
展開叢集名稱,然後按一下 [角色]。
在 [角色] 窗格中,以滑鼠右鍵按一下可用性群組名稱,然後選取 [新增資源]>[用戶端存取點]。
在 [名稱] 方塊中,建立這個新接聽程式的名稱,按兩次 [下一步],然後按一下 [完成]。
目前請勿讓接聽程式或資源上線工作。按一下 [資源] 索引標籤,然後展開您剛才建立的用戶端存取點。 叢集中每個叢集網路的 IP 位址資源會顯示出來。 如果這是僅限 Azure 的解決方案,只會顯示一個 IP 位址資源。
執行下列任一步驟:
若要設定混合式解決方案:
a. 以滑鼠右鍵按一下對應至您內部部署子網路的 IP 位址資源,然後選取 [屬性]。 記下 IP 位址名稱和網路名稱。
b. 選取 [靜態 IP 位址]、指派未使用的 IP 位址,然後按一下 [確定]。
若要設定僅限 Azure 的解決方案︰
a. 以滑鼠右鍵按一下對應至 Azure 子網的 IP 位址資源,然後選取 [ 屬性]。
注意
如果接聽程式稍後因為 DHCP 所選取的 IP 位址衝突而無法上線,您可以在此屬性視窗中設定有效的靜態 IP 位址。
b. 在同一個 [IP 位址] 屬性視窗中,變更 [IP 位址名稱]。
此名稱使用於 PowerShell 指令碼的 $IPResourceName 變數。 如果您的解決方案跨越多個 Azure 虛擬網路,請針對每個 IP 資源重複此步驟。
在 PowerShell 中設定叢集資源
對於 ILB,您必須使用之前所建立 ILB 的 IP 位址。 若要取得 PowerShell 中的這個 IP 位址,請使用下列指令碼:
# Define variables $ServiceName="<MyServiceName>" # the name of the cloud service that contains the AG nodes (Get-AzureInternalLoadBalancer -ServiceName $ServiceName).IPAddress
在其中一部 VM 上,將適用於您作業系統的 PowerShell 指令碼複製到文字編輯器,然後將變數設定為您先前記下的值。
針對 Windows Server 2012 或更新版本,請使用下列指令碼︰
# Define variables $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 $ILBIP = "<X.X.X.X>" # the IP address of the ILB Import-Module FailoverClusters Get-ClusterResource $IPResourceName | Set-ClusterParameter -Multiple @{"Address"="$ILBIP";"ProbePort"="59999";"SubnetMask"="255.255.255.255";"Network"="$ClusterNetworkName";"EnableDhcp"=0}
針對 Windows Server 2008 R2,請使用下列指令碼︰
# Define variables $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 $ILBIP = "<X.X.X.X>" # the IP address of the ILB Import-Module FailoverClusters cluster res $IPResourceName /priv enabledhcp=0 address=$ILBIP probeport=59999 subnetmask=255.255.255.255
設定變數之後,開啟提升權限的 Windows PowerShell 視窗,然後將指令碼從文字編輯器貼到您的 PowerShell 工作階段中來執行它。 如果提示依然顯示 >> ,請再次按 ENTER 鍵以確定指令碼開始執行。
對每部 VM 重複上述步驟。
此指令碼會使用雲端服務的 IP 位址來設定 IP 位址資源,並設定其他參數 (例如探查連接埠)。 當 IP 位址資源處於線上時,它會從您稍早所建立的負載平衡端點,回應探查連接埠上的輪詢。
使接聽程式上線
在容錯移轉叢集管理員中,展開 [角色],然後醒目提示您的可用性群組。
在 [資源] 索引標籤上,以滑鼠右鍵按一下接聽程式名稱,然後按一下 [屬性]。
按一下 [ 相依性] 索引卷 標。如果列出多個資源,請確認 IP 位址具有 OR,而非 AND 相依性。
按一下 [確定]。
以滑鼠右鍵按一下接聽程式名稱,然後按一下 [上線]。
接聽程式上線後,在 [資源] 索引標籤上,以滑鼠右鍵按一下可用性群組,然後按一下 [屬性]。
建立對接聽程式名稱資源 (非 IP 位址資源名稱) 的相依性,然後按一下 [確定]。
啟動 SQL Server Management Studio,然後連線到主要複本。
移至AlwaysOn 高可用性>可用性群組>< AvailabilityGroupName >>可用性群組接聽程式。
您在容錯移轉叢集管理員中建立的接聽程式名稱應會顯示。以滑鼠右鍵按一下接聽程式名稱,然後按一下 [屬性]。
在 [連接埠] 方塊中,使用您稍早所用的 $EndpointPort 來指定可用性群組接聽程式的連接埠號碼 (在本教學課程中,預設值為 1433),然後按一下 [確定]。
待處理項目
建立可用性群組接聽程式之後,可能需要調整接聽程式資源的 RegisterAllProvidersIP 和 HostRecordTTL 叢集參數。 這些參數可縮短容錯移轉之後的重新連線時間,並可能防止連線逾時。 如需這些參數的詳細資訊以及範例程式碼,請參閱建立或設定可用性群組接聽程式。
測試可用性群組接聽程式 (位於相同的虛擬網路中)
在此步驟中,您會使用在相同網路上執行的用戶端應用程式來測試可用性群組接聽程式。
用戶端連線能力具有下列需求:
- 對接聽程式的用戶端連線必須來自位於與裝載 AlwaysOn 可用性複本的機器不同雲端服務的機器。
- 如果 Always On 複本位於其他子網路中,用戶端必須在連接字串中指定 MultisubnetFailover=True 。 此狀況會導致對各種子網路中的複本進行平行連線嘗試。 此案例包含跨區域的 Always On 可用性群組部署。
其中一個範例是從相同 Azure 虛擬網路中的其中一部 VM (但不是裝載複本的 VM) 連線到接聽程式。 完成這項測試的簡單方法是嘗試將 SQL Server Management Studio 連線到可用性群組接聽程式。 另一個簡單方法是執行 SQLCMD.exe,如下所示:
sqlcmd -S "<ListenerName>,<EndpointPort>" -d "<DatabaseName>" -Q "select @@servername, db_name()" -l 15
注意
如果 EndpointPort 值為 1433,則不需要在呼叫中指定。 前一個呼叫也假設用戶端電腦已加入相同的網域,而且已使用 Windows 驗證授與呼叫端對資料庫的權限。
測試接聽程式時,請務必容錯移轉可用性群組,以確定用戶端可以跨容錯移轉連線至接聽程式。
後續步驟
除了自動將用戶端連線至主要複本,接聽程式可用來將唯讀工作負載重新導向至次要複本。 此用法可以改善整體解決方案的效能和延展性。 如需詳細資訊,請參閱使用 ReadIntent 路由搭配 Azure AlwaysOn 可用性群組接聽程式。
注意
如需 Azure 接聽程式的疑難排解秘訣,請參閱 AlwaysOn 支援小組部落格中的針對 Azure 中可用性群組接聽程式的問題進行移難排解。
如需在 Azure 中使用 SQL Server 的詳細資訊,請參閱 Azure 虛擬機器上的 SQL Server。