通过 Microsoft SQL Server AlwaysOn 可用性组 (AG),您可以跨多个 SQL Server Enterprise 实例复制数据库。
与 SQL Server 故障切换集群实例类似,AlwaysOn 可用性组使用 Windows Server 故障切换集群 (WSFC) 来实现高可用性。但这两种功能在以下方面有所不同:
AlwaysOn 可用性组 | 故障切换集群实例 | |
---|---|---|
故障切换的范围 | 数据库组 | 实例 |
存储 | 未共享 | 已共享 |
如需详细了解比较,请参阅故障切换集群实例与可用性组的比较。
AlwaysOn 可用性组支持多种可用性模式。本教程介绍如何在同步提交模式中部署 AlwaysOn 可用性组,以便为一个或多个数据库实现高可用性。
在设置过程中,您将创建三个虚拟机实例。node-1
和 node-2
两个虚拟机实例可充当 WSFC 节点并运行 SQL Server。第三个虚拟机实例 witness
用于在故障切换情景中实现仲裁。三个虚拟机实例分布在三个可用区,并且共享一个子网。
使用 SQL Server AlwaysOn 可用性组,您可以跨两个 SQL Server 实例同步复制示例数据库 bookshelf
。
在本地环境中,如果发生故障切换,您可以让 WSFC 执行 ARP 通知,以通知网络设备某个 IP 地址发生了变化。但是,Google Cloud 会忽略 ARP 通知。因此,您必须实现以下两个选项之一:
- 内部负载均衡器。如需了解详情,请参阅运行 Windows Server 故障切换集群。
- 分布式网络名称 (DNN)。如需了解详情,请参阅为可用性组配置 DNN 监听器。
本文假定您已在 Google Cloud 上部署了 Active Directory,而且您已基本掌握 SQL Server、Active Directory 和 Compute Engine。
目标
- 部署由两个 SQL Server 虚拟机实例和第三个虚拟机实例(充当文件共享见证者)组成的 WSFC。
- 创建具有同步提交功能的可用性组。
- 配置负载均衡器或分布式网络名称 (DNN),以使用 SQL Server 将流量路由到可用性组。
- 通过模拟故障切换来验证设置是否正常工作。
费用
本教程使用 Google Cloud 的计费组件,包括:
- Compute Engine
- Cloud Load Balancing(使用 DNN 配置时不需要)
您可使用价格计算器根据您的预计使用情况来估算费用。
准备工作
如需完成本指南,您需要以下各项:
- 至少具有一台网域控制器的 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 项目:
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
完成本教程后,您可以删除所创建的资源以避免继续计费。如需了解详情,请参阅清理。
准备项目和网络
如需准备 Google Cloud 项目和 VPC 以部署 SQL Server AlwaysOn 可用性组,请执行以下操作:
在 Google Cloud 控制台中,点击激活 Cloud Shell 按钮,以打开 Cloud Shell。
初始化以下变量:
VPC_NAME=
VPC_NAME
SUBNET_NAME=SUBNET_NAME
其中:
VPC_NAME
:您的 VPC 的名称SUBNET_NAME
:您的子网的名称
设置默认项目 ID:
gcloud config set project
PROJECT_ID
将
PROJECT_ID
替换为您的 Google Cloud 项目的 ID。设置默认区域:
gcloud config set compute/region
REGION
将
REGION
替换为要在其中部署的区域的 ID。
创建防火墙规则
如需允许客户端连接到 SQL Server,允许在 WSFC 节点之间进行通信,并使负载均衡器能够执行健康检查,您需要创建多个防火墙规则。如需简化这些防火墙规则的创建操作,您可以使用网络标记:
- 2 个 WSFC 节点由
wsfc-node
标记注释。 - 所有服务器(包括见证者)均由
wsfc
标记注释。
创建使用这些网络标记的防火墙规则:
- 返回到现有的 Cloud Shell 会话。
为 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
创建一条允许来自 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 高级映像。
为了在故障切换情景中提供决定性投票权,实现仲裁,您需要部署第三个虚拟机作为文件共享见证者。
- 返回到现有的 Cloud Shell 会话。
为 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
创建虚拟机实例。在充当 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"
若要将 3 个虚拟机实例加入 Active Directory,请对 3 个虚拟机实例中的每个实例执行以下操作:
通过查看虚拟机的串行端口输出来监控其初始化过程:
gcloud compute instances tail-serial-port-output
NAME
将
NAME
替换为虚拟机实例的名称。等待大约 3 分钟,直到您看到输出
Instance setup finished
,然后按 Ctrl+C。此时,该虚拟机实例已准备就绪,可以使用了。为虚拟机实例创建用户名和密码
使用远程桌面连接到虚拟机,然后使用上一步中创建的用户名和密码登录。
右键点击开始按钮(或者按 Win+X),然后点击 Windows PowerShell(管理员)。
点击是以确认提升权限提示。
将该计算机加入您的 Active Directory 域,然后重启:
Add-Computer -Domain
DOMAIN -Restart
将
DOMAIN
替换为您的 Active Directory 域的 DNS 名称。等待重启过程完成,大约需要 1 分钟。
预留集群 IP 地址
现在,您需要在 VPC 中预留两个静态 IP 地址。一个 IP 地址用作 WSFC 集群 IP 地址,另一个地址由内部负载均衡器使用。
预留一个用作集群 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 地址,稍后您将用到它。
为内部负载均衡器预留另一个静态 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 创建一个新用户账户:
- 使用远程桌面连接到
node-1
。 使用您的网域用户账号登录。 - 右键点击开始按钮(或者按 Win+X),然后点击 Windows PowerShell(管理员)。
- 点击是以确认提升权限提示。
为 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-1
和 node-2
执行以下步骤:
右键点击开始按钮(或者按 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
打开 SQL Server 配置管理器。
在导航窗格中,选择 SQL Server 服务
在服务列表中,右键点击 SQL Server (MSSQLSERVER),然后选择属性。
在登录身份下,更改账号:
- 账号名称:
DOMAIN\sql_server
,其中DOMAIN
是 Active Directory 域的 NetBIOS 名称。 - 密码:输入您之前选择的密码。
- 账号名称:
点击确定。
当系统提示您重启 SQL Server 时,请选择是。
SQL Server 现在在网域用户账号下运行。
正在创建文件共享
在 witness
上创建两个文件共享,以便虚拟机实例可以存储 SQL Server 备份并充当文件共享见证:
- 使用远程桌面连接到
witness
。 使用您的网域用户账号登录。 - 右键点击开始按钮(或者按 Win+X),然后点击 Windows PowerShell(管理员)。
- 点击是以确认提升权限提示。
创建一个见证文件共享并授予自己和两个 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$
创建另一个文件共享存储备份并授予 SQL Server 完整访问权限:
New-Item "C:\Backup" –type directory New-SmbShare ` -Name Backup ` -Path "C:\Backup" ` -Description "SQL Backup" ` -FullAccess $env:USERDOMAIN\sql_server
部署 WSFC
您现在即可创建故障切换集群。
- 返回到
node-1
上远程桌面会话。 - 右键点击开始按钮(或者按 Win+X),然后点击 Windows PowerShell(管理员)。
- 点击是以确认提升权限提示。
创建新集群:
- 对于负载均衡器配置
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
返回
witness
上的 PowerShell 会话,并授予集群的虚拟机对象访问文件共享的权限:icacls C:\QWitness\ /grant 'sql-cluster$:(OI)(CI)(M)' Grant-SmbShareAccess ` -Name QWitness ` -AccountName 'sql-cluster$' ` -AccessRight Full ` -Force
返回
node-1
上的 PowerShell 会话,并将集群配置为使用witness
上的文件共享作为集群仲裁:Set-ClusterQuorum -FileShareWitness \\witness\QWitness
验证是否已成功创建集群:
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 管理单元以查看集群的健康状况。如果您使用的是代管式 AD,请将 WSFC 使用的计算机账号添加到 Cloud 服务网域加入账号组,以便它可以将计算机加入网域:
Add-ADGroupMember ` -Identity "Cloud Service Domain Join Accounts" ` -Members sql-cluster$
在两个节点上启用 AlwaysOn 可用性组:
Enable-SqlAlwaysOn -ServerInstance node-1 -Force Enable-SqlAlwaysOn -ServerInstance node-2 -Force
正在创建可用性组
您现在可以创建一个示例数据库 bookshelf
,将其包含在名为 bookshelf-ag
的新可用性组中,并配置高可用性。
创建数据库
创建一个新数据库。就本教程而言,数据库不需要包含任何数据。
- 返回到
node-1
上远程桌面会话。 - 打开 SQL Server Management Studio。
- 在连接到服务器对话框中,验证服务器名称是否设置为
NODE-1
,然后选择连接。 - 在菜单中,依次选择文件 > 新建 > 使用当前连接查询。
将以下 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
。选择执行以运行 SQL 脚本。
配置高可用性
- 在 Object Explorer 窗口中,右键点击 AlwaysOn High Availability,然后选择 New Availability Group Wizard。
- 在指定选项页面上,将可用性组名称设置为
bookshelf-ag
,然后选择下一步。 - 在选择数据库页面上,选择
bookshelf
数据库,然后选择下一步。 在指定副本页面上,选择副本标签页:
- 选择添加副本。
在连接到服务器对话框中,输入服务器名称
node-2
,然后选择连接。可用性副本列表现在包含 SQL Server 实例、
node-1
和node-2
。将两个实例的可用性模式设置为同步提交。
将两个实例的自动故障切换设置为启用。
选择 Listener 标签页 **
- 选择创建可用性组侦听器
输入以下设置:
- 侦听器 DNS 名称:
bookshelf
- 端口:
1433
- 网络模式:静态 IP
- 侦听器 DNS 名称:
选择添加,然后输入您之前创建的负载均衡器 IP 地址。然后选择确定。
选择下一步。
在选择数据同步页面上,选择自动进行种子设定。
在验证页面上,验证所有检查是否都已成功。
在摘要页面上,选择完成。
在结果页面上,选择关闭。
配置健康检查
在最后一步中,配置集群以公开可供内部负载均衡器使用的健康检查端点:
- 返回
node-1
上的 PowerShell 会话。 使用负载均衡器的 IP 地址初始化变量。
$LoadBalancerIP = '
IP_ADDRESS
'将
IP_ADDRESS
替换为您之前预留的wsfc
地址的 IP 地址。配置故障切换集群以响应健康检查服务:
$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; }
重启集群资源:
$SqlIpAddress | Stop-ClusterResource $SqlIpAddress | Start-ClusterResource
创建内部负载均衡器
如需为 SQL Server 客户端提供单个端点,您现在需要部署内部负载均衡器,该负载均衡器会使用健康检查来确保流量定向到 WSFC 的活跃节点。
- 返回到现有的 Cloud Shell 会话。
创建两个非代管式实例组(每个可用区一个),并将这两个节点添加到组中:
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
创建健康检查,负载均衡器用其确定哪一个是活动节点。
gcloud compute health-checks create tcp wsfc-healthcheck \ --check-interval="2s" \ --healthy-threshold=1 \ --unhealthy-threshold=2 \ --port=59997 \ --timeout="1s"
健康检查探测端口
59997
,该端口先前已配置为可用性组侦听器的ProbePort
。创建后端服务并添加两个实例组:
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
创建内部负载均衡器:
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 可用性组侦听器。
要在单个故障切换集群上创建多个可用性组,您必须使用单独的负载均衡器,每个可用性组都有自己的健康检查。这意味着,对于每个可用性组,您需要以下项:
一个用于监听器和内部负载均衡器的预留内部 IP 地址(每个可用性组一个)。
一个单独的负载均衡器(每个可用性组一个),并且在上一步中预留了自己的 IP 地址。
单独的探测端口(例如每个可用性组的 59997、59998 和 59999)和防火墙规则,以允许这些探测端口上的流量。
一条使用各自探测端口的每个可用性组的单独健康检查规则。
为可用性组配置 DNN 监听器
与内部负载均衡配置类似,DNN 监听器充当 SQL Server 客户端的单个端点。
- 返回
node-1
上的 PowerShell 会话。 执行以下脚本以创建 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 监听器名称。在
node-1
和node-2
上为 DNN 监听器端口创建防火墙规则。netsh advfirewall firewall add rule name="Allow DNN listener" dir=in action=allow protocol=TCP localport=
DNN_PORT
测试故障转移
您现在可以测试故障切换是否按预期工作:
- 返回
witness
上的 PowerShell 会话。 运行以下脚本:
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 一次,并查询服务器名称。
让该脚本保持运行。
返回到
node-1
上的远程桌面会话以触发故障切换:- 在 SQL Server Management Studio 中,依次点击 AlwaysOn High Availability > Availability Groups > bookshelf-ag (Primary),然后右键点击节点。
- 选择故障切换。
- 在选择新的主副本页面上,验证
node-2
是否被选为新的主副本,并且故障切换就绪列是否表示No data loss
。然后选择下一步。 - 在连接到副本页面上,选择连接。
- 在连接到服务器对话框中,验证服务器名称是否为
node-2
,然后点击连接。 - 选择下一步,然后选择完成。
- 在结果页面上,验证故障切换是否成功。
返回
witness
上的 PowerShell 会话。观察正在运行的脚本的输出,并注意服务器名称因故障切换从
node-1
更改为node-2
。按
Ctrl+C
停止该脚本。
清理
完成本教程后,您可以清理您创建的资源,让它们停止使用配额,以免产生费用。以下部分介绍如何删除或关闭这些资源。
删除项目
为了避免产生费用,最简单的方法是删除您为本教程创建的项目。
如需删除项目,请执行以下操作:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.