提示
部署可用性组的方法有很多种。 通过在同一 Azure 虚拟网络中的多个子网中创建 SQL Server 虚拟机 (VM),可以简化部署,使 Always On 可用性组不再需要 Azure 负载均衡器或分布式网络名称 (DNN)。 如果已在单个子网中创建可用性组,可以将其迁移到多子网环境。
本文介绍如何使用 PowerShell 或 Azure CLI 将 Windows Server 故障转移群集(WSFC)部署到 WSFC,并将 Azure 虚拟机(VM)上的 SQL Server 添加到 WSFC,并为单个子网中的 AlwaysOn 可用性组(AG)创建内部负载均衡器和侦听器。
AG 的部署仍通过 SQL Server Management Studio(SSMS)或 Transact-SQL(T-SQL)手动完成。
虽然本文使用 PowerShell 和 Azure CLI 来配置 AG 环境,但也可以从 Azure 门户或 手动 执行此作。
先决条件
若要配置 Always On 可用性组,必须满足以下先决条件:
- Azure 订阅。
- 一个具有域控制器的资源组。
- Azure 中的一个或多个已加入域并已注册到 SQL IaaS 代理扩展的 VM,
运行 SQL Server 2016 Enterprise 版本(或更高版本) ,位于同一个可用性集或 不同的 可用性区域中。 - 最新版本的 PowerShell 或 Azure CLI。
- 两个可用的(未被任何实体使用的)IP 地址。 一个 IP 地址用于内部负载均衡器。 另一个 IP 地址是用于与 AG 位于同一子网中的 AG 侦听器。 如果使用现有负载均衡器,则只需为 AG 侦听器提供一个可用的 IP 地址。
- Windows Server Core 不是本文中引用的 PowerShell 命令所支持的操作系统,因为存在一个对 RSAT 的依赖关系,而 RSAT 不包含在 Windows 的 Core 安装中。
权限
需要使用以下帐户权限来使用 Azure CLI 配置 AG:
- 在域中具有“创建计算机对象”权限的现有域用户帐户。 例如,域管理员帐户通常拥有足够的权限(如 account@domain.com)。 域用户帐户还应是每个 VM 上本地管理员组的一部分,以创建 WSFC。
- 可控制 SQL Server 的域用户帐户。
创建存储帐户
WSFC 需要一个存储帐户来充当云见证。 可以使用现有存储帐户,也可以创建新的存储帐户。 如果要使用现有存储帐户,请跳转至下一部分。
使用 az storage account create Azure CLI 命令为群集云见证创建存储帐户。
# Create the storage account
# example: az storage account create -n 'cloudwitness' -g SQLVM-RG -l 'China North 3' `
# --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,以跳过此错误。
验证: 该命令返回 ProvisioningState: Succeeded ,存储帐户将显示在资源组中。
定义群集元数据
SQL VM 组管理托管 AG 的 WSFC 服务的元数据。 WSFC 元数据包括 Active Directory 域、群集帐户、要用作云见证的存储帐户和 SQL Server 版本。 定义 WSFC 的元数据,以便在添加第一个 SQL Server VM 时,按定义创建 WSFC。
使用 az sql vm group create Azure CLI 命令定义 WSFC 的元数据。
关键参数:
| 参数 | 示例值/默认值 |
|---|---|
-n |
群集名称 |
-l |
chinanorth3 (区域) |
-g |
资源组名称 |
--image-offer |
SQL2017-WS2016、sql2019-ws2019、sql2022-ws2022、sql2025-ws2025 |
--image-sku |
Enterprise |
--domain-fqdn |
domain.com |
--operator-acc |
vmadmin@domain.com |
--bootstrap-acc |
vmadmin@domain.com |
--service-acc |
sqlservice@domain.com |
--storage-account |
https://cloudwitness.blob.core.chinacloudapi.cn/ |
--cluster-subnet-type |
SingleSubnet |
以下代码片段定义 WSFC 元数据:
# Define the cluster metadata
az sql vm group create -n <cluster name> -l <region ex:chinanorth3> -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.chinacloudapi.cn/>'
--cluster-subnet-type 'SingleSubnet'
向群集添加 VM
将第一个 SQL Server VM 添加到由 az sql vm group create 创建的 WSFC 中后,会创建物理 WSFC。
az sql vm add-to-group 命令使用前面给定的名称创建 WSFC,在 SQL Server VM 上安装 WSFC 角色,并将这些 VM 添加到 WSFC。 该命令的 az sql vm add-to-group 后续使用将更多 SQL Server VM 添加到新创建的 WSFC。
使用 az sql vm add-to-group Azure CLI 命令将 SQL Server VM 添加到群集。
# Add SQL Server VMs to WSFC
# example: az sql vm add-to-group -n SQLVM1 -g SQLVM-RG --sqlvm-group Cluster `
# -b <password> -p <password> -s <password>
# example: az sql vm add-to-group -n SQLVM2 -g SQLVM-RG --sqlvm-group Cluster `
# -b <password> -p <password> -s <password>
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>
# Verify VM registration
az sql vm show -n <VM1 Name> -g <Resource Group Name>
预期输出: 该命令返回"provisioningState": "Succeeded"和"sqlVirtualMachineGroupResourceId",并将它们填充为群集组资源 ID。
验证: 该命令会为每个 VM 返回 ProvisioningState: Succeeded ,并在第一个 VM 添加时创建 WSFC。
配置仲裁
尽管磁盘见证是最可复原的仲裁选项,但它需要一个 Azure 共享磁盘,这会对 AG 施加一些限制。 因此,云见证是为在 Azure VM 上托管 SQL Server 可用性组的 WSFC 推荐的仲裁解决方案。
在 WSFC 中,如果投票数为偶数,请配置最符合您业务需求的 仲裁解决方案。 有关详细信息,请参阅 SQL Server VM 上的仲裁。
验证群集
若要使 WSFC 受Microsoft支持,它必须通过群集验证。 使用首选方法(如 Bastion)连接到 VM,并在继续作之前验证 WSFC 是否通过验证。 否则,WSFC 将处于不受支持的状态。
可以使用故障转移群集管理器(FCM)或以下 PowerShell 命令验证 WSFC:
Test-Cluster –Node ("<node1>","<node2>") –Include "Inventory", "Network", "System Configuration"
验证: 群集验证完成且无故障;警告是可以接受的,但请查看它们来了解潜在问题。
创建可用性组
通常情况下,您可以通过使用 SQL Server Management Studio、PowerShell 或 Transact-SQL 来手动创建 AG。
重要
此时 不要 创建侦听器,因为侦听器注册是在后面的部分中完成的。
创建内部负载均衡器
注意
将可用性组部署到多个子网不需要负载均衡器。 在单子网环境中,在 Windows 2016 及更高版本上使用 SQL Server 2019 CU8 及更高版本的客户可以将传统的虚拟网络名称 (VNN) 侦听器和 Azure 负载均衡器替换为分布式网络名称 (DNN) 侦听器。 如果要使用 DNN,请跳过为可用性组配置 Azure 负载均衡器的所有教程步骤。
AG 侦听器需要 Azure 负载均衡器的一个内部实例。 内部负载均衡器为 AG 侦听器提供一个“浮动”IP 地址,用于加快故障转移和重新连接的速度。 内部负载均衡器应与 SQL Server VM 实例位于同一虚拟网络中。
注意
基本负载均衡器已停用。 对于新部署,请使用标准负载均衡器。 如果有使用基本负载均衡器的现有部署, 请升级到标准负载均衡器。
以下代码片段会创建内部负载均衡器:
使用 az network lb create Azure CLI 命令创建内部负载均衡器。
# 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>
验证: 负载均衡器是随虚拟网络资源组一起 ProvisioningState: Succeeded 创建的,并显示在虚拟网络的资源组中。
创建侦听器
手动创建 AG 后,可以创建侦听器。
子网资源 ID 是虚拟网络资源的资源 ID 加上/subnets/<subnetname>后的值。 要识别子网资源 ID:
- 转到 Azure 门户中的资源组。
- 选择虚拟网络资源。
- 在“设置”窗格中选择“属性” 。
- 标识虚拟网络的资源 ID,并将其追加
/subnets/<subnetname>到虚拟网络资源 ID 的末尾,以创建子网资源 ID。 例如:- 虚拟网络资源 ID 为
/subscriptions/a1a1-1a11a/resourceGroups/SQLVM-RG/providers/Microsoft.Network/virtualNetworks/SQLVMvNet - 子网名称为
default - 因此,子网资源 ID 为
/subscriptions/a1a1-1a11a/resourceGroups/SQLVM-RG/providers/Microsoft.Network/virtualNetworks/SQLVMvNet/subnets/default
- 虚拟网络资源 ID 为
以下代码片段将创建可用性组侦听器:
使用 az sql vm group ag-listener create Azure CLI 命令创建 AG 侦听器。
关键参数:
| 参数 | 示例值/默认值 |
|---|---|
--ag-name |
SQLAG |
--group-name |
元数据中的群集名称 |
--ip-address |
10.0.0.27 (AG 侦听器 IP 地址,子网中的可用 IP) |
--load-balancer |
负载均衡器名称 |
--probe-port |
59999(默认值) |
--subnet |
子网资源 ID(请参阅下文) |
--sqlvms |
sqlvm1 sqlvm2 |
# Create the AG 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 负载均衡器支持虚拟网络名称(VNN)资源时,必须将群集配置为回复运行状况探测请求。 如果运行状况探测无法从后端实例获取响应,则在运行状况探测再次成功之前,不会向该后端实例发送新连接。
若要在 PowerShell 中设置探测端口参数,请根据适用的 IP 地址资源使用以下脚本一次:
$ClusterNetworkName = "<MyClusterNetworkName>" # The cluster network name. Use Get-ClusterNetwork on Windows Server 2012 or later to find the name.
$IPResourceName = "<IPResourceName>" # The IP address resource name.
[int]$ProbePort = <nnnnn> # The probe port that you configured in the health probe of the load balancer for a given Frontend IP Address. Any unused TCP port is valid.
Import-Module FailoverClusters
Get-ClusterResource $IPResourceName | Set-ClusterParameter -Multiple @{"Address"="$IPResourceName";"ProbePort"=$ProbePort;"SubnetMask"="255.255.255.255";"Network"="$ClusterNetworkName";"EnableDhcp"=0}
在 IP 地址资源脱机并再次联机之前,所做的更改不会生效。 进行资源的故障转移,以使此更改生效。
设置群集探测后,使用以下 PowerShell 脚本检查群集参数:
Get-ClusterResource $IPResourceName | Get-ClusterParameter
从动态端口范围中排除端口
使用 49,152 到 65,535 之间的运行状况探测端口( TCP/IP 的默认动态端口范围)时,请为每个 VM 上的每个运行状况探测端口添加排除项。
配置端口排除可防止其他系统进程在 VM 上动态分配同一端口
若要设置端口排除,请使用以下 PowerShell 脚本:
- 每个运行状况探测端口
- 在每台虚拟机上
[int]$ProbePort = <nnnnn> # The probe port that you configured in the health probe of the load balancer. Any unused TCP port is valid.
netsh int ipv4 add excludedportrange tcp startport=$ProbePort numberofports=1 store=persistent
若要确认已正确配置排除项,请使用以下命令:
netsh int ipv4 show excludedportrange tcp
验证: 已成功添加端口排除。
添加副本
在将 AG 部署到托管在 Azure 中的 SQL Server VM 时,会增加一层复杂性。 资源提供程序和虚拟机组现在管理资源。 因此,在 AG 中添加或删除副本时,还有一个步骤是使用 SQL Server VM 的相关信息更新 AG 侦听器(通过 SQL IaaS 代理扩展注册的 AG 侦听器)元数据。 修改 AG 中的副本数时,还必须使用 az sql vm group ag-listener update 命令使用 SQL Server VM 的元数据更新 AG 侦听器元数据。
若要向 AG 添加新副本,请执行以下步骤:
将 SQL Server VM 添加到 WSFC 组。 将
<password>替换为有效的密码。# Add the SQL Server VM to the WSFC group # example: az sql vm add-to-group -n SQLVM3 -g SQLVM-RG --sqlvm-group Cluster ` # -b <password> -p <password> -s <password> 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>使用 SSMS 将 SQL Server 实例添加为 AG 中的副本。
将 SQL Server VM 元数据添加到 AG 侦听器:
# 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>
删除副本
在将 AG 部署到托管在 Azure 中的 SQL Server VM 时,会增加一层复杂性。 资源提供程序和虚拟机组现在共同管理资源。 因此,在 AG 中添加或删除副本时,还有一个步骤是使用 SQL Server VM 的相关信息更新 AG 侦听器(通过 SQL IaaS 代理扩展注册的 AG 侦听器)元数据。 修改 AG 中的副本数时,还必须使用 az sql vm group ag-listener update 命令使用 SQL Server VM 的元数据更新 AG 侦听器元数据。
若要从 AG 中删除副本,请执行以下命令:
- 使用 SSMS 从 AG 中删除副本。
- 从 AG 侦听器中删除 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> - 从 WSFC 中删除 SQL Server VM:
# Remove the SQL VM from the WSFC # 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 配置的 AG 侦听器,则必须通过 SQL IaaS 代理扩展。 由于 AG 侦听器是通过 SQL IaaS 代理扩展注册的,因此只需通过 SSMS 删除 AG 侦听器就不足。
最佳方法是在 Azure CLI 中使用以下代码片段通过 SQL IaaS 代理扩展删除 AG 侦听器。 这样做会从 SQL IaaS 代理扩展中删除 AG 侦听器元数据。 删除操作还会同时从 AG 中物理移除 AG 侦听器。
使用 az sql vm group ag-listener delete Azure CLI 命令删除 AG 侦听器。
# Remove the AG 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>
删除群集
从 WSFC 中删除所有节点以销毁 WSFC,然后从 SQL IaaS 代理扩展中删除 WSFC 元数据。 可以使用 Azure CLI 或 PowerShell 完成上述操作。
注意
如果删除的 SQL Server VM 是 WSFC 中唯一的 VM,则会销毁 WSFC。 如果 WSFC 中除已删除的 SQL Server VM 外还有其他任何 VM,则不会删除其他 VM,并且不会销毁 WSFC。
使用 az sql vm remove-from-group Azure CLI 命令从 WSFC 中删除 SQL Server VM。
首先,从 WSFC 中删除所有 SQL Server VM:
# Remove the VM from the WSFC 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>
接下来,从 SQL IaaS 代理扩展中删除 WSFC 元数据:
# 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> --resource-group <resource group name>
后续步骤
部署 AG 后,请考虑优化 Azure VM 上的 SQL Server 的 HADR 设置。
若要了解更多信息,请参阅以下文章: