通过同步提交配置 SQL Server AlwaysOn 可用性组


通过 Microsoft SQL Server AlwaysOn 可用性组 (AG),您可以跨多个 SQL Server Enterprise 实例复制数据库。

SQL Server 故障切换集群实例类似,AlwaysOn 可用性组使用 Windows Server 故障切换集群 (WSFC) 来实现高可用性。但这两种功能在以下方面有所不同:

AlwaysOn 可用性组 故障切换集群实例
故障切换的范围 数据库组 实例
存储 未共享 已共享

如需详细了解比较,请参阅故障切换集群实例与可用性组的比较

AlwaysOn 可用性组支持多种可用性模式。本教程介绍如何在同步提交模式中部署 AlwaysOn 可用性组,以便为一个或多个数据库实现高可用性。

在设置过程中,您将创建三个虚拟机实例。node-1node-2 两个虚拟机实例可充当 WSFC 节点并运行 SQL Server。第三个虚拟机实例 witness 用于在故障切换情景中实现仲裁。三个虚拟机实例分布在三个可用区,并且共享一个子网。

使用 SQL Server AlwaysOn 可用性组,您可以跨两个 SQL Server 实例同步复制示例数据库 bookshelf

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

架构

架构

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

目标

费用

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

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

准备工作

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

为完成本指南,您还需要一个 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 AlwaysOn 可用性组,请执行以下操作:

  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/region REGION
    

    REGION 替换为要在其中部署的区域的 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 范围的健康检查的防火墙规则。

    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
    

创建虚拟机实例

您现在为故障切换集群部署两个虚拟机实例。在任意时间点,其中一个虚拟机托管 SQL Server 数据库的主副本,而另一个节点托管辅助副本。这两个虚拟机实例必须:

  • 位于同一区域,以便内部直通式网络负载均衡器可以访问它们(不适用于 DNN)
  • 已安装 WSFC 和 SQL Server。
  • 已启用 Compute Engine WSFC 支持

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

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

  1. 返回到现有的 Cloud Shell 会话。
  2. 为 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
    
    # Open firewall for SQL Server replication
    netsh advfirewall firewall add rule name="Allow SQL Server replication" dir=in action=allow protocol=TCP localport=5022
    
    # Format data disk
    Get-Disk |
     Where partitionstyle -eq 'RAW' |
     Initialize-Disk -PartitionStyle MBR -PassThru |
     New-Partition -AssignDriveLetter -UseMaximumSize |
     Format-Volume -FileSystem NTFS -NewFileSystemLabel 'Data' -Confirm:$false
    
    # Create data and log folders for SQL Server
    md d:\Data
    md d:\Logs
    EOF
    
  3. 创建虚拟机实例。在充当 WSFC 节点的两个虚拟机上,通过将元数据键 enable-wsfc 设置为 true,再挂接一个数据磁盘并启用 Windows Server 故障切换集群:

    REGION=$(gcloud config get-value compute/region)
    PD_SIZE=200
    MACHINE_TYPE=n2-standard-8
    
    gcloud compute instances create node-1 \
      --zone $REGION-a \
      --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" \
      --create-disk=name=node-1-datadisk,size=$PD_SIZE,type=pd-ssd,auto-delete=no \
      --metadata enable-wsfc=true \
      --metadata-from-file=sysprep-specialize-script-ps1=specialize-node.ps1
    
    gcloud compute instances create node-2 \
      --zone $REGION-b \
      --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" \
      --create-disk=name=node-2-datadisk,size=$PD_SIZE,type=pd-ssd,auto-delete=no \
      --metadata enable-wsfc=true \
      --metadata-from-file=sysprep-specialize-script-ps1=specialize-node.ps1
    
    gcloud compute instances create "witness" \
      --zone $REGION-c \
      --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"
    
  4. 若要将 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 分钟。

预留集群 IP 地址

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

  1. 预留一个用作集群 IP 的静态 IP 地址:

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

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

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

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

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

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

部署故障切换集群

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

正在准备 SQL Server

在 Active Directory 中为 SQL Server 创建一个新用户账户:

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

    $Credential = Get-Credential -UserName sql_server -Message 'Enter password'
    New-ADUser `
      -Name "sql_server" `
      -Description "SQL Admin account." `
      -AccountPassword $Credential.Password `
      -Enabled $true -PasswordNeverExpires $true
    

如需配置 SQL Server,请对 node-1node-2 执行以下步骤:

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

    重命名 SQL Server 实例,使其名称与主机名匹配:

    $OLD_NAME = Invoke-Sqlcmd -Query "
      select @@SERVERNAME;
      GO" | ConvertTo-Csv | SELECT -Skip 2
    $OLD_NAME = $OLD_NAME.Replace('"', '')
    Invoke-Sqlcmd -Query "
      sp_dropserver '$OLD_NAME';
      GO
      sp_addserver '$env:computername', local;
      GO"
    Restart-Service -Name MSSQLSERVER
    
  2. 打开 SQL Server 配置管理器

  3. 在导航窗格中,选择 SQL Server 服务

  4. 在服务列表中,右键点击 SQL Server (MSSQLSERVER),然后选择属性

  5. 登录身份下,更改账号:

    • 账号名称DOMAIN\sql_server,其中 DOMAIN 是 Active Directory 域的 NetBIOS 名称。
    • 密码:输入您之前选择的密码。
  6. 点击确定

  7. 当系统提示您重启 SQL Server 时,请选择

SQL Server 现在在网域用户账号下运行。

正在创建文件共享

witness 上创建两个文件共享,以便虚拟机实例可以存储 SQL Server 备份并充当文件共享见证:

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

    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$
    
  5. 创建另一个文件共享存储备份并授予 SQL Server 完整访问权限:

    New-Item "C:\Backup" –type directory
    New-SmbShare `
      -Name Backup `
      -Path "C:\Backup" `
      -Description "SQL Backup" `
      -FullAccess  $env:USERDOMAIN\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$
    
  9. 在两个节点上启用 AlwaysOn 可用性组:

    Enable-SqlAlwaysOn -ServerInstance node-1 -Force
    Enable-SqlAlwaysOn -ServerInstance node-2 -Force
    

正在创建可用性组

您现在可以创建一个示例数据库 bookshelf,将其包含在名为 bookshelf-ag 的新可用性组中,并配置高可用性。

创建数据库

创建一个新数据库。就本教程而言,数据库不需要包含任何数据。

  1. 返回到 node-1 上远程桌面会话。
  2. 打开 SQL Server Management Studio
  3. 连接到服务器对话框中,验证服务器名称是否设置为 NODE-1,然后选择连接
  4. 在菜单中,依次选择文件 > 新建 > 使用当前连接查询
  5. 将以下 SQL 脚本粘贴到编辑器中:

    -- Create a sample database
    CREATE DATABASE bookshelf ON PRIMARY (
      NAME = 'bookshelf',
      FILENAME='d:\Data\bookshelf.mdf',
      SIZE = 256MB,
      MAXSIZE = UNLIMITED,
      FILEGROWTH = 256MB)
    LOG ON (
      NAME = 'bookshelf_log',
      FILENAME='d:\Logs\bookshelf.ldf',
      SIZE = 256MB,
      MAXSIZE = UNLIMITED,
      FILEGROWTH = 256MB)
    GO
    
    USE [bookshelf]
    SET ANSI_NULLS ON
    SET QUOTED_IDENTIFIER ON
    GO
    
    -- Create sample table
    CREATE TABLE [dbo].[Books] (
      [Id] [bigint] IDENTITY(1,1) NOT NULL,
      [Title] [nvarchar](max) NOT NULL,
      [Author] [nvarchar](max) NULL,
      [PublishedDate] [datetime] NULL,
      [ImageUrl] [nvarchar](max) NULL,
      [Description] [nvarchar](max) NULL,
      [CreatedById] [nvarchar](max) NULL,
      CONSTRAINT [PK_dbo.Books] PRIMARY KEY CLUSTERED ([Id] ASC) WITH (
        PAD_INDEX = OFF,
        STATISTICS_NORECOMPUTE = OFF,
        IGNORE_DUP_KEY = OFF,
        ALLOW_ROW_LOCKS = ON,
        ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    
    -- Create a backup
    EXEC dbo.sp_changedbowner @loginame = 'sa', @map = false;
      ALTER DATABASE [bookshelf] SET RECOVERY FULL;
      GO
      BACKUP DATABASE bookshelf to disk = '\\witness\Backup\bookshelf.bak' WITH INIT
    GO
    

    该脚本会创建一个包含单个表的新数据库,并执行初始备份到 witness

  6. 选择执行以运行 SQL 脚本。

配置高可用性

  1. Object Explorer 窗口中,右键点击 AlwaysOn High Availability,然后选择 New Availability Group Wizard
  2. 指定选项页面上,将可用性组名称设置为 bookshelf-ag,然后选择下一步
  3. 选择数据库页面上,选择 bookshelf 数据库,然后选择下一步
  4. 指定副本页面上,选择副本标签页:

    1. 选择添加副本
    2. 连接到服务器对话框中,输入服务器名称 node-2,然后选择连接

      可用性副本列表现在包含 SQL Server 实例、node-1node-2

    3. 将两个实例的可用性模式设置为同步提交

    4. 将两个实例的自动故障切换设置为启用

    5. 选择 Listener 标签页 **

      1. 选择创建可用性组侦听器
      2. 输入以下设置:

        • 侦听器 DNS 名称bookshelf
        • 端口1433
        • 网络模式静态 IP
      3. 选择添加,然后输入您之前创建的负载均衡器 IP 地址。然后选择确定

    6. 选择下一步

  5. 选择数据同步页面上,选择自动进行种子设定

  6. 验证页面上,验证所有检查是否都已成功。

  7. 摘要页面上,选择完成

  8. 结果页面上,选择关闭

配置健康检查

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

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

    $LoadBalancerIP = 'IP_ADDRESS'
    

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

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

    $SqlIpAddress = Get-ClusterResource |
      Where-Object {$_.ResourceType -eq "IP Address"} |
      Where-Object {$_.Name.StartsWith("bookshelf")}
    
    $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
    

创建内部负载均衡器

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

  1. 返回到现有的 Cloud Shell 会话。
  2. 创建两个非代管式实例组(每个可用区一个),并将这两个节点添加到组中:

    REGION=$(gcloud config get-value compute/region)
    
    gcloud compute instance-groups unmanaged create wsfc-group-1 --zone $REGION-a
    gcloud compute instance-groups unmanaged add-instances wsfc-group-1 --zone $REGION-a \
      --instances node-1
    
    gcloud compute instance-groups unmanaged create wsfc-group-2 --zone $REGION-b
    gcloud compute instance-groups unmanaged add-instances wsfc-group-2 --zone $REGION-b \
      --instances 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,该端口先前已配置为可用性组侦听器的 ProbePort

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

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

    gcloud compute forwarding-rules create wsfc-sql \
      --load-balancing-scheme internal \
      --address $LOADBALANCER_ADDRESS \
      --ports 1433 \
      --network $VPC_NAME \
      --subnet $SUBNET_NAME \
      --region $REGION \
      --backend-service wsfc-backend
    

您现在可以使用内部负载均衡器和 DNS 名称 bookshelf 连接到 SQL Server 可用性组侦听器。

要在单个故障切换集群上创建多个可用性组,您必须使用单独的负载均衡器,每个可用性组都有自己的健康检查。这意味着,对于每个可用性组,您需要以下项:

  1. 一个用于监听器和内部负载均衡器的预留内部 IP 地址(每个可用性组一个)。

  2. 一个单独的负载均衡器(每个可用性组一个),并且在上一步中预留了自己的 IP 地址。

  3. 单独的探测端口(例如每个可用性组的 59997、59998 和 59999)和防火墙规则,以允许这些探测端口上的流量。

  4. 一条使用各自探测端口的每个可用性组的单独健康检查规则。

为可用性组配置 DNN 监听器

与内部负载均衡配置类似,DNN 监听器充当 SQL Server 客户端的单个端点。

  1. 返回 node-1 上的 PowerShell 会话。
  2. 执行以下脚本以创建 DNN 监听器。

      $Ag='bookshelf-ag'
      $Port='DNN_PORT'
      $Dns='DNN_NAME'
    
      # create the DNN resource with the port as the resource name
      Add-ClusterResource -Name $Port -ResourceType "Distributed Network Name" -Group $Ag
    
      # set the DNS name of the DNN resource
      Get-ClusterResource -Name $Port | Set-ClusterParameter -Name DnsName -Value $Dns
    
      # start the DNN resource
      Start-ClusterResource -Name $Port
    
      # add the Dependency from availability group resource to the DNN resource
      Set-ClusterResourceDependency -Resource $Ag -Dependency "[$Port]"
    
      #bounce the AG resource
      Stop-ClusterResource -Name $Ag
      Start-ClusterResource -Name $Ag
    

    DNN_PORT 替换为 DNN 监听器端口。DNN 监听器端口必须配置一个唯一端口。如需了解详情,请参阅端口注意事项

    DNN_NAME 替换为 DNN 监听器名称。

  3. node-1node-2 上为 DNN 监听器端口创建防火墙规则。

      netsh advfirewall firewall add rule name="Allow DNN listener" dir=in action=allow protocol=TCP localport=DNN_PORT
    

测试故障转移

您现在可以测试故障切换是否按预期工作:

  1. 返回 witness 上的 PowerShell 会话。
  2. 运行以下脚本:

    while ($True){
      $Conn = New-Object System.Data.SqlClient.SqlConnection
      $Conn.ConnectionString = "Server=LISTENER;Integrated Security=true;Initial Catalog=master"
      $Conn.Open()
    
      $Cmd = New-Object System.Data.SqlClient.SqlCommand
      $Cmd.Connection = $Conn
      $Cmd.CommandText = "SELECT @@SERVERNAME"
    
      $Adapter = New-Object System.Data.SqlClient.SqlDataAdapter $Cmd
      $Data = New-Object System.Data.DataSet
      $Adapter.Fill($Data) | Out-Null
      $Data.Tables[0] + (Get-Date -Format "MM/dd/yyyy HH:mm:ss")
    
      Start-Sleep -Seconds 2
    }
    

    LISTENER 替换为监听器 DNS 名称或 DNN 监听器以及可用性组的端口。

    该脚本每两秒使用可用性组监听器或 DNN 监听器连接到 SQL Server 一次,并查询服务器名称。

    让该脚本保持运行。

  3. 返回到 node-1 上的远程桌面会话以触发故障切换:

    1. SQL Server Management Studio 中,依次点击 AlwaysOn High Availability > Availability Groups > bookshelf-ag (Primary),然后右键点击节点。
    2. 选择故障切换
    3. 选择新的主副本页面上,验证 node-2 是否被选为新的主副本,并且故障切换就绪列是否表示 No data loss。然后选择下一步
    4. 连接到副本页面上,选择连接
    5. 连接到服务器对话框中,验证服务器名称是否为 node-2,然后点击连接
    6. 选择下一步,然后选择完成
    7. 结果页面上,验证故障切换是否成功。
  4. 返回 witness 上的 PowerShell 会话。

  5. 观察正在运行的脚本的输出,并注意服务器名称因故障切换从 node-1 更改为 node-2

  6. Ctrl+C 停止该脚本。

清理

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

删除项目

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

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

  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.

后续步骤