使用 PowerShell 或 Az CLI,在 Azure VM 上設定 SQL Server 的單一子網路可用性群組
提示
有許多方法可部署可用性群組。 在相同 Azure 虛擬網路內的多個子網路中建立 SQL Server 虛擬機器 (VM),您的 Always On 可用性群組就可以簡化部署,而且不再需要 Azure Load Balancer 或分散式網路名稱 (DNN)。 如果您已在單一子網路中建立可用性群組,您可以將它移轉至多子網路環境。
本文說明如何使用 PowerShell 或 Azure CLI 來部署 Windows 容錯移轉叢集、將 SQL Server VM 新增至叢集,以及在單一子網路中建立 Always On 可用性群組的內部負載平衡器和接聽程式。
可用性群組的部署目前仍要手動透過 SQL Server Management Studio (SSMS) 或 Transact-SQL (T-SQL) 來完成。
雖然此文章使用 PowerShell 和 Az CLI 來設定可用性群組環境,但您也可以使用 Azure 入口網站、Azure 快速入門範本,或手動執行此作業。
注意
現在可以使用 Azure Migrate,將可用性群組解決方案隨即轉移到 Azure VM 上的 SQL Server。 若要深入了解,請參閱移轉可用性群組。
必要條件
若要設定 Always On 可用性群組,您必須具備下列必要條件:
- Azure 訂用帳戶。
- 具有網域控制站的資源群組。
- Azure 中一或多個執行 SQL Server 2016 (或更新版本) Enterprise Edition 的 VM,且這些 VM 必須已加入網域,並且位於已向 SQL IaaS 代理程式延伸模組註冊的相同可用性設定組或不同可用性區域中。
- PowerShell 或 Azure CLI 的最新版本。
- 兩個可用 (未由任何實體使用) 的 IP 位址。 一個用於內部負載平衡器。 另一個用於與可用性群組位於相同子網路內的可用性群組接聽程式。 如果您使用的是現有的負載平衡器,則可用性群組接聽程式只需要一個可用的 IP 位址。
- 本文所參考的 PowerShell 命令不支援 Windows Server Core 作業系統,因為具有 RSAT 相依性,而這不包括在 Windows 的 Core 安裝中。
權限
您需要有下列帳戶權限,才能使用 Azure CLI 來設定 Always On 可用性群組:
- 在網域中擁有建立電腦物件權限的現有網域使用者帳戶。 例如,網域系統管理員帳戶通常會有足夠的權限 (例如:account@domain.com)。 此帳戶也應該屬於建立叢集的每個 VM 上的本機系統管理員群組一部分。
- 控制 SQL Server 的網域使用者帳戶。
建立儲存體帳戶
叢集需要有儲存體帳戶來作為雲端見證。 您可以使用任何現有的儲存體帳戶,也可以建立新的儲存體帳戶。 如果您想要使用現有的儲存體帳戶,請跳至下一節。
下列程式碼片段會建立儲存體帳戶:
# Create the storage account
# example: az storage account create -n 'cloudwitness' -g SQLVM-RG -l 'West US' `
# --sku Standard_LRS --kind StorageV2 --access-tier Hot --https-only true
az storage account create -n <name> -g <resource group name> -l <region> `
--sku Standard_LRS --kind StorageV2 --access-tier Hot --https-only true
提示
如果您使用過期的 Azure CLI 版本,則可能會看到錯誤 az sql: 'vm' is not in the 'az sql' command group
。 請下載 Azure CLI 的最新版本以解決這個錯誤。
定義叢集中繼資料
Azure CLI 的 az sql vm group 命令群組可管理可用性群組裝載所在 Windows Server 容錯移轉叢集 (WSFC) 服務的中繼資料。 叢集中繼資料包括 Active Directory 網域、叢集帳戶、用來作為雲端見證的儲存體帳戶,以及 SQL Server 版本。 請使用 az sql vm group create 來定義 WSFC 的中繼資料,如此一來,在新增第一個 SQL Server VM 時就會依照定義來建立叢集。
下列程式碼片段會定義叢集的中繼資料:
# Define the cluster metadata
# example: az sql vm group create -n Cluster -l 'West US' -g SQLVM-RG `
# --image-offer SQL2017-WS2016 --image-sku Enterprise --domain-fqdn domain.com `
# --operator-acc vmadmin@domain.com --bootstrap-acc vmadmin@domain.com --service-acc sqlservice@domain.com `
# --sa-key '4Z4/i1Dn8/bpbseyWX' `
# --storage-account 'https://cloudwitness.blob.core.windows.net/'
# --cluster-subnet-type 'SingleSubnet'
az sql vm group create -n <cluster name> -l <region ex:eastus> -g <resource group name> `
--image-offer <SQL2016-WS2016 or SQL2017-WS2016> --image-sku Enterprise --domain-fqdn <FQDN ex: domain.com> `
--operator-acc <domain account ex: testop@domain.com> --bootstrap-acc <domain account ex:bootacc@domain.com> `
--service-acc <service account ex: testservice@domain.com> `
--sa-key '<PublicKey>' `
--storage-account '<ex:https://cloudwitness.blob.core.windows.net/>'
--cluster-subnet-type 'SingleSubnet'
將 VM 新增至叢集
將第一個 SQL Server VM 新增至叢集便會建立叢集。 az sql vm add-to-group 命令會以先前指定的名稱建立叢集、將叢集角色安裝到 SQL Server VM 上,再將這些 VM 新增至叢集。 後續使用 az sql vm add-to-group
命令時,則會將更多 SQL Server VM 新增至新建立的叢集。
下列程式碼片段會建立叢集,並於其中新增第一個 SQL Server VM:
# Add SQL Server VMs to cluster
# example: az sql vm add-to-group -n SQLVM1 -g SQLVM-RG --sqlvm-group Cluster `
# -b Str0ngAzur3P@ssword! -p Str0ngAzur3P@ssword! -s Str0ngAzur3P@ssword!
# example: az sql vm add-to-group -n SQLVM2 -g SQLVM-RG --sqlvm-group Cluster `
# -b Str0ngAzur3P@ssword! -p Str0ngAzur3P@ssword! -s Str0ngAzur3P@ssword!
az sql vm add-to-group -n <VM1 Name> -g <Resource Group Name> --sqlvm-group <cluster name> `
-b <bootstrap account password> -p <operator account password> -s <service account password>
az sql vm add-to-group -n <VM2 Name> -g <Resource Group Name> --sqlvm-group <cluster name> `
-b <bootstrap account password> -p <operator account password> -s <service account password>
使用此命令可將任何其他 SQL Server VM 新增至叢集。 只需修改 SQL Server VM 名稱的 -n
參數即可。
設定仲裁
儘管磁碟見證是最具復原性的仲裁選項,但其需要 Azure 共用磁碟,才能對可用性群組施加一些限制。 因此,雲端見證是在 Azure VM 上,針對 SQL Server 裝載可用性群組的叢集所建議的仲裁解決方案。
如果您的叢集中有偶數個投票,請設定最適合您商務需求的仲裁解決方案。 如需詳細資訊,請參閱 SQL Server VM 的仲裁。
驗證叢集
若要讓 Microsoft 支援容錯移轉叢集,必須通過叢集驗證。 使用您慣用的方法連線至 VM (例如,遠端桌面通訊協定 (RDP)),並驗證您的叢集是否通過驗證,然後再繼續進行。 若未這麼做,就會讓您的叢集處於未受支援的狀態。
您可以使用容錯移轉叢集管理員 (FCM) 或下列 PowerShell 命令來驗證叢集:
Test-Cluster –Node ("<node1>","<node2>") –Include "Inventory", "Network", "System Configuration"
建立可用性群組
像平常一樣,使用 SQL Server Management Studio、PowerShell 或 Transact-SQL 手動建立可用性群組。
重要
目前還不要建立接聽程式,會在後面幾節透過 Azure CLI 來完成。
建立內部負載平衡器
注意
將可用性群組部署至多個子網路並不需要負載平衡器。 在單一子網路環境中,在 Windows 2016 和更新版本上使用 SQL Server 2019 CU8 和更新版本的客戶,可改為使用分散式網路名稱 (DNN) 接聽程式取代傳統的虛擬網路名稱 (VNN) 接聽程式和 Azure Load Balancer。 如果您想要使用 DNN,則請略過為可用性群組設定 Azure Load Balancer 的任何教學課程步驟。
Always On 可用性群組接聽程式需要 Azure Load Balancer 的內部執行個體。 內部負載平衡器會為可用性群組接聽程式提供「浮動」IP 位址,以加快容錯移轉和重新連線的速度。 如果可用性群組中的 SQL Server VM 屬於相同可用性設定組,則可使用基本的負載平衡器。 否則,即須使用標準負載平衡器。
注意
內部負載平衡器應該與 SQL Server VM 執行個體位於相同的虛擬網路中。
下列程式碼片段會建立內部負載平衡器:
# Create the internal load balancer
# example: az network lb create --name sqlILB -g SQLVM-RG --sku Standard `
# --vnet-name SQLVMvNet --subnet default
az network lb create --name sqlILB -g <resource group name> --sku Standard `
--vnet-name <VNet Name> --subnet <subnet name>
重要
每個 SQL Server VM 的公用 IP 資源都應有標準 SKU,以便與標準負載平衡器相容。 若要確認 VM 公用 IP 資源的 SKU,請移至 [資源群組],並為所需的 SQL Server VM 選取 [公用 IP 位址] 資源,然後在 [概觀] 窗格的 [SKU] 下方找出其值。
建立接聽程式
在您手動建立可用性群組之後,您可以使用 az sql vm ag-listener 建立接聽程式。
子網路資源識別碼是附加至虛擬網路資源識別碼的 /subnets/<subnetname>
值。 若要識別子網路資源識別碼:
- 在 Azure 入口網站中移至您的資源群組。
- 選取虛擬網路資源。
- 在 [設定] 窗格中選取 [屬性]。
- 找到虛擬網路的資源識別碼,並將
/subnets/<subnetname>
附加至其結尾,以建立子網路資源識別碼。 例如:- 您的虛擬網路資源識別碼是:
/subscriptions/a1a1-1a11a/resourceGroups/SQLVM-RG/providers/Microsoft.Network/virtualNetworks/SQLVMvNet
- 您的子網路名稱是:
default
- 因此,您的子網路資源識別碼是:
/subscriptions/a1a1-1a11a/resourceGroups/SQLVM-RG/providers/Microsoft.Network/virtualNetworks/SQLVMvNet/subnets/default
- 您的虛擬網路資源識別碼是:
下列程式碼片段會建立可用性群組接聽程式:
# Create the availability group listener
# example: az sql vm group ag-listener create -n AGListener -g SQLVM-RG `
# --ag-name SQLAG --group-name Cluster --ip-address 10.0.0.27 `
# --load-balancer sqlilb --probe-port 59999 `
# --subnet /subscriptions/a1a1-1a11a/resourceGroups/SQLVM-RG/providers/Microsoft.Network/virtualNetworks/SQLVMvNet/subnets/default `
# --sqlvms sqlvm1 sqlvm2
az sql vm group ag-listener create -n <listener name> -g <resource group name> `
--ag-name <availability group name> --group-name <cluster name> --ip-address <ag listener IP address> `
--load-balancer <lbname> --probe-port <Load Balancer probe port, default 59999> `
--subnet <subnet resource id> `
--sqlvms <names of SQL VM's hosting AG replicas, ex: sqlvm1 sqlvm2>
修改複本的數目
當您要將可用性群組部署至 Azure 中裝載的 SQL Server VM 時,複雜程度會更高。 資源提供者和虛擬機器群組現在會管理資源。 因此,當您在可用性群組中新增或移除複本時,需要再進行一個步驟來使用 SQL Server VM 的相關資訊更新接聽程式的中繼資料。 當您要修改可用性群組中的複本數目時,您還必須使用 az sql vm group ag-listener update 命令,以使用 SQL Server VM 的中繼資料更新接聽程式。
新增複本
若要將新的複本新增至可用性群組:
Azure CLI
將 SQL Server VM 新增至叢集群組:
# Add the SQL Server VM to the cluster group # example: az sql vm add-to-group -n SQLVM3 -g SQLVM-RG --sqlvm-group Cluster ` # -b Str0ngAzur3P@ssword! -p Str0ngAzur3P@ssword! -s Str0ngAzur3P@ssword! az sql vm add-to-group -n <VM3 Name> -g <Resource Group Name> --sqlvm-group <cluster name> ` -b <bootstrap account password> -p <operator account password> -s <service account password>
使用 SQL Server Management Studio 將 SQL Server 執行個體新增為可用性群組中的複本。
將 SQL Server VM 中繼資料新增至接聽程式:
# Update the listener metadata with the new VM # example: az sql vm group ag-listener update -n AGListener ` # -g sqlvm-rg --group-name Cluster --sqlvms sqlvm1 sqlvm2 sqlvm3 az sql vm group ag-listener update -n <Listener> ` -g <RG name> --group-name <cluster name> --sqlvms <SQL VMs, along with new SQL VM>
移除複本
若要從可用性群組中移除複本:
Azure CLI
- 使用 SQL Server Management Studio 從可用性群組中移除複本。
- 從接聽程式中移除 SQL Server VM 中繼資料:
# Update the listener metadata by removing the VM from the SQLVMs list # example: az sql vm group ag-listener update -n AGListener ` # -g sqlvm-rg --group-name Cluster --sqlvms sqlvm1 sqlvm2 az sql vm group ag-listener update -n <Listener> ` -g <RG name> --group-name <cluster name> --sqlvms <SQL VMs that remain>
- 從叢集中移除 SQL Server VM:
# Remove the SQL VM from the cluster # example: az sql vm remove-from-group --name SQLVM3 --resource-group SQLVM-RG az sql vm remove-from-group --name <SQL VM name> --resource-group <RG name>
移除接聽程式
如果您稍後需要移除使用 Azure CLI 所設定的可用性群組接聽程式,您必須透過 SQL IaaS 代理程式延伸模組來執行。 由於接聽程式會透過 SQL IaaS 代理程式延伸模組來註冊,因此,僅透過 SQL Server Management Studio 加以刪除並不夠。
最好的方法是在 Azure CLI 中使用下列程式碼片段,透過 SQL IaaS 代理程式延伸模組加以刪除。 這麼做可從 SQL IaaS 代理程式延伸模組中移除可用性群組接聽程式中繼資料。 同時實際從可用性群組中刪除該接聽程式。
# Remove the availability group listener
# example: az sql vm group ag-listener delete --group-name Cluster --name AGListener --resource-group SQLVM-RG
az sql vm group ag-listener delete --group-name <cluster name> --name <listener name > --resource-group <resource group name>
移除叢集
移除叢集中的所有節點以將其終結,然後將叢集中繼資料從 SQL IaaS 代理程式延伸模組中移除。 您可以使用 Azure CLI 或 PowerShell 來完成。
首先,從叢集中移除所有 SQL Server VM:
# Remove the VM from the cluster metadata
# example: az sql vm remove-from-group --name SQLVM2 --resource-group SQLVM-RG
az sql vm remove-from-group --name <VM1 name> --resource-group <resource group name>
az sql vm remove-from-group --name <VM2 name> --resource-group <resource group name>
如果這些是叢集中的唯一 VM,則會終結該叢集。 如果叢集中有任何其他 VM 與已移除的 SQL Server VM 分開,將不會移除其他 VM,且不會該終結叢集。
接下來,從 SQL IaaS 代理程式延伸模組中移除叢集中繼資料:
# Remove the cluster from the SQL VM RP metadata
# example: az sql vm group delete --name Cluster --resource-group SQLVM-RG
az sql vm group delete --name <cluster name> Cluster --resource-group <resource group name>
後續步驟
部署可用性群組之後,請考慮最佳化 Azure VM 上 SQL Server 的 HADR 設定。
若要深入了解,請參閱: