通过 Microsoft SQL Server Always On 可用性组,您可以跨多个 SQL Server Enterprise 实例复制数据库。
与 SQL Server 故障切换集群实例类似,Always On 可用性组使用 Windows Server 故障切换集群 (WSFC) 来实现高可用性。不过,这两种功能在以下方面有所不同:
| Always On 可用性组 | 故障切换集群实例 | |
|---|---|---|
| 故障切换的范围 | 数据库组 | 实例 | 
| 存储 | 未共享 | 已共享 | 
如需详细了解比较,请参阅故障切换集群实例与可用性组的比较。
Always On 可用性组支持多种可用性模式。本教程介绍如何在同步提交模式中部署 Always On 可用性组,以便为一个或多个数据库实现高可用性。
在设置过程中,您将创建三个虚拟机实例。node-1 和 node-2 两个虚拟机实例可充当集群节点并运行 SQL Server。第三个虚拟机实例 witness 用于在故障切换情景中实现仲裁。三个虚拟机实例分布在三个区域,并且共享一个子网。
使用 SQL Server Always On 可用性组,您可以跨两个 SQL Server 实例同步复制示例数据库 bookshelf。
在本地 Windows 集群环境中,地址解析协议 (ARP) 通知会触发 IP 地址故障切换。但是,Google Cloud会忽略 ARP 通知。因此,您必须实现以下两个选项之一:使用内部负载均衡器和分布式网络名称 (DNN)。
本文假定您已在 Google Cloud上部署了 Active Directory,并具备 SQL Server、Active Directory 和 Compute Engine 的基本知识。如需详细了解 Google Cloud上的 Active Directory,请参阅准备工作部分。
使用 SQL Server Always On 可用性组,您可以跨两个 SQL Server 实例同步复制示例数据库 bookshelf。集群前面的分布式网络名称 (DNN) 监听器为 SQL Server 客户端提供单个端点。
如需详细了解 DNN,请参阅为可用性组配置 DNN 监听器。
该图包含以下部分:
- 两个名为 node-1和node-2的虚拟机实例位于同一区域的不同区域,用于组成故障切换集群。其中一个节点托管 SQL Server 数据库的主副本,而另一个节点托管辅助副本。
- 第三个名为 witness的虚拟机充当文件共享见证,以提供决定性投票权,实现仲裁,并实现故障切换所需的仲裁人数。
- 集群前端的 DNN 监听器为 SQL Server 客户端提供单个端点。
准备项目和网络
如需部署 SQL Server Always On 可用性组,您必须为部署准备Google Cloud 项目和 VPC。以下部分详细介绍了如何执行此操作。
配置项目和区域
如需准备 Google Cloud 项目以部署 SQL Server Always On 可用性组,请执行以下操作:
- 在 Google Cloud 控制台中,点击激活 Cloud Shell - 按钮,以打开 Cloud Shell。 
- 初始化以下变量。 - VPC_NAME= - VPC_NAMESUBNET_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-node标记进行了注释。
- 所有服务器(包括 witness)均使用wsfc标记进行了注解。
如需创建使用这些网络标记的防火墙规则,请按以下步骤操作:
- 返回到现有的 Cloud Shell 会话。
- 创建防火墙规则以允许在集群节点之间传递流量。 - 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
创建虚拟机实例
为故障切换集群创建并部署两个虚拟机实例。在任意时间点,其中一个虚拟机托管 SQL Server 数据库的主副本,而另一个节点托管辅助副本。这两个虚拟机实例必须:
- 安装了故障切换集群和 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 WSFC health check" dir=in action=allow protocol=TCP localport=59998 # 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 
- 创建虚拟机实例。在充当集群节点的两个虚拟机上,挂接一个额外的数据磁盘,并将元数据键 - enable-wsfc设置为- true,以启用 Windows Server 故障切换集群:- REGION=$(gcloud config get-value compute/region) ZONE1= - ZONE1ZONE2=- ZONE2ZONE3=- ZONE3PD_SIZE=200 MACHINE_TYPE=n2-standard-8 gcloud compute instances create node-1 \ --zone $ZONE1 \ --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 $ZONE2 \ --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 $ZONE3 \ --machine-type e2-medium \ --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"- 根据您使用的区域替换 ZONE1、ZONE2、ZONE3。 
- 如需将三个虚拟机实例加入 Active Directory,请对三个虚拟机实例中的每个实例执行以下操作: - 通过查看虚拟机的串行端口输出来监控其初始化过程。 - gcloud compute instances tail-serial-port-output - NAME- 将 - NAME替换为虚拟机实例的名称。- 等待几分钟,直到您看到输出 - Instance setup finished,然后按 Ctrl+C。此时,该虚拟机实例已准备就绪,可以使用了。
- 为虚拟机实例创建用户名和密码。 
- 使用远程桌面连接到虚拟机,然后使用上一步中创建的用户名和密码登录。 
- 右键点击开始按钮(或者按 Win+X),然后点击 Windows PowerShell(管理员)。 
- 点击是以确认提升权限提示。 
- 将该计算机加入您的 Active Directory 网域,然后重启。 - Add-Computer -Domain - DOMAIN -Restart- 将 - DOMAIN替换为您的 Active Directory 域的 DNS 名称。
- 输入具有将虚拟机加入网域所需权限的账号凭证 - 等待虚拟机重启。现在,您已将虚拟机实例加入到 Active Directory。 
 
