你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 PowerShell 或 Az CLI 在 Azure VM 上为 SQL Server 配置可用性组

适用于:Azure VM 上的 SQL Server

提示

部署可用性组的方法有很多种。 通过在同一 Azure 虚拟网络的多个子网中创建 SQL Server 虚拟机 (VM),可以简化部署,使 Always On 可用性组不再需要 Azure 负载均衡器或分布式网络名称 (DNN)。 如果已在单个子网中创建可用性组,可以将其迁移到多子网环境

本文介绍如何使用 PowerShellAzure 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 中的一个或多个已加入域的 VM,它们运行 SQL Server 2016 Enterprise 版本(或更高版本),位于已注册到 SQL IaaS 代理扩展的同一个可用性集或不同可用性区域中 。
  • 最新版本的 PowerShellAzure CLI
  • 两个可用的(未被任何实体使用的)IP 地址。 一个用于内部负载均衡器。 另一个用于与可用性组位于同一子网中的可用性组侦听器。 如果使用现有的负载均衡器,则可用性组侦听程序只需要一个有效的 IP 地址。
  • Windows Server Core 不是本文中引用的 PowerShell 命令所支持的操作系统,因为存在一个对 RSAT 的依赖关系,而 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/'

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/>'

向群集添加 VM

将第一个 SQL Server VM 添加到群集将创建群集。 az sql vm add-to-group 命令使用先前指定的名称创建群集,在 SQL Server 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 的支持。 使用首选方法(例如远程桌面协议 (RDP))连接到 VM,并验证群集是否通过验证,然后再进行下一步。 否则,群集将处于不受支持状态。

用户可使用故障转移群集管理器 (FCM) 或以下 PowerShell 命令来验证群集:

Test-Cluster –Node ("<node1>","<node2>") –Include "Inventory", "Network", "System Configuration"

创建可用性组

像平时一样使用 SQL Server Management StudioPowerShellTransact-SQL 手动创建可用性组。

重要

此时不要创建侦听器,因为下面部分将通过 Azure CLI 完成创建。

创建内部负载均衡器

注意

将可用性组部署到多个子网不需要负载均衡器。 在单子网环境中,在 Windows 2016 及更高版本上使用 SQL Server 2019 CU8 及更高版本的客户可以将传统的虚拟网络名称 (VNN) 侦听器和 Azure 负载均衡器替换为分布式网络名称 (DNN) 侦听器。 如果要使用 DNN,请跳过为可用性组配置 Azure 负载均衡器的所有教程步骤。

Always On 可用性组侦听器需要 Azure 负载均衡器的内部实例。 内部负载均衡器为可用性组侦听器提供“浮动”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 命令创建侦听器。

子网资源 ID 是 /subnets/<subnetname> 附加到虚拟网络资源的资源 ID 的值。 标识子网资源 ID:

  1. 转到 Azure 门户中的资源组。
  2. 选择虚拟网络资源。
  3. 在“设置”窗格中选择“属性” 。
  4. 标识虚拟网络的资源 ID,并在其末尾附加 /subnets/<subnetname>,以创建子网资源 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

以下代码片段将创建可用性组侦听器:

# 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 的元数据更新侦听器。

添加副本

将新副本添加到可用性组:

  1. 将 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>
    
  2. 使用 SQL Server Management Studio 将 SQL Server 实例作为副本添加到可用性组中。

  3. 将 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>
    

删除副本

从可用性组中删除副本:

  1. 使用 SQL Server Management Studio 从可用性组中删除副本。
  2. 从侦听器中删除 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>
    
  3. 从群集中删除 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,则不会删除其他的 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 设置

若要了解更多信息,请参阅以下文章: