配置在多写入者模式下使用永久性磁盘的 SQL Server 故障切换集群实例


通过 Microsoft SQL Server Always On 故障切换集群实例 (FCI),您可以跨多个 Windows Server 故障切换集群 (WSFC) 节点运行单个 SQL Server 实例。任何时候,其中一个集群节点都会主动托管该 SQL 实例。如果发生故障,WSFC 会自动将该实例资源的所有权转移到另一个节点。

SQL Server FCI 要求将数据置于共享存储空间中,以便跨所有 WSFC 节点访问数据。本指南介绍如何部署 SQL Server 2022 故障切换集群实例,并将处于多写入者模式的永久性磁盘用作共享存储空间。

在本地环境中,如果发生故障切换,您可以让 WSFC 执行 ARP 通知,以通知网络设备某个 IP 地址发生了变化。但是,Google Cloud 会忽略 ARP 通知。因此,您必须实现以下两个选项之一:

架构

架构

本文假定您已在 Google Cloud 上部署了 Active Directory,而且您已基本掌握 SQL Server、Active Directory 和 Compute Engine。

目标

  • 部署由两个 SQL Server 虚拟机实例和第三个虚拟机实例(充当文件共享见证者)组成的 WSFC。
  • 在 WSFC 上部署 SQL Server FCI。
  • 配置负载均衡器或分布式网络名称 (DNN),以便使用 SQL Server 将流量路由到可用性组。
  • 通过模拟故障切换来验证集群是否正常运行。

费用

本教程使用 Google Cloud 的计费组件,包括:

您可以使用价格计算器根据您的预计用量来估算费用。

准备工作

如需完成本指南,您需要以下各项:

  • 至少具有一台网域控制器的 Active Directory 网域。您可以使用代管式 Microsoft AD 创建 Active Directory 网域。或者,您也可以在 Compute Engine 上部署自定义 Active Directory 环境,并设置专用 DNS 转发可用区,用于将 DNS 查询转发到您的网域控制器。
  • 有权将计算机加入网域并且能够使用 RDP 登录的 Active Directory 用户。如果您使用的是代管式 Microsoft AD,则可以使用 setupadmin 用户。
  • 连接到您的 Active Directory 网域控制器的 Google Cloud 项目和 VPC。
  • 用于 WSFC 虚拟机实例的子网。

确保您已查看多写入器模式下的永久性磁盘的当前限制,然后选择一个磁盘在多写入器模式下可用的可用区。

为完成本指南,您还需要一个 Google Cloud 项目:

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

完成本教程后,您可以删除所创建的资源以避免继续计费。如需了解详情,请参阅清理

准备项目和网络

如需准备 Google Cloud 项目和 VPC 以便部署 SQL Server FCI,请执行以下操作:

  1. 在 Google Cloud 控制台中,点击激活 Cloud Shell 激活 Cloud Shell。 按钮,以打开 Cloud Shell

    转到 Google Cloud 控制台

  2. 初始化以下变量:

    VPC_NAME=VPC_NAME
    SUBNET_NAME=SUBNET_NAME
    

    其中:

    • VPC_NAME:您的 VPC 的名称
    • SUBNET_NAME:您的子网的名称
  3. 设置默认项目 ID

    gcloud config set project PROJECT_ID
    

    PROJECT_ID 替换为您的 Google Cloud 项目的 ID。

  4. 设置默认可用区:

    gcloud config set compute/zone ZONE
    

    ZONE 替换为要在其中部署的可用区的 ID。

创建防火墙规则

如需允许客户端连接到 SQL Server,允许在 WSFC 节点之间进行通信,并使负载均衡器能够执行健康检查,您需要创建多个防火墙规则。如需简化这些防火墙规则的创建操作,您可以使用网络标记

  • 2 个 WSFC 节点由 wsfc-node 标记注释。
  • 所有服务器(包括见证者)均由 wsfc 标记注释。

创建使用这些网络标记的防火墙规则:

  1. 返回到现有的 Cloud Shell 会话。
  2. 为 WSFC 节点创建防火墙规则:

    SUBNET_CIDR=$(gcloud compute networks subnets describe $SUBNET_NAME --format=value\('ipCidrRange'\))
    
    gcloud compute firewall-rules create allow-all-between-wsfc-nodes \
      --direction=INGRESS \
      --action=allow \
      --rules=tcp,udp,icmp \
      --enable-logging \
      --source-tags=wsfc \
      --target-tags=wsfc \
      --network=$VPC_NAME \
      --priority 10000
    
    gcloud compute firewall-rules create allow-sql-to-wsfc-nodes \
      --direction=INGRESS \
      --action=allow \
      --rules=tcp:1433 \
      --enable-logging \
      --source-ranges=$SUBNET_CIDR \
      --target-tags=wsfc-node \
      --network=$VPC_NAME \
      --priority 10000
    
  3. 创建允许从 Google Cloud 探测器的 IP 地址范围进行健康检查的防火墙规则:(使用 DNN 配置时不需要)

    gcloud compute firewall-rules create allow-health-check-to-wsfc-nodes \
      --direction=INGRESS \
      --action=allow \
      --rules=tcp \
      --source-ranges=130.211.0.0/22,35.191.0.0/16 \
      --target-tags=wsfc-node \
      --network=$VPC_NAME \
      --priority 10000
    

创建虚拟机实例

您现在为故障切换集群部署两个虚拟机实例。在任何时间点,只有其中一个虚拟机充当活跃 FCI 节点,而另一个节点充当故障切换节点。这两个虚拟机实例必须:

  • 位于同一可用区,以便它们可以使用相同的永久性磁盘。
  • 安装了 Windows Server 故障切换集群和 SQL Server。
  • 已启用 Compute Engine WSFC 支持

使用预安装了 SQL Server 2022 的 SQL Server 高级映像

为了在故障切换情景中提供决定性投票权,实现仲裁,您需要部署第三个虚拟机作为文件共享见证者

  1. 返回到现有的 Cloud Shell 会话。
  2. 创建将 WSFC 节点分布在底层数据中心基础架构中的分散放置政策,以使其不共享同一宿主机或电源系统:

    ZONE=$(gcloud config get-value compute/zone)
    gcloud compute resource-policies create group-placement spread-placement \
      --availability-domain-count 2 \
      --region ${ZONE::-2}
    
  3. 为 WSFC 节点创建专用脚本。该脚本会安装必要的 Windows 功能,并为 WSFC 和 SQL Server 创建防火墙规则:

    cat << "EOF" > specialize-node.ps1
    
    $ErrorActionPreference = "stop"
    
    # Install required Windows features
    Install-WindowsFeature Failover-Clustering -IncludeManagementTools
    Install-WindowsFeature RSAT-AD-PowerShell
    
    # Open firewall for WSFC
    netsh advfirewall firewall add rule name="Allow SQL Server health check" dir=in action=allow protocol=TCP localport=59997
    
    # Open firewall for SQL Server
    netsh advfirewall firewall add rule name="Allow SQL Server" dir=in action=allow protocol=TCP localport=1433
    
    EOF
    
  4. 通过将元数据键 enable-wsfc 设置为 true,创建虚拟机实例并在 WSFC 节点上启用 Windows Server 故障切换集群代理:

    MACHINE_TYPE=n2-standard-8
    
    gcloud compute instances create node-1 \
      --resource-policies spread-placement \
      --machine-type $MACHINE_TYPE \
      --subnet $SUBNET_NAME \
      --image-family sql-ent-2022-win-2022 \
      --image-project windows-sql-cloud \
      --tags wsfc,wsfc-node \
      --boot-disk-size 50 \
      --boot-disk-type pd-ssd \
      --boot-disk-device-name "node-1" \
      --metadata enable-wsfc=true \
      --metadata-from-file=sysprep-specialize-script-ps1=specialize-node.ps1
    
    gcloud compute instances create node-2 \
      --resource-policies spread-placement \
      --machine-type $MACHINE_TYPE \
      --subnet $SUBNET_NAME \
      --image-family sql-ent-2022-win-2022 \
      --image-project windows-sql-cloud \
      --tags wsfc,wsfc-node \
      --boot-disk-size 50 \
      --boot-disk-type pd-ssd \
      --boot-disk-device-name "node-2" \
      --metadata enable-wsfc=true \
      --metadata-from-file=sysprep-specialize-script-ps1=specialize-node.ps1
    
    gcloud compute instances create "witness" \
      --machine-type n2-standard-2 \
      --subnet $SUBNET_NAME \
      --image-family=windows-2022 \
      --image-project=windows-cloud \
      --tags wsfc \
      --boot-disk-size 50 \
      --boot-disk-type pd-ssd \
      --metadata sysprep-specialize-script-ps1="add-windowsfeature FS-FileServer"
    
  5. 要将 3 个虚拟机实例加入 Active Directory,请对 3 个虚拟机实例中的每个实例执行以下操作:

    1. 通过查看虚拟机的串行端口输出来监控其初始化过程:

      gcloud compute instances tail-serial-port-output NAME
      

      NAME 替换为虚拟机实例的名称。

      等待大约 3 分钟,直到您看到输出 Instance setup finished,然后按 Ctrl+C。此时,该虚拟机实例已准备就绪,可以使用了。

    2. 为虚拟机实例创建用户名和密码

    3. 使用远程桌面连接到虚拟机,然后使用上一步中创建的用户名和密码登录。

    4. 右键点击开始按钮(或者按 Win+X),然后点击 Windows PowerShell(管理员)

    5. 点击以确认提升权限提示。

    6. 将该计算机加入您的 Active Directory 网域,然后重启:

      Add-Computer -Domain DOMAIN -Restart
      

      DOMAIN 替换为您的 Active Directory 网域的 DNS 名称。

      等待重启过程完成,大约需要 1 分钟。