部署故障切换集群
您现在可以使用虚拟机实例部署 Windows Server 故障切换集群和 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 执行以下步骤:
- 打开 SQL Server 配置管理器。
- 在导航窗格中,选择 SQL Server 服务。
- 在服务列表中,右键点击 SQL Server (MSSQLSERVER),然后选择属性。
- 在登录身份下,如下所示更改账号: - 账号名称:DOMAIN\sql_server,其中DOMAIN是 Active Directory 域的 NetBIOS 名称。
- 密码:输入您之前选择的密码。
 
- 账号名称:
- 点击确定。 
- 当系统提示您重启 SQL Server 时,请选择是。 
SQL Server 现在在网域用户账号下运行。
<0x创建文件共享
在虚拟机实例 witness 上创建两个文件共享,以便它可以存储 SQL Server 备份并充当文件共享见证:
- 使用远程桌面连接到 witness。使用您的网域用户账号登录。
- 右键点击开始按钮(或者按 Win+X),然后点击 Windows PowerShell(管理员)。
- 点击是以确认提升权限提示。
- 创建一个见证文件共享并授予自己和两个集群节点对该文件共享的访问权限。 - 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 
创建故障切换集群
如需创建故障切换集群,请按以下步骤操作:
- 返回到 node-1上远程桌面会话。
- 右键点击开始按钮(或者按 Win+X),然后点击 Windows PowerShell(管理员)。
- 点击是以确认提升权限提示。
- 创建新集群。 - 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,请将 Windows 集群使用的计算机账号添加到 Cloud 服务网域加入账号群组,以便它可以将计算机加入网域。 - Add-ADGroupMember ` -Identity "Cloud Service Domain Join Accounts" ` -Members sql-cluster$ 
- 在两个节点上启用 Always On 可用性组。 - 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 脚本。 
配置高可用性
现在,您可以使用 T-SQL 或 Server Management Studio 为可用性组配置高可用性。
使用 T-SQL
如需使用 T-SQL 为可用性组配置高可用性,请执行以下步骤:
- 连接到 - node-1,然后执行以下脚本以创建- bookshelf-ag可用性组。- CREATE LOGIN [ - NET_DOMAIN\sql_server] FROM WINDOWS; GO USE [bookshelf]; CREATE USER [- NET_DOMAIN\sql_server] FOR LOGIN [- NET_DOMAIN\sql_server]; GO USE [master]; CREATE ENDPOINT bookshelf_endpoint STATE=STARTED AS TCP (LISTENER_PORT=5022) FOR DATABASE_MIRRORING (ROLE=ALL); GO GRANT CONNECT ON ENDPOINT::[bookshelf_endpoint] TO [- NET_DOMAIN\sql_server] GO
- 连接到 - node-2并执行以下脚本。- CREATE LOGIN [ - NET_DOMAIN\sql_server] FROM WINDOWS; GO CREATE ENDPOINT bookshelf_endpoint STATE=STARTED AS TCP (LISTENER_PORT=5022) FOR DATABASE_MIRRORING (ROLE=ALL); GO GRANT CONNECT ON ENDPOINT::[bookshelf_endpoint] TO [- NET_DOMAIN\sql_server] GO
- 在 - node-1上,然后执行以下脚本以创建- bookshelf-ag可用性组。- USE master; GO CREATE AVAILABILITY GROUP [bookshelf-ag] WITH (AUTOMATED_BACKUP_PREFERENCE = SECONDARY, CLUSTER_TYPE = WSFC, DB_FAILOVER = ON ) FOR DATABASE [bookshelf] REPLICA ON N'node-1' WITH ( ENDPOINT_URL = 'TCP://node-1:5022', AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, FAILOVER_MODE = AUTOMATIC, BACKUP_PRIORITY = 50, SEEDING_MODE = AUTOMATIC, SECONDARY_ROLE(ALLOW_CONNECTIONS = NO) ), N'node-2' WITH ( ENDPOINT_URL = 'TCP://node-2:5022', AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, FAILOVER_MODE = AUTOMATIC, BACKUP_PRIORITY = 50, SEEDING_MODE = AUTOMATIC, SECONDARY_ROLE(ALLOW_CONNECTIONS = NO) ); GO
- 连接到 - node-2,然后执行以下脚本以将辅助副本加入到可用性组并启用自动播种。- USE master; GO ALTER AVAILABILITY GROUP [bookshelf-ag] JOIN; ALTER AVAILABILITY GROUP [bookshelf-ag] GRANT CREATE ANY DATABASE; 
- 检查可用性组的状态。 - SELECT * FROM sys.dm_hadr_availability_group_states; GO - 您应该会看到 - synchronization_health_desc显示为- HEALTHY。
使用 SQL Server Management Studio
如需使用 SQL Server Management Studio 为可用性组配置高可用性,请按以下步骤操作:
- 在对象资源管理器窗口中,右键点击 Always On 高可用性,然后选择新建可用性组向导。
- 在指定选项页面上,将可用性组名称设置为 bookshelf-ag,然后选择下一步。
- 在选择数据库页面上,选择 bookshelf数据库,然后选择下一步。
- 在指定副本页面上,选择副本标签页。 - 选择添加副本。
- 在连接到服务器对话框中,输入服务器名称 - node-2,然后选择连接。- 可用性副本列表现在包含 SQL Server 实例、 - node-1和- node-2。
- 将两个实例的可用性模式设置为同步提交。 
- 将两个实例的自动故障切换设置为启用。 
- 选择下一步。 
 
