你当前正在访问 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 Migrate 将可用性组解决方案直接迁移到 Azure VM 上的 SQL Server。 有关详细信息,请参阅迁移可用性组

先决条件

若要配置 Always On 可用性组,必须满足以下先决条件:

权限

需要具有以下帐户权限才能使用 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 sql2019-ws2019 --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 'MultiSubnet'

az sql vm group create -n <cluster name> -l <region ex:eastus> -g <resource group name> `
  --image-offer <sql2019-ws2019> --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 'MultiSubnet'

向群集添加 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 完成创建。

创建侦听器

手动创建可用性组后,可以使用 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 的元数据更新侦听器。

添加副本

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

Azure CLI

  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>
    

删除副本

从可用性组中删除副本:

Azure CLI

  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 设置

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