以多写入者模式创建永久性磁盘

现在,您将以多写入者模式创建 3 个永久性磁盘,并将每个永久性磁盘挂接到两个 WSFC 节点。

  1. 返回到现有的 Cloud Shell 会话。
  2. 创建 3 个共享永久性磁盘:

    PD_SIZE=50
    
    gcloud beta compute disks create datadisk-1 \
      --size $PD_SIZE \
      --type pd-ssd \
      --multi-writer \
      --zone $(gcloud config get-value compute/zone)
    gcloud beta compute disks create datadisk-2 \
      --size $PD_SIZE \
      --type pd-ssd \
      --multi-writer \
      --zone $(gcloud config get-value compute/zone)
    gcloud beta compute disks create datadisk-3 \
      --size $PD_SIZE \
      --type pd-ssd \
      --multi-writer \
      --zone $(gcloud config get-value compute/zone)
    
  3. 将磁盘挂接到 node-1

    gcloud compute instances attach-disk node-1 --disk datadisk-1
    gcloud compute instances attach-disk node-1 --disk datadisk-2
    gcloud compute instances attach-disk node-1 --disk datadisk-3
    
  4. 将磁盘挂接到 node-2

    gcloud compute instances attach-disk node-2 --disk datadisk-1
    gcloud compute instances attach-disk node-2 --disk datadisk-2
    gcloud compute instances attach-disk node-2 --disk datadisk-3
    

预留集群 IP 地址

