通过 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。 内部负载均衡器可确保流量定向到活动节点。
如需详细了解带有内部负载均衡器的 Windows Server 故障切换集群,请参阅故障切换集群。
该图包含以下部分:
- 两个名为 node-1和node-2的虚拟机实例位于同一区域的不同区域,用于组成故障切换集群。其中一个节点托管 SQL Server 数据库的主副本,而另一个节点托管辅助副本。
- 第三个名为 witness的虚拟机充当文件共享见证,用于提供决定性投票,实现故障切换所需的仲裁机制。
- 集群前的内部负载均衡器为 SQL Server 客户端提供统一端点,并通过健康检查确保流量定向至活动节点。
目标
本教程旨在实现以下目标:
费用
本教程使用 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. Roles required to select or create a project - Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
- 
      Create a project: To create a project, you need the Project Creator
      (roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
 
- 
  
    Verify 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. Roles required to select or create a project - Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
- 
      Create a project: To create a project, you need the Project Creator
      (roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
 
- 
  
    Verify that billing is enabled for your Google Cloud project. 
- 您拥有一个 Active Directory 域,其中至少包含一台域控制器。您可以使用托管式 Microsoft AD 创建 Active Directory 域。或者,您也可以在 Compute Engine 上部署自定义 Active Directory 环境,并设置专用 DNS 转发区域,用于将 DNS 查询转发到您的域控制器。
- 
    您拥有一个 Active Directory 用户,该用户有权将计算机加入网域并且能够使用 RDP 登录。如果您使用的是托管式 Microsoft AD,则可以使用 setupadmin用户。如需详细了解 Active Directory 用户账号配置,请参阅 Active Directory 用户账号配置
- 连接到您的 Active Directory 域控制器的 Google Cloud 项目和虚拟私有云 (VPC)。
- 用于 Windows 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 数据库的主副本,而另一个节点托管辅助副本。这两个虚拟机实例必须:
- 位于同一区域,以便通过内部直通式网络负载均衡器访问。
- 安装了 Windows 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。 
 
预留静态 IP 地址
现在,您需要在 VPC 中预留两个静态 IP 地址。一个 IP 地址用作默认 WSFC 集群 IP 地址,另一个 IP 地址用作 SQL Server 可用性组监听器的静态 IP 地址。
在 WSFC 集群中,集群 IP 地址主要用于管理和访问集群资源。此虚拟 IP 地址分配给集群本身,使管理员能够管理集群并执行任务,例如配置集群设置、监控节点健康状况,以及管理故障切换流程。
在 SQL Server 可用性组的上下文中,监听器是虚拟网络名称 (VNN) 和 IP 地址,可让客户端连接到可用性组,而无需知道哪个特定服务器是主节点。
内部负载均衡器需要一个内部 IP 地址,以便在 WSFC 集群的上下文中高效地路由内部流量并支持高可用性和负载均衡。内部负载均衡器可确保始终将请求定向至集群的当前主节点。在故障切换期间,负载均衡器会检测主节点变化,并将客户端连接重定向至新的主节点,无需人工干预,从而最大程度减少停机时间并确保数据库服务持续可用。
在 WSFC 与 SQL Server Always On 可用性组的上下文中,预留的内部静态 IP 地址(用于默认 WSFC 集群 IP 地址)和可用性组监听器也由关联的内部负载均衡器使用。
- 如需在 VPC 中预留两个静态 IP 地址,请按以下步骤操作。 - gcloud compute addresses create wsfc-cluster-ip \ --subnet $SUBNET_NAME \ --region $(gcloud config get-value compute/region) && \ CLUSTER_IP=$(gcloud compute addresses describe wsfc-cluster-ip \ --region $(gcloud config get-value compute/region) \ --format=value\(address\)) && \ echo "cluster IP: $CLUSTER_IP"
- 将 - CLUSTER_IP变量中的集群 IP 地址替换为目标地址,稍后您将需要将其指定为集群 IP:- CLUSTER_IP= - CLUSTER_IP
- 为可用性组监听器预留另一个静态 IP,并在名为 - LISTENER_IP的新环境变量中捕获该地址。- gcloud compute addresses create wsfc-listener-ip \ --subnet $SUBNET_NAME \ --region $(gcloud config get-value compute/region) LISTENER_IP=$(gcloud compute addresses describe wsfc-listener-ip \ --region $(gcloud config get-value compute/region) \ --format=value\(address\)) && \ echo "Listener IP: $LISTENER_IP" 
- 将负载均衡器的预留 IP 地址指定为 - LISTENER_IP变量,稍后您将使用该变量配置可用性组。- LISTENER_IP= - LISTENER_IP
您的项目和 VPC 现在已准备好部署 Windows Server 故障切换集群和 SQL Server。
部署故障切换集群
您现在可以使用虚拟机实例部署 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 现在在网域用户账号下运行。
创建文件共享
在虚拟机实例 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 ` -StaticAddress - CLUSTER_IP- 将 - CLUSTER_IP替换为您之前创建的集群 IP 地址。
- 返回 - 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 Service Domain Join Accounts”组,以便它可以将计算机加入网域。 - 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 或 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
- 在以下脚本中,将 - LISTENER_IP替换为您之前为内部负载均衡器预留的 IP 地址,然后执行该脚本。- USE master; GO ALTER AVAILABILITY GROUP [bookshelf-ag] ADD LISTENER N'bookshelf' ( WITH IP ( (N' - LISTENER_IP
- 连接到 - 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。
- 将两个实例的可用性模式设置为同步提交。 
- 将两个实例的自动故障切换设置为启用。 
- 选择侦听器标签页 - 选择创建可用性组监听器。
- 输入以下设置。 - 侦听器 DNS 名称:bookshelf
- 端口:1433
- 网络模式:静态 IP
 
- 侦听器 DNS 名称:
- 选择添加,然后输入您之前为内部负载均衡器预留的监听器 IP 地址 ( - LISTENER_IP
 
- 选择下一步。 
 
- 在选择数据同步页面上,选择自动进行种子设定。 
- 在验证页面上,验证所有检查是否都已成功。 
- 在摘要页面上,选择完成。 
- 在结果页面上,选择关闭。 
创建内部负载均衡器和健康检查
集群 IP 表示 Windows 故障切换集群的单一端点。您可以将其用于集群资源管理和运维操作。集群 IP 始终指向集群的主节点(或主机节点)。您部署的内部负载均衡器会使用健康检查来确保流量定向到集群的主机节点。由于 WSFC 工具需要多个协议(ICMP、UDP 和 TCP)用于转发,因此我们建议部署使用支持所有端口的多协议内部负载均衡器。
如需部署内部负载均衡器,请按以下步骤操作:
- 返回到现有的 Cloud Shell 会话。
- 创建两个非托管式实例组(每个区域一个),并将这两个节点添加到组中。 - REGION=$(gcloud config get-value compute/region) gcloud compute instance-groups unmanaged create wsfc-group-1 --zone $ZONE1 gcloud compute instance-groups unmanaged add-instances wsfc-group-1 --zone $ZONE1 \ --instances node-1 gcloud compute instance-groups unmanaged create wsfc-group-2 --zone $ZONE2 gcloud compute instance-groups unmanaged add-instances wsfc-group-2 --zone $ZONE2 \ --instances node-2 
- 为集群 IP 地址创建健康检查,负载均衡器可以使用该健康检查从 Windows 集群的角度确定哪个是活动节点。Compute Engine 客机代理响应健康检查的默认端口为 - 59998。健康检查会在请求中提供集群 IP 地址,并期望活跃节点返回 1 作为响应。- gcloud compute health-checks create tcp wsfc-healthcheck \ --request=$CLUSTER_IP \ --response=1 \ --check-interval="2s" \ --healthy-threshold=2 \ --unhealthy-threshold=2 \ --port=59998 \ --timeout="1s" 
- 创建后端服务并添加两个现有实例组。 - gcloud compute backend-services create wsfc-backend \ --load-balancing-scheme internal \ --region $REGION \ --health-checks wsfc-healthcheck \ --protocol UNSPECIFIED gcloud compute backend-services add-backend wsfc-backend \ --instance-group wsfc-group-1 \ --instance-group-zone $ZONE1 \ --region $REGION gcloud compute backend-services add-backend wsfc-backend \ --instance-group wsfc-group-2 \ --instance-group-zone $ZONE2 \ --region $REGION 
- 创建与集群 IP 关联的内部负载均衡器。 - gcloud compute forwarding-rules create wsfc \ --load-balancing-scheme internal \ --address $CLUSTER_IP \ --ports ALL \ --network $VPC_NAME \ --subnet $SUBNET_NAME \ --region $REGION \ --ip-protocol L3_DEFAULT \ --backend-service wsfc-backend 
如需为希望连接到 bookshelf 可用性组中的任何数据库的 SQL Server 客户端提供单一端点,请部署专用于该可用性组的新内部负载均衡器,并按照以下步骤操作:
- 为可用性组侦听器创建健康检查,负载均衡器可以使用该健康检查来确定 - bookshelfSQL Server 可用性组中的主节点。- gcloud compute health-checks create tcp wsfc-bookshelf-healthcheck \ --request=$LISTENER_IP \ --response=1 \ --check-interval="2s" \ --healthy-threshold=1 \ --unhealthy-threshold=2 \ --port=59998 \ --timeout="1s" - 健康检查使用相同的 Compute Engine 客机代理端口,但在其请求中提供 - bookshelf可用性组的监听器 IP 地址。
- 创建新的后端服务并添加两个实例组。 - gcloud compute backend-services create wsfc-bookshelf-backend \ --load-balancing-scheme internal \ --region $REGION \ --health-checks wsfc-bookshelf-healthcheck \ --protocol UNSPECIFIED gcloud compute backend-services add-backend wsfc-bookshelf-backend \ --instance-group wsfc-group-1 \ --instance-group-zone $ZONE1 \ --region $REGION gcloud compute backend-services add-backend wsfc-bookshelf-backend \ --instance-group wsfc-group-2 \ --instance-group-zone $ZONE2 \ --region $REGION 
- 创建与 SQL Server - bookshelf-ag可用性组监听器关联的内部负载均衡器。- gcloud compute forwarding-rules create wsfc-bookshelf \ --load-balancing-scheme internal \ --address $LISTENER_IP \ --ports ALL \ --network $VPC_NAME \ --subnet $SUBNET_NAME \ --region $REGION \ --ip-protocol L3_DEFAULT \ --backend-service wsfc-bookshelf-backend 
您现在可以使用书架可用性组监听器中定义的 DNS 名称 bookshelf 及其端口连接到 SQL Server 可用性组监听器。内部负载均衡器将流量定向到 bookshelf 可用性组的主节点。
要在单个故障切换集群上创建多个可用性组,您必须使用单独的后端服务和单独的负载均衡器,每个可用性组都有自己的健康检查。
每个可用性组可能都有不同的节点被指定为主节点,并且这些节点可能与 Windows 集群的主机节点不同。对于多个可用性组,您需要以下内容:
- 内部负载均衡器使用的可用性组监听器的预留静态 IP 地址。为每个可用性组预留一个地址。 
- 一条针对每个可用性组的单独健康检查规则。健康检查请求会提供可用性组监听器的静态 IP 地址(也是上一步中预留的 IP 地址)。健康检查会探测 GCE 代理返回的 - 1响应。所有健康检查都使用端口- 59998。
- 为每个可用性组创建一个单独的后端服务,并向其中添加现有的两个计算实例组。后端服务使用在上一步中定义的健康检查。 
- 为每个可用性组创建一个内部负载均衡器,用于上一步中创建的后端服务。负载均衡器与可用性组监听器静态 IP 地址相关联。 
测试故障切换
您现在可以测试故障切换是否按预期工作:
- 返回 witness上的 PowerShell 会话。
- 运行以下脚本。 - while ($True){ $Conn = New-Object System.Data.SqlClient.SqlConnection $Conn.ConnectionString = "Server=tcp:bookshelf,1433;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 }- 在本指南中,我们在服务器定义 - tcp:bookshelf,1433中为可用性组监听器使用了 DNS 名称- bookshelf和端口值- 1433。- 该脚本每两秒使用可用性组监听器连接到 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停止该脚本。
清理
完成本教程后,您可以清理您创建的资源,让它们停止使用配额,以免产生费用。以下部分介绍如何删除或关闭这些资源。
删除项目
为了避免产生费用,最简单的方法是删除您为本教程创建的项目。
要删除项目,请执行以下操作:
- 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.