- 在选择数据同步页面上,选择自动进行种子设定。 
- 在验证页面上,验证所有检查是否都已成功。您可以忽略可用性组监听器检查。 
- 在摘要页面上,选择完成。 
- 在结果页面上,选择关闭。 
为可用性组配置 DNN 监听器
DNN 监听器充当 SQL Server 客户端的单个端点。如需配置 DNN 监听器,请按照以下步骤操作:
- 返回 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]" # restart the availability group 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=- DNN_NAME,- DNN_PORT;Integrated Security=true;Initial Catalog=master" $Conn.Open() $Cmd = New-Object System.Data.SqlClient.SqlCommand $Cmd.Connection = $Conn $Cmd.CommandText = "SELECT SERVERPROPERTY('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 }- 将 - DNN_NAME替换为 DNN 监听器名称,将- DNN_PORT替换为 DNN 监听器端口。- 该脚本每两秒使用可用性组侦听器连接到 SQL Server 一次,并查询服务器名称。 - 让该脚本保持运行。 
- 返回到 - node-1上的远程桌面会话以触发故障切换。- 在 SQL Server Management Studio 中,转到 Always On > 高可用性 > 可用性组 > bookshelf-ag(主要),然后右键点击节点。
- 选择故障切换。
- 在选择新的主副本页面上,验证 node-2是否被选为新的主副本,并且故障切换就绪列是否表示No data loss。然后选择下一步。
- 在连接到副本页面上,选择连接。
- 在连接到服务器对话框中,验证服务器名称是否为 node-2,然后点击连接。
- 选择下一步,然后选择完成。
- 在结果页面上,验证故障切换是否成功。
 
- 返回 - witness上的 PowerShell 会话。
- 观察正在运行的脚本的输出,并注意服务器名称因故障切换从 - node-1更改为- node-2。
- 按 - Ctrl+C停止该脚本。