现在,您需要在 VPC 中预留两个静态 IP 地址。一个 IP 地址用作 WSFC 集群 IP 地址,另一个地址由内部负载均衡器使用。

  1. 为内部负载均衡器预留静态 IP 地址并在名为 LOADBALANCER_ADDRESS 的新环境变量中捕获该地址:

    gcloud compute addresses create wsfc \
      --region $(gcloud config get-value compute/zone | rev | cut -c 3- | rev) \
      --subnet $SUBNET_NAME
    
    LOADBALANCER_ADDRESS=$(gcloud compute addresses describe wsfc \
      --region $(gcloud config get-value compute/zone | rev | cut -c 3- | rev) \
      --format=value\(address\)) && \
    echo "Load Balancer IP: $LOADBALANCER_ADDRESS"
    

    请记下该 IP 地址,稍后您将用到它。

  2. 预留另一个用作集群 IP 地址的静态 IP 地址:(使用 DNN 配置时不需要)

    gcloud compute addresses create wsfc-cluster \
      --subnet $SUBNET_NAME \
      --region $(gcloud config get-value compute/zone | rev | cut -c 3- | rev) && \
    CLUSTER_ADDRESS=$(gcloud compute addresses describe wsfc-cluster \
      --region $(gcloud config get-value compute/zone | rev | cut -c 3- | rev) \
      --format=value\(address\)) && \
    echo "Cluster IP: $CLUSTER_ADDRESS"
    

    请记下该 IP 地址,稍后您将用到它。

您的项目和 VPC 现在已准备好部署 WSFC 和 SQL Server。

创建见证者文件共享

如需准备 witness 以充当文件共享见证者,请创建文件共享并授予自己和两个 WSFC 节点对文件共享的访问权限:

  1. 使用远程桌面连接到 witness。 使用您的网域用户账号登录。
  2. 右键点击开始按钮(或者按 Win+X),然后点击 Windows PowerShell(管理员)
  3. 点击以确认提升权限提示。
  4. 创建见证者文件夹并共享该文件夹:

    New-Item "C:\QWitness" –type directory
    
    icacls C:\QWitness\ /grant 'node-1$:(OI)(CI)(M)'
    icacls C:\QWitness\ /grant 'node-2$:(OI)(CI)(M)'
    
    New-SmbShare `
      -Name QWitness `
      -Path "C:\QWitness" `
      -Description "SQL File Share Witness" `
      -FullAccess  $env:username,node-1$,node-2$
    

部署故障切换集群

您现在可以使用虚拟机实例部署 WSFC 和 SQL Server。

部署 WSFC

您现在即可创建故障切换集群。

  1. 使用远程桌面连接到 node-1。 使用您的网域用户账号登录。
  2. 右键点击开始按钮(或者按 Win+X),然后点击 Windows PowerShell(管理员)
  3. 点击以确认提升权限提示。
  4. 创建新集群:

    • 对于负载均衡器配置
    New-Cluster `
      -Name sql-cluster `
      -Node node-1,node-2 `
      -NoStorage `
      -StaticAddress CLUSTER_ADDRESS
    

    CLUSTER_ADDRESS 替换为您之前创建的集群 IP 地址。

    • 对于 DNN 配置
    New-Cluster `
      -Name sql-cluster `
      -Node node-1,node-2 `
      -NoStorage `
      -ManagementPointNetworkType Distributed
    
  5. 返回 witness 上的 PowerShell 会话,并授予集群的虚拟机对象访问文件共享的权限:

    icacls C:\QWitness\ /grant 'sql-cluster$:(OI)(CI)(M)'
    Grant-SmbShareAccess `
      -Name QWitness `
      -AccountName 'sql-cluster$' `
      -AccessRight Full `
      -Force
    
  6. 返回 node-1 上的 PowerShell 会话,并将集群配置为使用 witness 上的文件共享作为集群仲裁:

    Set-ClusterQuorum -FileShareWitness \\witness\QWitness
    
  7. 验证是否已成功创建集群:

    Test-Cluster
    

    您可能会看到一些可以放心地忽略的警告:

    WARNING: System Configuration - Validate All Drivers Signed: The test reported some warnings..
    WARNING: Network - Validate Network Communication: The test reported some warnings..
    WARNING:
    Test Result:
    HadUnselectedTests, ClusterConditionallyApproved
    Testing has completed for the tests you selected. You should review the warnings in the Report.  A cluster solution is
    supported by Microsoft only if you run all cluster validation tests, and all tests succeed (with or without warnings).
    

    您还可以通过运行 cluadmin.msc 来启动故障切换集群管理器 MMC 管理单元以查看集群的健康状况。

  8. 如果您使用的是代管式 AD,请将 WSFC 使用的计算机账号添加到 Cloud 服务网域加入账号组,以便它可以将计算机加入网域:

    Add-ADGroupMember `
      -Identity "Cloud Service Domain Join Accounts" `
      -Members sql-cluster$
    

创建存储空间池

现在,您可以创建一个存储空间池(用于将您之前创建的三个永久性磁盘组合在一起),并使用该存储空间池创建集群共享卷:

  1. 返回 node-1 上的 PowerShell 会话。
  2. 创建使用 3 个永久性磁盘的新存储空间池:

    $NodeName = [System.Net.Dns]::GetHostName()
    
    $ClusterDisks = Get-PhysicalDisk -CanPool $True |
      Where-Object { ($_ |
        Get-PhysicalDiskStorageNodeView |
        Select-Object -Property StorageNodeObjectId) -like ('*' + $NodeName + '*') }
    
    $Pool = New-StoragePool `
      -StorageSubsystemFriendlyName 'Clustered*' `
      -FriendlyName FciPool `
      -PhysicalDisks $ClusterDisks `
      -ResiliencySettingNameDefault Simple `
      -Verbose
    
  3. 在存储空间池上,创建一个使用 ReFS 集群共享卷版本和 64 KB 集群大小的新卷:

    $Pool | New-Volume `
      -FriendlyName FciVolume `
      -FileSystem CSVFS_ReFS `
      -Size 100GB `
      -AllocationUnitSize 65536
    

    由于底层永久性磁盘挂接到这两个虚拟机实例,因此该卷会自动显示在 node-2 上。

  4. 打开故障切换集群管理器 MMC 管理单元:

    cluadmin.msc
    
  5. 在左侧窗口窗格中,导航到故障切换集群管理器 > sql-cluster > 存储 > 磁盘

  6. 右键点击集群虚拟磁盘 (FciVolume),然后选择从集群共享卷中移除

  7. 选择集群虚拟磁盘 (FciVolume)

  8. 在底部的标签页中,右键点击卷并选择更改驱动器盘符

  9. 选择盘符 D,然后点击确定

测试存储池故障切换

(可选)您现在可以测试存储空间池故障切换功能是否正常运行:

  1. 使用远程桌面连接到 node-2。 使用您的网域用户账号登录。
  2. 右键点击开始按钮(或者按 Win+X),然后选择运行
  3. 输入 cluadmin.msc 并选择确定
  4. 在左侧窗口窗格中,导航到故障切换集群管理器 > sql-cluster > 存储 > 池

    您应该会看到一个名称为集群池 1 的池,所有者节点设置为 node-1

  5. 返回 Cloud Shell 并重置 node-1 虚拟机以模拟故障切换:

    gcloud compute instances reset node-1
    
  6. 返回 node-2 上的故障切换集群管理器

  7. 反复按 F5 刷新视图以观察存储空间池的状态。

    大约 30 秒后,所有者节点应自动切换到 node-2

移除默认的 SQL Server 安装

现在,您可以从两个节点中移除默认的 SQL Server 安装,并将其替换为新的 FCI 配置。

对于 node-1node-2 这两个 WSFC 节点中的每一个节点,执行以下步骤:

  1. 右键点击开始按钮(或者按 Win+X),然后点击 Windows PowerShell(管理员)
  2. 点击以确认提升权限提示。
  3. 移除默认的 SQL Server 实例:

    C:\sql_server_install\Setup.exe /Action=Uninstall /FEATURES=SQL,AS,IS,RS /INSTANCENAME=MSSQLSERVER /Q
    
  4. 移除 Microsoft OLE 驱动程序:

    Get-Package -Name "Microsoft OLE*" | Uninstall-Package -Force
    
  5. 移除 Microsoft ODBC 驱动程序:

    Get-Package -Name "Microsoft ODBC*" | Uninstall-Package -Force
    
  6. 重启该计算机:

    Restart-Computer
    
  7. 等待重启过程完成,大约需要 1 分钟。

安装 SQL Server FCI

在安装新的 FCI 配置之前,请验证 node-1 是否为集群中的活跃节点:

  1. 使用远程桌面重新连接到 node-1,然后使用您的网域用户登录。
  2. 右键点击开始按钮(或者按 Win+X),然后选择运行
  3. 输入 cluadmin.msc 并选择确定
  4. 在左侧窗口窗格中,导航到故障切换集群管理器 > sql-cluster

    验证当前宿主机服务器是否设置为 node-1

    如果当前主机服务器设为 node-2,请右键点击左侧窗口窗格中的 sql-cluster,然后选择更多操作 > 移动核心集群资源 > 选择节点… > 节点-1,然后点击确定

  5. 在左侧窗口窗格中,导航到故障切换集群管理器 > sql-cluster > 存储 > 池

    验证集群 1所有者节点是否已设置为 node-1

    如果所有者节点设为 node-2,请右键点击该池,依次选择移动 > 选择节点 > 节点-1,然后点击确定

现在,您可以在 node-1 上创建一个新的 SQL Server 故障切换集群安装:

  1. 右键点击开始按钮(或者按 Win+X),然后点击 Windows PowerShell(管理员)
  2. 点击以确认提升权限提示。
  3. 为 SQL 服务器和 SQL 代理创建网域用户账号并分配密码:

    $Credential = Get-Credential -UserName sql_server -Message 'Enter password'
    New-ADUser `
      -Name "sql_server" `
      -Description "SQL Agent and SQL Admin account." `
      -AccountPassword $Credential.Password `
      -Enabled $true -PasswordNeverExpires $true
    
  4. 启动 SQL Server 设置:

    & c:\sql_server_install\setup.exe
    
  5. 在左侧菜单中,选择安装

  6. 选择新建 SQL Server 故障切换集群安装

  7. 版本页面上,选中我只有 SQL Server 许可,然后选择下一步

  8. 许可条款页面上,查看条款;如果接受条款,请选择下一步

  9. Microsoft Update 页面上,选择下一步开始安装。

  10. 安装故障切换集群规则页面上,您会看到警告 MSCS 集群验证警告Windows 防火墙。您可以忽略这些警告,然后选择下一步

  11. 功能选择页面上,选择数据库引擎服务,然后选择下一步

  12. 实例配置页面上,输入 sql 作为网络名称,然后选择下一步

  13. 集群资源组页面上,保留默认设置,然后选择下一步

  14. 集群磁盘选择页面上,选择集群虚拟磁盘 (FciVolume),然后选择下一步

  15. 集群网络配置页面上,配置以下设置,然后选择下一步

    • DHCP:清除。
    • IP 地址:输入内部负载均衡器的 IP 地址。
  16. 服务器配置页面上,为 SQL Server 代理SQL Server 数据库引擎配置以下设置:

    • 账号名称DOMAIN\sql_server,其中 DOMAIN 是 Active Directory 网域的 NetBIOS 名称
    • 密码:输入您之前创建的密码
  17. 选择排序标签页并选择要使用的排序规则。然后点击下一步

  18. 数据库引擎配置页面上,选择添加当前用户以将当前用户指定为 SQL Server 管理员。然后,选择下一步

  19. 准备好安装页面上,查看设置,然后选择安装

  20. 安装完成后,选择关闭

现在,将 node-2 添加到 SQL Server 故障切换集群:

  1. 使用远程桌面连接到 node-2,然后使用您的网域用户登录。
  2. 右键点击开始按钮(或者按 Win+X),然后点击 Windows PowerShell(管理员)
  3. 点击以确认提升权限提示。
  4. 启动 SQL Server 设置:

    & c:\sql_server_install\setup.exe
    
  5. 在左侧菜单中,选择安装

  6. 选择向 SQL Server 故障切换集群添加节点

  7. 按照安装向导的说明操作并接受默认设置,直到您到达服务账号页面。

  8. 服务账号页面上,输入您之前为 SQL Server 代理SQL Server 数据库引擎创建的密码。然后,选择下一步

  9. 准备好安装页面上,查看设置,然后选择安装

  10. 安装完成后,选择关闭

配置健康检查

在最后一步中,配置集群以公开可供内部负载均衡器使用的健康检查端点:

  1. 返回 node-2 上的 PowerShell 会话
  2. 使用负载均衡器的 IP 地址初始化变量。

    $LoadBalancerIP = 'IP_ADDRESS'
    

    IP_ADDRESS 替换为您之前预留的 wsfc 地址的 IP 地址。

  3. 配置故障切换集群以响应健康检查服务:

    $SqlGroup = Get-ClusterGroup |
      Where-Object {$_.Name.StartsWith("SQL Server")}
    $SqlIpAddress = Get-ClusterResource |
      Where-Object {$_.Name.StartsWith("SQL IP Address")}
    
    $SqlIpAddress | Set-ClusterParameter -Multiple @{
     'Address'=$LoadBalancerIP;
     'ProbePort'= 59997;
     'SubnetMask'='255.255.255.255';
     'Network'= (Get-ClusterNetwork).Name;
     'EnableDhcp'=0; }
    
  4. 重启集群资源:

    $SqlIpAddress | Stop-ClusterResource
    $SqlIpAddress | Start-ClusterResource
    
  5. 重启集群组:

    $SqlGroup | Stop-ClusterGroup
    $SqlGroup | Start-ClusterGroup
    

创建内部负载均衡器

如需为 SQL Server 客户端提供单个端点,您现在需要部署内部负载均衡器,该负载均衡器会使用健康检查来确保流量定向到 WSFC 的活跃节点。

  1. 返回到现有的 Cloud Shell 会话。
  2. 创建非代管式实例组,并将两个节点添加到该组:

    gcloud compute instance-groups unmanaged create wsfc-group
    gcloud compute instance-groups unmanaged add-instances wsfc-group --instances node-1,node-2
    
  3. 创建健康检查,负载均衡器用其确定哪一个是活动节点。

    gcloud compute health-checks create tcp wsfc-healthcheck \
      --check-interval="2s" \
      --healthy-threshold=1 \
      --unhealthy-threshold=2 \
      --port=59997 \
      --timeout="1s"
    

    健康检查探测端口 59997,即您之前为 WSFC 集群 IP 地址配置为 ProbePort 的端口。

  4. 创建后端服务并添加实例组:

    gcloud compute backend-services create wsfc-backend \
      --load-balancing-scheme internal \
      --region $(gcloud config get-value compute/zone | rev | cut -c 3- | rev) \
      --health-checks wsfc-healthcheck \
      --protocol tcp
    gcloud compute backend-services add-backend wsfc-backend \
      --instance-group wsfc-group \
      --instance-group-zone $(gcloud config get-value compute/zone) \
      --region $(gcloud config get-value compute/zone | rev | cut -c 3- | rev)
    
  5. 创建内部负载均衡器:

    gcloud compute forwarding-rules create wsfc-sql \
      --load-balancing-scheme internal \
      --address $LOADBALANCER_ADDRESS \
      --ports 1433 \
      --network $VPC_NAME \
      --subnet $SUBNET_NAME \
      --region $(gcloud config get-value compute/zone | rev | cut -c 3- | rev) \
      --backend-service wsfc-backend
    

配置 DNN 资源和 DNN DNS 名称

与内部负载均衡器类似,DNN 资源充当 SQL Server 客户端的单个网关。在故障切换期间,集群会将流量无缝路由到处于活动状态的 SQL Server FCI 节点。客户端使用 DNS 名称连接到 SQL Server FCI。

  1. 返回 node-1 上的 PowerShell 会话。
  2. 执行脚本以创建 DNN 资源

      $DNNResourceName='fci-dnn'
      $DNN_DNSName='fcidnn'
    
      # create the DNN resource
      Add-ClusterResource -Name $DNNResourceName -ResourceType 'Distributed Network Name' -Group 'SQL Server (MSSQLSERVER)'
    
      # set the DNS name of the DNN resource
      Get-ClusterResource -Name $DNNResourceName | Set-ClusterParameter -Name DnsName -Value $DNN_DNSName
    
      # start the DNN resource
      Start-ClusterResource -Name $DNNResourceName
    
  3. 重启 node-1node-2

测试故障转移集群

您已完成故障切换集群的安装,但仍需测试集群能否正常工作。

准备客户端

创建一个新的虚拟机实例,用于连接到故障切换集群:

  1. 返回到现有的 Cloud Shell 会话。
  2. 创建一个新的虚拟机实例:

    gcloud compute instances create sqlclient \
      --machine-type n2-standard-2 \
      --subnet $SUBNET_NAME \
      --image-family sql-ent-2022-win-2022 \
      --image-project windows-sql-cloud \
      --boot-disk-size 50 \
      --boot-disk-type pd-ssd
    
  3. 通过查看虚拟机的串行端口输出来监控其初始化过程:

    gcloud compute instances tail-serial-port-output sqlclient
    

    等待 3 分钟直到您看到输出实例设置完成,然后按 Ctrl+C。此时,该虚拟机实例已准备就绪,可以使用了。

  4. 为虚拟机实例创建用户名和密码

  5. 使用远程桌面连接到虚拟机,然后使用上一步中创建的用户名和密码登录。

  6. 右键点击开始按钮(或者按 Win+X),然后点击 Windows PowerShell(管理员)

  7. 点击以确认提升权限提示。

  8. 将该计算机加入您的 Active Directory 网域:

    Add-Computer -Domain DOMAIN
    

    DOMAIN 替换为您的 Active Directory 网域的 DNS 名称。

  9. 重启该计算机:

    Restart-Computer
    

    等待重启过程完成,大约需要 1 分钟。

运行测试

使用 sqlclient 虚拟机测试是否可以连接到故障切换集群,并验证故障切换是否正常运行:

  1. 使用远程桌面连接到 sqlclient,然后使用您的网域用户登录。
  2. 右键点击开始按钮(或者按 Win+X),然后点击 Windows PowerShell
  3. 使用 SQL Server 集群的网络名称 sql 连接到该集群,并查询 dm_os_cluster_nodes 表:

    & "$env:ProgramFiles\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\SQLCMD.EXE" `
       -S SQL_SERVER_NAME -E -Q "SELECT * FROM sys.dm_os_cluster_nodes"
    

    SQL_SERVER_NAME 替换为 sql(适用于负载均衡器配置)或 fcidnn(适用于 DNN 配置)。

    输出应如下所示:

    NodeName                       status      status_description is_current_owner
    ------------------------------ ----------- ------------------ ----------------
    NODE-1                                   0 up                                1
    NODE-2                                   0 up                                0
    
    (2 rows affected)
    

    请注意,node-1 是 SQL Server 故障切换集群资源的当前所有者。

  4. 返回到 Cloud Shell 并关闭节点-1 虚拟机以测试故障切换情景。

    gcloud compute instances stop node-1
    
  5. 重复查询:

    & "$env:ProgramFiles\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\SQLCMD.EXE" `
       -S SQL_SERVER_NAME -E -Q "SELECT * FROM sys.dm_os_cluster_nodes"
    

    SQL_SERVER_NAME 替换为 sql(适用于负载均衡器配置)或 fcidnn(适用于 DNN 配置)。

    现在,输出的内容应如下所示:

    NodeName                       status      status_description is_current_owner
    ------------------------------ ----------- ------------------ ----------------
    NODE-1                                   1 down                              0
    NODE-2                                   0 up                                1
    
    (2 rows affected)
    

    请注意,尽管 node-1 已丢失,但查询仍然成功执行,系统显示 node-2 现在是故障切换集群的当前所有者。

清除数据

完成本教程后,您可以清理您创建的资源,让它们停止使用配额,以免产生费用。以下部分介绍如何删除或关闭这些资源。

删除项目

为了避免产生费用,最简单的方法是删除您为本教程创建的项目。

如需删除项目,请执行以下操作:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

后续步骤